Message ID | 1474354228-3221-6-git-send-email-michael.chan@broadcom.com |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
Hi! On Tue, 20 Sep 2016 02:50:23 -0400, Michael Chan wrote: > The existing code is inconsistent in reporting and accepting the combined > channel count. bnxt_get_channels() reports maximum combined as the > maximum rx count. bnxt_set_channels() accepts combined count that > cannot be bigger than max rx or max tx. > > For example, if max rx = 2 and max tx = 1, we report max supported > combined to be 2. But if the user tries to set combined to 2, it will > fail because 2 is bigger than max tx which is 1. > > Fix the code to be consistent. Max allowed combined = max(max_rx, max_tx). > We will accept a combined channel count <= max(max_rx, max_tx). > > Signed-off-by: Michael Chan <michael.chan@broadcom.com> Sorry I wasn't able to respond in time but I'm with Yuval on this one. The canonical meaning for the parameters is set by man page for ethtool: > rx N Changes the number of channels with only receive queues. > > tx N Changes the number of channels with only transmit queues. > > other N > Changes the number of channels used only for other purposes e.g. > link interrupts or SR-IOV co-ordination. > > combined N > Changes the number of multi-purpose channels. Could we please agree that combined means having both RX and TX and the others mean having only the specified one? See for example: e261768e9e39 ("be2net: support asymmetric rx/tx queue counts")
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index ae4458d..de893c9 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -348,7 +348,7 @@ static void bnxt_get_channels(struct net_device *dev, int max_rx_rings, max_tx_rings, tcs; bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true); - channel->max_combined = max_rx_rings; + channel->max_combined = max_t(int, max_rx_rings, max_tx_rings); if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) { max_rx_rings = 0; @@ -406,8 +406,8 @@ static int bnxt_set_channels(struct net_device *dev, if (tcs > 1) max_tx_rings /= tcs; - if (sh && (channel->combined_count > max_rx_rings || - channel->combined_count > max_tx_rings)) + if (sh && + channel->combined_count > max_t(int, max_rx_rings, max_tx_rings)) return -ENOMEM; if (!sh && (channel->rx_count > max_rx_rings || @@ -430,8 +430,10 @@ static int bnxt_set_channels(struct net_device *dev, if (sh) { bp->flags |= BNXT_FLAG_SHARED_RINGS; - bp->rx_nr_rings = channel->combined_count; - bp->tx_nr_rings_per_tc = channel->combined_count; + bp->rx_nr_rings = min_t(int, channel->combined_count, + max_rx_rings); + bp->tx_nr_rings_per_tc = min_t(int, channel->combined_count, + max_tx_rings); } else { bp->flags &= ~BNXT_FLAG_SHARED_RINGS; bp->rx_nr_rings = channel->rx_count;
The existing code is inconsistent in reporting and accepting the combined channel count. bnxt_get_channels() reports maximum combined as the maximum rx count. bnxt_set_channels() accepts combined count that cannot be bigger than max rx or max tx. For example, if max rx = 2 and max tx = 1, we report max supported combined to be 2. But if the user tries to set combined to 2, it will fail because 2 is bigger than max tx which is 1. Fix the code to be consistent. Max allowed combined = max(max_rx, max_tx). We will accept a combined channel count <= max(max_rx, max_tx). Signed-off-by: Michael Chan <michael.chan@broadcom.com> --- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)