From patchwork Tue Oct 17 15:49:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 116142 Delivered-To: patch@linaro.org Received: by 10.80.163.170 with SMTP id s39csp1381452edb; Tue, 17 Oct 2017 08:50:26 -0700 (PDT) X-Google-Smtp-Source: AOwi7QBM7SX+qbq0eWlRQwbGJchHehF+rp1W8MCJ2vVRwR0BvZlvEOUL65k9SUQ0HEjp0HGj7beE X-Received: by 10.98.111.71 with SMTP id k68mr10079191pfc.91.1508255426092; Tue, 17 Oct 2017 08:50:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508255426; cv=none; d=google.com; s=arc-20160816; b=V/oHJ4+XQY6JiqMfjabkUIgK+QH5FNnBy9ecrMJswk5Hpc+KkFVPuVo+wNcnfXor1p Qtw/DscANDat9oBvZbhXrn5dypOUK3cIp/wgD8UaWKxMLkDq2tVj8tOHPLaxSOMbPIZv WovNWCrpfbdBonkAC3OA9wUzE5OCu6qyCyWdSckzxLnd/jnNeQMtvlfgaGQuR9KLfxjC KmCqFAxRcUDUu0bBAzBL/FABcv9Aps7bj2IDthajSx7wClQjakpSvv817M46n0wpAH96 fUR8vvHioGNRL3w9iRRg3TPnl068Ag3fdtnucK91o0SM7OzAPEbJb+SxiLi/WowB4Cj+ dDjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=Z22kKZDrzv20QNGcq6BPYXq5dB2yttFd63467DyyaUc=; b=T1N3KFjn2ik1icLpHOv6iiiFQVgpiqwSXvI6kj1hbSD0g1HmpEwwck8nj7saMIQjK/ JPm+t8qRyVvTtpfiz7ItyxiZSbn5Gwv7kpmTb3ExOK5IqvWhTBekCDitijgWpxUQWPYJ 39fctKOu3p9ipNvJO8AALqiw09rMfG2v/KP+KgWzgNcy3/2uJVokAnUDB2POU9hVxLPe vfl9sjAvPNu1m5T69zCOnEvl6OjhsY0p62bRJayInm9sbixOYyw9t0qtV7cXnAcCTC+4 OAyw89FcmW2zx74HnWeS0QE7nNz17/3h0PJQSnkRIIh+bqbDTZArRrzG4DcOEaBo7J5Y kEmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h10si400434plt.693.2017.10.17.08.50.25; Tue, 17 Oct 2017 08:50:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936631AbdJQPuY (ORCPT + 27 others); Tue, 17 Oct 2017 11:50:24 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:53520 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756276AbdJQPuQ (ORCPT ); Tue, 17 Oct 2017 11:50:16 -0400 Received: from wuerfel.lan ([46.223.139.202]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.145]) with ESMTPA (Nemesis) id 0McFi3-1dlZhT2bW3-00JWYr; Tue, 17 Oct 2017 17:50:04 +0200 From: Arnd Bergmann To: Jeff Kirsher Cc: Arnd Bergmann , Alan Brady , Jacob Keller , Amritha Nambiar , Mitch Williams , Alexander Duyck , Filip Sadowski , "David S. Miller" , =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= , intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] [v2] i40e: avoid 64-bit division where possible Date: Tue, 17 Oct 2017 17:49:48 +0200 Message-Id: <20171017155001.318184-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:jJQ7nZmcSySy6bHGzi0hT+yP4/fsBP62qcbD1OxWlmZmKYqAYwA veRpJNc/oeZ2BjMtzySEXSutu7GM2NjLppykJOkdUjAgeFSUNs1V21UD7kXdmuZK4SbDZS+ s31L6AQdWJe3vPxRqbz6+FiUINE+2YVfE/rpQ1tYf8K7kEJhmHEDf7MDBknguIcSwgisW4e JX5nFpy7xOzo02IK/8+3A== X-UI-Out-Filterresults: notjunk:1; V01:K0:eaUV66KZutM=:Yg+h/LmH9wG8vSRU/9d4TY dBlcDW1JEUpjSmNDIoTXJm6iQ4EOyQMTdEvPtBogUROGXcSR439wH7I62cnh+61bn9x8SQ5/D xp3KbkLQ0IWsNPVpzyu8Q7p1UixLfPBmTAsEwUJU1Xckz8LppCoIS6Kcg2SLGmoRg1AtPMFON a6LtIiDDiIc98SwjIJLfK2YkaBLohS5q506SujA2VkO8PpsQ6V2jbvAYQhaf2rf8/jvkioejT 0IYG25XBZJ5XaimQqhe6icxuSijfeqB3CO53lXm2Bt0lhg/QzTMaGOuh5RaAYPA6nmP7kFvpG 27uUhrMyuU/a+V3TwFfTnx2hIpHuHnzA+xMDfEHxqCFWJezWttVpJ4b7mzXGSODKiKPM/wuQ4 zcYwBze7hhM5GsCRQQeags+9yfwgHJouYN2gIIc+P3nm3GDV+cwUjfxn4OJ68YB4tyjfzfwMY JCgd+88sjV4uvw6DDJyTcQ01UEpou9Ce//yg606hz/C0ICXvWJgnQ703oSTbIxhF7660fmzQU U24M+1rkzxsnMhdJKXrKd1xQCWIso2pSMPUfcU2aOXKSdtEFc3xJhghuOYB+8plPXk3/TrE4u CeN3Sfy/jFL9woa6AWrvOLSMQbCuykFf7ej6k1uqCP7Jx+iqq0LcvLrqpelxgCAC+2N6RGbO5 qhagDle1uaxeQIfsJcVFUWINjnyEC9sy4vBgh9IZb418m/p4ltRTnmt01Q/WYvZCuPV3AtsiR ePx/qlMaF5OQYd27gOvm4ceuQpxtcpnTeYfDmA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The new bandwidth calculation caused a link error on 32-bit architectures, like ERROR: "__aeabi_uldivmod" [drivers/net/ethernet/intel/i40e/i40e.ko] undefined! The problem is the max_tx_rate calculation that uses 64-bit integers. This is not really necessary since the numbers are in MBit/s so they won't be higher than 40000 for the highest support rate, and are guaranteed to not exceed 2^32 in future generations either. Another patch from Alan Brady fixed the link error by adding many calls to do_div(), which makes the code less efficent and less readable than necessary. This changes the representation to 'u32' when dealing with MBit/s and uses div_u64() to convert from u64 numbers in byte/s, reverting parts of Alan's earlier fix that have become obsolete now. Fixes: 2027d4deacb1 ("i40e: Add support setting TC max bandwidth rates") Fixes: 73983b5ae011 ("i40e: fix u64 division usage") Cc: Alan Brady Signed-off-by: Arnd Bergmann --- drivers/net/ethernet/intel/i40e/i40e.h | 4 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 70 +++++++++++------------------ 2 files changed, 27 insertions(+), 47 deletions(-) -- 2.9.0 Reviewed-by: Alexander Duyck diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index c3f13120f3ce..c7aa0c982273 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -407,7 +407,7 @@ struct i40e_channel { u8 enabled_tc; struct i40e_aqc_vsi_properties_data info; - u64 max_tx_rate; + u32 max_tx_rate; /* in Mbits/s */ /* track this channel belongs to which VSI */ struct i40e_vsi *parent_vsi; @@ -1101,5 +1101,5 @@ static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi) } int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch); -int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u64 max_tx_rate); +int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u32 max_tx_rate); #endif /* _I40E_H_ */ diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 3ceda140170d..57682cc78508 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -5448,17 +5448,16 @@ int i40e_get_link_speed(struct i40e_vsi *vsi) * * Helper function to set BW limit for a given VSI **/ -int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u64 max_tx_rate) +int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u32 max_tx_rate) { struct i40e_pf *pf = vsi->back; - u64 credits = 0; int speed = 0; int ret = 0; speed = i40e_get_link_speed(vsi); if (max_tx_rate > speed) { dev_err(&pf->pdev->dev, - "Invalid max tx rate %llu specified for VSI seid %d.", + "Invalid max tx rate %u specified for VSI seid %d.", max_tx_rate, seid); return -EINVAL; } @@ -5469,13 +5468,12 @@ int i40e_set_bw_limit(struct i40e_vsi *vsi, u16 seid, u64 max_tx_rate) } /* Tx rate credits are in values of 50Mbps, 0 is disabled */ - credits = max_tx_rate; - do_div(credits, I40E_BW_CREDIT_DIVISOR); - ret = i40e_aq_config_vsi_bw_limit(&pf->hw, seid, credits, + ret = i40e_aq_config_vsi_bw_limit(&pf->hw, seid, + max_tx_rate / I40E_BW_CREDIT_DIVISOR, I40E_MAX_BW_INACTIVE_ACCUM, NULL); if (ret) dev_err(&pf->pdev->dev, - "Failed set tx rate (%llu Mbps) for vsi->seid %u, err %s aq_err %s\n", + "Failed set tx rate (%u Mbps) for vsi->seid %u, err %s aq_err %s\n", max_tx_rate, seid, i40e_stat_str(&pf->hw, ret), i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); return ret; @@ -6158,17 +6156,13 @@ int i40e_create_queue_channel(struct i40e_vsi *vsi, /* configure VSI for BW limit */ if (ch->max_tx_rate) { - u64 credits = ch->max_tx_rate; - if (i40e_set_bw_limit(vsi, ch->seid, ch->max_tx_rate)) return -EINVAL; - do_div(credits, I40E_BW_CREDIT_DIVISOR); dev_dbg(&pf->pdev->dev, - "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", + "Set tx rate of %u Mbps (count of 50Mbps %u) for vsi->seid %u\n", ch->max_tx_rate, - credits, - ch->seid); + ch->max_tx_rate / I40E_BW_CREDIT_DIVISOR, ch->seid); } /* in case of VF, this will be main SRIOV VSI */ @@ -6189,7 +6183,6 @@ int i40e_create_queue_channel(struct i40e_vsi *vsi, static int i40e_configure_queue_channels(struct i40e_vsi *vsi) { struct i40e_channel *ch; - u64 max_rate = 0; int ret = 0, i; /* Create app vsi with the TCs. Main VSI with TC0 is already set up */ @@ -6211,9 +6204,8 @@ static int i40e_configure_queue_channels(struct i40e_vsi *vsi) /* Bandwidth limit through tc interface is in bytes/s, * change to Mbit/s */ - max_rate = vsi->mqprio_qopt.max_rate[i]; - do_div(max_rate, I40E_BW_MBPS_DIVISOR); - ch->max_tx_rate = max_rate; + ch->max_tx_rate = div_u64(vsi->mqprio_qopt.max_rate[i], + I40E_BW_CREDIT_DIVISOR); list_add_tail(&ch->list, &vsi->ch_list); @@ -6643,7 +6635,6 @@ static int i40e_validate_mqprio_qopt(struct i40e_vsi *vsi, struct tc_mqprio_qopt_offload *mqprio_qopt) { u64 sum_max_rate = 0; - u64 max_rate = 0; int i; if (mqprio_qopt->qopt.offset[0] != 0 || @@ -6658,9 +6649,8 @@ static int i40e_validate_mqprio_qopt(struct i40e_vsi *vsi, "Invalid min tx rate (greater than 0) specified\n"); return -EINVAL; } - max_rate = mqprio_qopt->max_rate[i]; - do_div(max_rate, I40E_BW_MBPS_DIVISOR); - sum_max_rate += max_rate; + sum_max_rate += div_u64(mqprio_qopt->max_rate[i], + I40E_BW_CREDIT_DIVISOR); if (i >= mqprio_qopt->qopt.num_tc - 1) break; @@ -6804,18 +6794,14 @@ static int i40e_setup_tc(struct net_device *netdev, void *type_data) if (pf->flags & I40E_FLAG_TC_MQPRIO) { if (vsi->mqprio_qopt.max_rate[0]) { - u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0]; - - do_div(max_tx_rate, I40E_BW_MBPS_DIVISOR); + u32 max_tx_rate = div_u64(vsi->mqprio_qopt.max_rate[0], + I40E_BW_CREDIT_DIVISOR); ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); if (!ret) { - u64 credits = max_tx_rate; - - do_div(credits, I40E_BW_CREDIT_DIVISOR); dev_dbg(&vsi->back->pdev->dev, - "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", + "Set tx rate of %u Mbps (count of 50Mbps %u) for vsi->seid %u\n", max_tx_rate, - credits, + max_tx_rate / I40E_BW_CREDIT_DIVISOR, vsi->seid); } else { need_reset = true; @@ -9024,15 +9010,12 @@ static int i40e_rebuild_channels(struct i40e_vsi *vsi) return ret; } if (ch->max_tx_rate) { - u64 credits = ch->max_tx_rate; - if (i40e_set_bw_limit(vsi, ch->seid, ch->max_tx_rate)) return -EINVAL; - do_div(credits, I40E_BW_CREDIT_DIVISOR); dev_dbg(&vsi->back->pdev->dev, - "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", + "Set tx rate of %u Mbps (count of 50Mbps %u) for vsi->seid %u\n", ch->max_tx_rate, ch->max_tx_rate / I40E_BW_CREDIT_DIVISOR, ch->seid); @@ -9314,21 +9297,18 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) } if (vsi->mqprio_qopt.max_rate[0]) { - u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0]; - u64 credits = 0; + u32 max_tx_rate = div_u64(vsi->mqprio_qopt.max_rate[0], + I40E_BW_CREDIT_DIVISOR); - do_div(max_tx_rate, I40E_BW_MBPS_DIVISOR); ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); - if (ret) + if (!ret) + dev_dbg(&vsi->back->pdev->dev, + "Set tx rate of %u Mbps (count of 50Mbps %u) for vsi->seid %u\n", + max_tx_rate, + max_tx_rate / I40E_BW_CREDIT_DIVISOR, + vsi->seid); + else goto end_unlock; - - credits = max_tx_rate; - do_div(credits, I40E_BW_CREDIT_DIVISOR); - dev_dbg(&vsi->back->pdev->dev, - "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", - max_tx_rate, - credits, - vsi->seid); } ret = i40e_rebuild_cloud_filters(vsi, vsi->seid);