Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 214778
b: refs/heads/master
c: 62fe0b4
h: refs/heads/master
v: v3
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Sep 28, 2010
1 parent 6b7cafc commit 872fcb9
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f91ff5b9ff529be8aac2039af63b2c8ea6cd6ebe
refs/heads/master: 62fe0b40abb3484413800edaef9b087a20059acf
16 changes: 15 additions & 1 deletion trunk/include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -976,8 +976,11 @@ struct net_device {

struct netdev_rx_queue *_rx;

/* Number of RX queues allocated at alloc_netdev_mq() time */
/* Number of RX queues allocated at register_netdev() time */
unsigned int num_rx_queues;

/* Number of RX queues currently active in device */
unsigned int real_num_rx_queues;
#endif

rx_handler_func_t *rx_handler;
Expand Down Expand Up @@ -1685,6 +1688,17 @@ static inline int netif_is_multiqueue(const struct net_device *dev)
extern void netif_set_real_num_tx_queues(struct net_device *dev,
unsigned int txq);

#ifdef CONFIG_RPS
extern int netif_set_real_num_rx_queues(struct net_device *dev,
unsigned int rxq);
#else
static inline int netif_set_real_num_rx_queues(struct net_device *dev,
unsigned int rxq)
{
return 0;
}
#endif

/* Use this variant when it is known for sure that it
* is executing from hardware interrupt context or with hardware interrupts
* disabled.
Expand Down
45 changes: 41 additions & 4 deletions trunk/net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1567,6 +1567,41 @@ void netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
}
EXPORT_SYMBOL(netif_set_real_num_tx_queues);

#ifdef CONFIG_RPS
/**
* netif_set_real_num_rx_queues - set actual number of RX queues used
* @dev: Network device
* @rxq: Actual number of RX queues
*
* This must be called either with the rtnl_lock held or before
* registration of the net device. Returns 0 on success, or a
* negative error code. If called before registration, it also
* sets the maximum number of queues, and always succeeds.
*/
int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq)
{
int rc;

if (dev->reg_state == NETREG_REGISTERED) {
ASSERT_RTNL();

if (rxq > dev->num_rx_queues)
return -EINVAL;

rc = net_rx_queue_update_kobjects(dev, dev->real_num_rx_queues,
rxq);
if (rc)
return rc;
} else {
dev->num_rx_queues = rxq;
}

dev->real_num_rx_queues = rxq;
return 0;
}
EXPORT_SYMBOL(netif_set_real_num_rx_queues);
#endif

static inline void __netif_reschedule(struct Qdisc *q)
{
struct softnet_data *sd;
Expand Down Expand Up @@ -2352,10 +2387,11 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,

if (skb_rx_queue_recorded(skb)) {
u16 index = skb_get_rx_queue(skb);
if (unlikely(index >= dev->num_rx_queues)) {
WARN_ONCE(dev->num_rx_queues > 1, "%s received packet "
"on queue %u, but number of RX queues is %u\n",
dev->name, index, dev->num_rx_queues);
if (unlikely(index >= dev->real_num_rx_queues)) {
WARN_ONCE(dev->real_num_rx_queues > 1,
"%s received packet on queue %u, but number "
"of RX queues is %u\n",
dev->name, index, dev->real_num_rx_queues);
goto done;
}
rxqueue = dev->_rx + index;
Expand Down Expand Up @@ -5472,6 +5508,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,

#ifdef CONFIG_RPS
dev->num_rx_queues = queue_count;
dev->real_num_rx_queues = queue_count;
#endif

dev->gso_max_size = GSO_MAX_SIZE;
Expand Down
32 changes: 18 additions & 14 deletions trunk/net/core/net-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,34 +742,38 @@ static int rx_queue_add_kobject(struct net_device *net, int index)
return error;
}

static int rx_queue_register_kobjects(struct net_device *net)
int
net_rx_queue_update_kobjects(struct net_device *net, int old_num, int new_num)
{
int i;
int error = 0;

net->queues_kset = kset_create_and_add("queues",
NULL, &net->dev.kobj);
if (!net->queues_kset)
return -ENOMEM;
for (i = 0; i < net->num_rx_queues; i++) {
for (i = old_num; i < new_num; i++) {
error = rx_queue_add_kobject(net, i);
if (error)
if (error) {
new_num = old_num;
break;
}
}

if (error)
while (--i >= 0)
kobject_put(&net->_rx[i].kobj);
while (--i >= new_num)
kobject_put(&net->_rx[i].kobj);

return error;
}

static void rx_queue_remove_kobjects(struct net_device *net)
static int rx_queue_register_kobjects(struct net_device *net)
{
int i;
net->queues_kset = kset_create_and_add("queues",
NULL, &net->dev.kobj);
if (!net->queues_kset)
return -ENOMEM;
return net_rx_queue_update_kobjects(net, 0, net->real_num_rx_queues);
}

for (i = 0; i < net->num_rx_queues; i++)
kobject_put(&net->_rx[i].kobj);
static void rx_queue_remove_kobjects(struct net_device *net)
{
net_rx_queue_update_kobjects(net, net->real_num_rx_queues, 0);
kset_unregister(net->queues_kset);
}
#endif /* CONFIG_RPS */
Expand Down
4 changes: 4 additions & 0 deletions trunk/net/core/net-sysfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@
int netdev_kobject_init(void);
int netdev_register_kobject(struct net_device *);
void netdev_unregister_kobject(struct net_device *);
#ifdef CONFIG_RPS
int net_rx_queue_update_kobjects(struct net_device *, int old_num, int new_num);
#endif

#endif

0 comments on commit 872fcb9

Please sign in to comment.