Commit f85949f9 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Jakub Kicinski

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: default avatarShay Agroskin <shayagr@amazon.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent bf51d277
...@@ -9,6 +9,7 @@ definitions: ...@@ -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, ...@@ -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) ...@@ -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 { ...@@ -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) ...@@ -774,20 +774,32 @@ static int __init xdp_metadata_init(void)
} }
late_initcall(xdp_metadata_init); late_initcall(xdp_metadata_init);
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg) void xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
{ {
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; val &= NETDEV_XDP_ACT_MASK;
if (support_sg) if (dev->xdp_features == val)
dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT_SG; return;
dev->xdp_features = val;
call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev); 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)
{
xdp_features_t val = (dev->xdp_features | NETDEV_XDP_ACT_NDO_XMIT);
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 { ...@@ -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 {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment