From: Paolo Abeni <pabeni@redhat.com>
To: netdev@vger.kernel.org
Cc: Saeed Mahameed <saeedm@mellanox.com>,
Jeff Kirsher <jeffrey.t.kirsher@intel.com>,
Eric Dumazet <edumazet@google.com>,
Willem de Bruijn <willemb@google.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [RFC PATCH] packet: rework packet_pick_tx_queue() to use common code selection
Date: Thu, 28 Feb 2019 15:35:38 +0100 [thread overview]
Message-ID: <397fe96fa8f75483b81cc802191addd1acd01280.1551364536.git.pabeni@redhat.com> (raw)
Currently packet_pick_tx_queue() is the only caller of
ndo_select_queue() using a fallback argument other than
__netdev_pick_tx.
Leveraging rx queue, we can obtain a similar queue selection
behavior using core helpers. After this change, ndo_select_queue()
is always invoked with __netdev_pick_tx() as fallback.
We can change ndo_select_queue() signature in a followup patch,
dropping an indirect call per transmitted packet in some scenarios
(e.g. TCP syn and XDP generic xmit)
This changes slightly how af packet queue selection happens when
PACKET_QDISC_BYPASS is set. It's now more similar to plan dev_queue_xmit()
tacking in account both XPS and TC mapping.
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
Note: the main goal here is getting rid of the fallback() indirect
call in the device drivers implementing ndo_select_queue(). We can
obtain the same result with the INDIRECT_CALL() harness. Both ways
we need to export __netdev_pick_tx() but here we avoid the need
for additional branching.
---
include/linux/netdevice.h | 2 ++
net/core/dev.c | 5 +++--
net/packet/af_packet.c | 9 +++++++--
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index c10b60297d28..29a558bded82 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2152,6 +2152,8 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev,
&qdisc_xmit_lock_key); \
}
+u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb,
+ struct net_device *sb_dev);
struct netdev_queue *netdev_pick_tx(struct net_device *dev,
struct sk_buff *skb,
struct net_device *sb_dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index 2b67f2aa59dd..004d1180671a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3704,8 +3704,8 @@ u16 dev_pick_tx_cpu_id(struct net_device *dev, struct sk_buff *skb,
}
EXPORT_SYMBOL(dev_pick_tx_cpu_id);
-static u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb,
- struct net_device *sb_dev)
+u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb,
+ struct net_device *sb_dev)
{
struct sock *sk = skb->sk;
int queue_index = sk_tx_queue_get(sk);
@@ -3729,6 +3729,7 @@ static u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb,
return queue_index;
}
+EXPORT_SYMBOL(__netdev_pick_tx);
struct netdev_queue *netdev_pick_tx(struct net_device *dev,
struct sk_buff *skb,
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 8376bc1c1508..1f7ae4a34d27 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -285,14 +285,19 @@ static u16 packet_pick_tx_queue(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
const struct net_device_ops *ops = dev->netdev_ops;
+ int hint = __packet_pick_tx_queue(dev, skb, NULL);
u16 queue_index;
+#ifdef CONFIG_XPS
+ skb->sender_cpu = hint + 1;
+#endif
+ skb_record_rx_queue(skb, hint);
if (ops->ndo_select_queue) {
queue_index = ops->ndo_select_queue(dev, skb, NULL,
- __packet_pick_tx_queue);
+ __netdev_pick_tx);
queue_index = netdev_cap_txqueue(dev, queue_index);
} else {
- queue_index = __packet_pick_tx_queue(dev, skb, NULL);
+ queue_index = __netdev_pick_tx(dev, skb, NULL);
}
return queue_index;
--
2.20.1
next reply other threads:[~2019-02-28 14:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-28 14:35 Paolo Abeni [this message]
2019-02-28 16:30 ` [RFC PATCH] packet: rework packet_pick_tx_queue() to use common code selection Willem de Bruijn
2019-02-28 17:00 ` Paolo Abeni
2019-02-28 18:29 ` Willem de Bruijn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=397fe96fa8f75483b81cc802191addd1acd01280.1551364536.git.pabeni@redhat.com \
--to=pabeni@redhat.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jeffrey.t.kirsher@intel.com \
--cc=netdev@vger.kernel.org \
--cc=saeedm@mellanox.com \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).