Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 351341
b: refs/heads/master
c: 416186f
h: refs/heads/master
i:
  351339: 2ee764b
v: v3
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Jan 11, 2013
1 parent 7cc22a5 commit 02ec9e7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 26 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: c10d73671ad30f54692f7f69f0e09e75d3a8926a
refs/heads/master: 416186fbf8c5b4e4465a10c6ac7a45b6c47144b2
1 change: 1 addition & 0 deletions trunk/include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1403,6 +1403,7 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev,

extern struct netdev_queue *netdev_pick_tx(struct net_device *dev,
struct sk_buff *skb);
extern u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb);

/*
* Net namespace inlines
Expand Down
57 changes: 32 additions & 25 deletions trunk/net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2495,37 +2495,44 @@ static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)
#endif
}

struct netdev_queue *netdev_pick_tx(struct net_device *dev,
struct sk_buff *skb)
u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb)
{
int queue_index;
const struct net_device_ops *ops = dev->netdev_ops;

if (dev->real_num_tx_queues == 1)
queue_index = 0;
else if (ops->ndo_select_queue) {
queue_index = ops->ndo_select_queue(dev, skb);
queue_index = dev_cap_txqueue(dev, queue_index);
} else {
struct sock *sk = skb->sk;
queue_index = sk_tx_queue_get(sk);
struct sock *sk = skb->sk;
int queue_index = sk_tx_queue_get(sk);

if (queue_index < 0 || skb->ooo_okay ||
queue_index >= dev->real_num_tx_queues) {
int old_index = queue_index;
if (queue_index < 0 || skb->ooo_okay ||
queue_index >= dev->real_num_tx_queues) {
int new_index = get_xps_queue(dev, skb);
if (new_index < 0)
new_index = skb_tx_hash(dev, skb);

queue_index = get_xps_queue(dev, skb);
if (queue_index < 0)
queue_index = skb_tx_hash(dev, skb);

if (queue_index != old_index && sk) {
struct dst_entry *dst =
if (queue_index != new_index && sk) {
struct dst_entry *dst =
rcu_dereference_check(sk->sk_dst_cache, 1);

if (dst && skb_dst(skb) == dst)
sk_tx_queue_set(sk, queue_index);
}
if (dst && skb_dst(skb) == dst)
sk_tx_queue_set(sk, queue_index);

}

queue_index = new_index;
}

return queue_index;
}

struct netdev_queue *netdev_pick_tx(struct net_device *dev,
struct sk_buff *skb)
{
int queue_index = 0;

if (dev->real_num_tx_queues != 1) {
const struct net_device_ops *ops = dev->netdev_ops;
if (ops->ndo_select_queue)
queue_index = ops->ndo_select_queue(dev, skb);
else
queue_index = __netdev_pick_tx(dev, skb);
queue_index = dev_cap_txqueue(dev, queue_index);
}

skb_set_queue_mapping(skb, queue_index);
Expand Down

0 comments on commit 02ec9e7

Please sign in to comment.