mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
xdp: add xdp_set_features_flag utility routine
Introduce xdp_set_features_flag utility routine in order to update dynamically xdp_features according to the dynamic hw configuration via ethtool (e.g. changing number of hw rx/tx queues). Add xdp_clear_features_flag() in order to clear all xdp_feature flag. Reviewed-by: Shay Agroskin <shayagr@amazon.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
bf51d27704
commit
f85949f982
5 changed files with 35 additions and 7 deletions
|
@ -9,6 +9,7 @@ definitions:
|
||||||
-
|
-
|
||||||
type: flags
|
type: flags
|
||||||
name: xdp-act
|
name: xdp-act
|
||||||
|
render-max: true
|
||||||
entries:
|
entries:
|
||||||
-
|
-
|
||||||
name: basic
|
name: basic
|
||||||
|
|
|
@ -428,12 +428,18 @@ MAX_XDP_METADATA_KFUNC,
|
||||||
#ifdef CONFIG_NET
|
#ifdef CONFIG_NET
|
||||||
u32 bpf_xdp_metadata_kfunc_id(int id);
|
u32 bpf_xdp_metadata_kfunc_id(int id);
|
||||||
bool bpf_dev_bound_kfunc_id(u32 btf_id);
|
bool bpf_dev_bound_kfunc_id(u32 btf_id);
|
||||||
|
void xdp_set_features_flag(struct net_device *dev, xdp_features_t val);
|
||||||
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);
|
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);
|
||||||
void xdp_features_clear_redirect_target(struct net_device *dev);
|
void xdp_features_clear_redirect_target(struct net_device *dev);
|
||||||
#else
|
#else
|
||||||
static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
|
static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
|
||||||
static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
|
static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
||||||
{
|
{
|
||||||
|
@ -445,4 +451,9 @@ xdp_features_clear_redirect_target(struct net_device *dev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline void xdp_clear_features_flag(struct net_device *dev)
|
||||||
|
{
|
||||||
|
xdp_set_features_flag(dev, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __LINUX_NET_XDP_H__ */
|
#endif /* __LINUX_NET_XDP_H__ */
|
||||||
|
|
|
@ -33,6 +33,8 @@ enum netdev_xdp_act {
|
||||||
NETDEV_XDP_ACT_HW_OFFLOAD = 16,
|
NETDEV_XDP_ACT_HW_OFFLOAD = 16,
|
||||||
NETDEV_XDP_ACT_RX_SG = 32,
|
NETDEV_XDP_ACT_RX_SG = 32,
|
||||||
NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
|
NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
|
||||||
|
|
||||||
|
NETDEV_XDP_ACT_MASK = 127,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -774,20 +774,32 @@ static int __init xdp_metadata_init(void)
|
||||||
}
|
}
|
||||||
late_initcall(xdp_metadata_init);
|
late_initcall(xdp_metadata_init);
|
||||||
|
|
||||||
|
void xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
|
||||||
|
{
|
||||||
|
val &= NETDEV_XDP_ACT_MASK;
|
||||||
|
if (dev->xdp_features == val)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dev->xdp_features = val;
|
||||||
|
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(xdp_set_features_flag);
|
||||||
|
|
||||||
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
|
||||||
{
|
{
|
||||||
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT;
|
xdp_features_t val = (dev->xdp_features | NETDEV_XDP_ACT_NDO_XMIT);
|
||||||
if (support_sg)
|
|
||||||
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT_SG;
|
|
||||||
|
|
||||||
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
|
if (support_sg)
|
||||||
|
val |= NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
xdp_set_features_flag(dev, val);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xdp_features_set_redirect_target);
|
EXPORT_SYMBOL_GPL(xdp_features_set_redirect_target);
|
||||||
|
|
||||||
void xdp_features_clear_redirect_target(struct net_device *dev)
|
void xdp_features_clear_redirect_target(struct net_device *dev)
|
||||||
{
|
{
|
||||||
dev->xdp_features &= ~(NETDEV_XDP_ACT_NDO_XMIT |
|
xdp_features_t val = dev->xdp_features;
|
||||||
NETDEV_XDP_ACT_NDO_XMIT_SG);
|
|
||||||
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
|
val &= ~(NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_NDO_XMIT_SG);
|
||||||
|
xdp_set_features_flag(dev, val);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xdp_features_clear_redirect_target);
|
EXPORT_SYMBOL_GPL(xdp_features_clear_redirect_target);
|
||||||
|
|
|
@ -33,6 +33,8 @@ enum netdev_xdp_act {
|
||||||
NETDEV_XDP_ACT_HW_OFFLOAD = 16,
|
NETDEV_XDP_ACT_HW_OFFLOAD = 16,
|
||||||
NETDEV_XDP_ACT_RX_SG = 32,
|
NETDEV_XDP_ACT_RX_SG = 32,
|
||||||
NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
|
NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
|
||||||
|
|
||||||
|
NETDEV_XDP_ACT_MASK = 127,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
Loading…
Add table
Reference in a new issue