mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-21 23:57:36 -04:00
net: netkit: declare NETMEM_TX_NO_DMA mode
Some virtual devices like netkit (or ifb) never DMA and never touch frag contents, they just forward the skb to another device. They are unable to forward unreadable skbs, however, because they fail to pass TX validation checks on dev->netmem_tx. The existing two-state NETMEM_TX_NONE / NETMEM_TX_DMA doesn't give the TX validator enough information to differentiate devices that will attempt DMA on the unreadable skb from those that will simply route it untouched. Add a third mode to the enum so drivers can indicate 1) if they have netmem TX support, and 2) if they do, whether they are DMA-capable: NETMEM_TX_NO_DMA - pass-through, device never DMAs Widen dev->netmem_tx from a 1-bit field to 2 bits to fit the new value, and declare netkit as NETMEM_TX_NO_DMA. Devmem TX support over these devices comes in a follow-up patch. Acked-by: Stanislav Fomichev <sdf@fomichev.me> Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com> Link: https://patch.msgid.link/20260514-tcp-dm-netkit-v5-2-408c59b91e66@meta.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
7d3ab852dc
commit
6ce2bb0480
@@ -10,7 +10,7 @@ Type Name fastpath_tx_acce
|
||||
=================================== =========================== =================== =================== ===================================================================================
|
||||
unsigned_long:32 priv_flags read_mostly __dev_queue_xmit(tx)
|
||||
unsigned_long:1 lltx read_mostly HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx)
|
||||
unsigned long:1 netmem_tx:1; read_mostly
|
||||
unsigned_long:2 netmem_tx:2; read_mostly
|
||||
char name[16]
|
||||
struct netdev_name_node* name_node
|
||||
struct dev_ifalias* ifalias
|
||||
|
||||
@@ -99,3 +99,6 @@ Driver TX Requirements
|
||||
appropriate mode:
|
||||
|
||||
- `NETMEM_TX_DMA`: for physical devices that perform DMA.
|
||||
|
||||
- `NETMEM_TX_NO_DMA`: for virtual or passthrough devices that do
|
||||
not DMA, but still support handling of netmem-backed skbs.
|
||||
|
||||
@@ -92,3 +92,6 @@ dma-mapping API 去处理。
|
||||
2. 驱动程序应将 `netdev->netmem_tx` 设置为适当的模式:
|
||||
|
||||
- `NETMEM_TX_DMA`:适用于执行 DMA 的物理设备。
|
||||
|
||||
- `NETMEM_TX_NO_DMA`:适用于不执行 DMA 的虚拟或透传设备,但仍支持
|
||||
处理 netmem 支持的 skb。
|
||||
|
||||
@@ -466,6 +466,7 @@ static void netkit_setup(struct net_device *dev)
|
||||
dev->priv_flags |= IFF_NO_QUEUE;
|
||||
dev->priv_flags |= IFF_DISABLE_NETPOLL;
|
||||
dev->lltx = true;
|
||||
dev->netmem_tx = NETMEM_TX_NO_DMA;
|
||||
|
||||
dev->netdev_ops = &netkit_netdev_ops;
|
||||
dev->ethtool_ops = &netkit_ethtool_ops;
|
||||
|
||||
@@ -1797,6 +1797,7 @@ enum netdev_stat_type {
|
||||
enum netmem_tx_mode {
|
||||
NETMEM_TX_NONE, /* no netmem TX support */
|
||||
NETMEM_TX_DMA, /* DMA-capable netmem TX (real HW) */
|
||||
NETMEM_TX_NO_DMA, /* no DMA, e.g. passthrough for virtual devs */
|
||||
};
|
||||
|
||||
enum netdev_reg_state {
|
||||
@@ -2143,7 +2144,7 @@ struct net_device {
|
||||
struct_group(priv_flags_fast,
|
||||
unsigned long priv_flags:32;
|
||||
unsigned long lltx:1;
|
||||
unsigned long netmem_tx:1;
|
||||
unsigned long netmem_tx:2;
|
||||
);
|
||||
const struct net_device_ops *netdev_ops;
|
||||
const struct header_ops *header_ops;
|
||||
|
||||
Reference in New Issue
Block a user