提交 8d059b0f 编写于 作者: A Alexander Duyck 提交者: David S. Miller

net: Add sysfs value to determine queue traffic class

Add a sysfs attribute for a Tx queue that allows us to determine the
traffic class for a given queue.  This will allow us to more easily
determine this in the future.  It is needed as XPS will take the traffic
class for a group of queues into account in order to avoid pulling traffic
from one traffic class into another.
Signed-off-by: NAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9cf1f6a8
...@@ -1920,6 +1920,7 @@ int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc) ...@@ -1920,6 +1920,7 @@ int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc)
return 0; return 0;
} }
int netdev_txq_to_tc(struct net_device *dev, unsigned int txq);
void netdev_reset_tc(struct net_device *dev); void netdev_reset_tc(struct net_device *dev);
int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset); int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset);
int netdev_set_num_tc(struct net_device *dev, u8 num_tc); int netdev_set_num_tc(struct net_device *dev, u8 num_tc);
......
...@@ -1948,6 +1948,23 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq) ...@@ -1948,6 +1948,23 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq)
} }
} }
int netdev_txq_to_tc(struct net_device *dev, unsigned int txq)
{
if (dev->num_tc) {
struct netdev_tc_txq *tc = &dev->tc_to_txq[0];
int i;
for (i = 0; i < TC_MAX_QUEUE; i++, tc++) {
if ((txq - tc->offset) < tc->count)
return i;
}
return -1;
}
return 0;
}
#ifdef CONFIG_XPS #ifdef CONFIG_XPS
static DEFINE_MUTEX(xps_map_mutex); static DEFINE_MUTEX(xps_map_mutex);
#define xmap_dereference(P) \ #define xmap_dereference(P) \
......
...@@ -1024,7 +1024,6 @@ static ssize_t show_trans_timeout(struct netdev_queue *queue, ...@@ -1024,7 +1024,6 @@ static ssize_t show_trans_timeout(struct netdev_queue *queue,
return sprintf(buf, "%lu", trans_timeout); return sprintf(buf, "%lu", trans_timeout);
} }
#ifdef CONFIG_XPS
static unsigned int get_netdev_queue_index(struct netdev_queue *queue) static unsigned int get_netdev_queue_index(struct netdev_queue *queue)
{ {
struct net_device *dev = queue->dev; struct net_device *dev = queue->dev;
...@@ -1036,6 +1035,21 @@ static unsigned int get_netdev_queue_index(struct netdev_queue *queue) ...@@ -1036,6 +1035,21 @@ static unsigned int get_netdev_queue_index(struct netdev_queue *queue)
return i; return i;
} }
static ssize_t show_traffic_class(struct netdev_queue *queue,
struct netdev_queue_attribute *attribute,
char *buf)
{
struct net_device *dev = queue->dev;
int index = get_netdev_queue_index(queue);
int tc = netdev_txq_to_tc(dev, index);
if (tc < 0)
return -EINVAL;
return sprintf(buf, "%u\n", tc);
}
#ifdef CONFIG_XPS
static ssize_t show_tx_maxrate(struct netdev_queue *queue, static ssize_t show_tx_maxrate(struct netdev_queue *queue,
struct netdev_queue_attribute *attribute, struct netdev_queue_attribute *attribute,
char *buf) char *buf)
...@@ -1078,6 +1092,9 @@ static struct netdev_queue_attribute queue_tx_maxrate = ...@@ -1078,6 +1092,9 @@ static struct netdev_queue_attribute queue_tx_maxrate =
static struct netdev_queue_attribute queue_trans_timeout = static struct netdev_queue_attribute queue_trans_timeout =
__ATTR(tx_timeout, S_IRUGO, show_trans_timeout, NULL); __ATTR(tx_timeout, S_IRUGO, show_trans_timeout, NULL);
static struct netdev_queue_attribute queue_traffic_class =
__ATTR(traffic_class, S_IRUGO, show_traffic_class, NULL);
#ifdef CONFIG_BQL #ifdef CONFIG_BQL
/* /*
* Byte queue limits sysfs structures and functions. * Byte queue limits sysfs structures and functions.
...@@ -1263,6 +1280,7 @@ static struct netdev_queue_attribute xps_cpus_attribute = ...@@ -1263,6 +1280,7 @@ static struct netdev_queue_attribute xps_cpus_attribute =
static struct attribute *netdev_queue_default_attrs[] = { static struct attribute *netdev_queue_default_attrs[] = {
&queue_trans_timeout.attr, &queue_trans_timeout.attr,
&queue_traffic_class.attr,
#ifdef CONFIG_XPS #ifdef CONFIG_XPS
&xps_cpus_attribute.attr, &xps_cpus_attribute.attr,
&queue_tx_maxrate.attr, &queue_tx_maxrate.attr,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册