| Submitter | Alexander Duyck |
|---|---|
| Date | June 30, 2012, 12:16 a.m. |
| Message ID | <20120630001659.29939.61276.stgit@gitlad.jf.intel.com> |
| Download | mbox | patch |
| Permalink | /patch/168279/ |
| State | RFC |
| Delegated to: | David Miller |
| Headers | show |
Comments
On Fri, 2012-06-29 at 17:16 -0700, Alexander Duyck wrote: > This patch adds support for the ethtool get_channels operation. > > Since the ixgbe driver has to support DCB as well as the other modes the > assumption I made here is that the number of channels in DCB modes refers > to the number of queues per traffic class, not the number of queues total. [...] When MSI-X is enabled, a 'channel' is an MSI-X vector and the associated queues, i.e. total number of channels reported should be the total number of MSI-X vectors in use. (That was my intended interpretation, anyway. It may be that there is too much variation in the way queues and interrupts are associated for these operations to be defined in a general way.) Ben.
On 07/11/2012 11:21 AM, Ben Hutchings wrote: > On Fri, 2012-06-29 at 17:16 -0700, Alexander Duyck wrote: >> This patch adds support for the ethtool get_channels operation. >> >> Since the ixgbe driver has to support DCB as well as the other modes the >> assumption I made here is that the number of channels in DCB modes refers >> to the number of queues per traffic class, not the number of queues total. > [...] > > When MSI-X is enabled, a 'channel' is an MSI-X vector and the associated > queues, i.e. total number of channels reported should be the total > number of MSI-X vectors in use. (That was my intended interpretation, > anyway. It may be that there is too much variation in the way queues > and interrupts are associated for these operations to be defined in a > general way.) > > Ben. > The problem with the MSI-X interpretation is that ixgbe has that type of control reversed. We base everything on the number of queues, and then from that you can end up determining the number of MSI-X vectors. So for example we could tell ixgbe via this interface to generate 64 queues, but if the system only has 8 CPUs we would end up with 8 MSI-X vectors each with 8 queues. Also as I mentioned in the case of DCB things get even more complicated. We need to have a symmetric number of queues per traffic class based on the way we currently have DCB implemented. The way I saw it I could go two routes, the first being to force channels to be a multiple of TCs which would have been complicated to deal with, or the simpler approach I chose which was to apply 'channel' to be per TC. This way if DCB is then disabled we can easily revert to the standard interpretation which would mean we would only have as many queues as the channels specified. Thanks, Alex -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Patch
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 4104ea2..03e369f 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c @@ -2703,6 +2703,77 @@ static int ixgbe_get_ts_info(struct net_device *dev, return 0; } +static unsigned int ixgbe_max_channels(struct ixgbe_adapter *adapter) +{ + unsigned int max_combined; + u8 tcs = netdev_get_num_tc(adapter->netdev); + + if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) { + /* We only support one q_vector without MSI-X */ + max_combined = 1; + } else if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) { + /* SR-IOV currently only allows one queue on the PF */ + max_combined = 1; + } else if (tcs > 1) { + /* For DCB report channels per traffic class */ + if (adapter->hw.mac.type == ixgbe_mac_82598EB) { + /* 8 TC w/ 4 queues per TC */ + max_combined = 4; + } else if (tcs > 4) { + /* 8 TC w/ 8 queues per TC */ + max_combined = 8; + } else { + /* 4 TC w/ 16 queues per TC */ + max_combined = 16; + } + } else if (adapter->atr_sample_rate) { + /* support up to 64 queues with ATR */ + max_combined = IXGBE_MAX_FDIR_INDICES; + } else { + /* support up to 16 queues with RSS */ + max_combined = IXGBE_MAX_RSS_INDICES; + } + + return max_combined; +} + +static void ixgbe_get_channels(struct net_device *dev, + struct ethtool_channels *ch) +{ + struct ixgbe_adapter *adapter = netdev_priv(dev); + + /* report maximum channels */ + ch->max_combined = ixgbe_max_channels(adapter); + + /* report info for other vector */ + if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { + ch->max_other = NON_Q_VECTORS; + ch->other_count = NON_Q_VECTORS; + } + + /* record RSS queues */ + ch->combined_count = adapter->ring_feature[RING_F_RSS].indices; + + /* nothing else to report if RSS is disabled */ + if (ch->combined_count == 1) + return; + + /* we do not support ATR queueing if SR-IOV is enabled */ + if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) + return; + + /* same thing goes for being DCB enabled */ + if (netdev_get_num_tc(dev) > 1) + return; + + /* if ATR is disabled we can exit */ + if (!adapter->atr_sample_rate) + return; + + /* report flow director queues as maximum channels */ + ch->combined_count = adapter->ring_feature[RING_F_FDIR].indices; +} + static const struct ethtool_ops ixgbe_ethtool_ops = { .get_settings = ixgbe_get_settings, .set_settings = ixgbe_set_settings, @@ -2732,6 +2803,7 @@ static const struct ethtool_ops ixgbe_ethtool_ops = { .get_rxnfc = ixgbe_get_rxnfc, .set_rxnfc = ixgbe_set_rxnfc, .get_ts_info = ixgbe_get_ts_info, + .get_channels = ixgbe_get_channels, }; void ixgbe_set_ethtool_ops(struct net_device *netdev)
This patch adds support for the ethtool get_channels operation. Since the ixgbe driver has to support DCB as well as the other modes the assumption I made here is that the number of channels in DCB modes refers to the number of queues per traffic class, not the number of queues total. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> --- drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 72 ++++++++++++++++++++++ 1 files changed, 72 insertions(+), 0 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html