mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 06:55:13 +08:00
Merge branch 'update-xdp_features-flag-according-to-nic-re-configuration'
Lorenzo Bianconi says: ==================== update xdp_features flag according to NIC re-configuration Changes since v1: - rebase on top of net tree - remove NETDEV_XDP_ACT_NDO_XMIT_SG support in mlx5e driver - always enable NETDEV_XDP_ACT_NDO_XMIT support in mlx5e driver ==================== Link: https://lore.kernel.org/r/cover.1678364612.git.lorenzo@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
12508b3eb6
@ -9,6 +9,7 @@ definitions:
|
|||||||
-
|
-
|
||||||
type: flags
|
type: flags
|
||||||
name: xdp-act
|
name: xdp-act
|
||||||
|
render-max: true
|
||||||
entries:
|
entries:
|
||||||
-
|
-
|
||||||
name: basic
|
name: basic
|
||||||
|
@ -850,11 +850,20 @@ static int ena_set_channels(struct net_device *netdev,
|
|||||||
struct ena_adapter *adapter = netdev_priv(netdev);
|
struct ena_adapter *adapter = netdev_priv(netdev);
|
||||||
u32 count = channels->combined_count;
|
u32 count = channels->combined_count;
|
||||||
/* The check for max value is already done in ethtool */
|
/* The check for max value is already done in ethtool */
|
||||||
if (count < ENA_MIN_NUM_IO_QUEUES ||
|
if (count < ENA_MIN_NUM_IO_QUEUES)
|
||||||
(ena_xdp_present(adapter) &&
|
|
||||||
!ena_xdp_legal_queue_count(adapter, count)))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!ena_xdp_legal_queue_count(adapter, count)) {
|
||||||
|
if (ena_xdp_present(adapter))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
xdp_clear_features_flag(netdev);
|
||||||
|
} else {
|
||||||
|
xdp_set_features_flag(netdev,
|
||||||
|
NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT);
|
||||||
|
}
|
||||||
|
|
||||||
return ena_update_queue_count(adapter, count);
|
return ena_update_queue_count(adapter, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4105,8 +4105,6 @@ static void ena_set_conf_feat_params(struct ena_adapter *adapter,
|
|||||||
/* Set offload features */
|
/* Set offload features */
|
||||||
ena_set_dev_offloads(feat, netdev);
|
ena_set_dev_offloads(feat, netdev);
|
||||||
|
|
||||||
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
|
|
||||||
|
|
||||||
adapter->max_mtu = feat->dev_attr.max_mtu;
|
adapter->max_mtu = feat->dev_attr.max_mtu;
|
||||||
netdev->max_mtu = adapter->max_mtu;
|
netdev->max_mtu = adapter->max_mtu;
|
||||||
netdev->min_mtu = ENA_MIN_MTU;
|
netdev->min_mtu = ENA_MIN_MTU;
|
||||||
@ -4393,6 +4391,10 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
ena_config_debug_area(adapter);
|
ena_config_debug_area(adapter);
|
||||||
|
|
||||||
|
if (ena_xdp_legal_queue_count(adapter, adapter->num_io_queues))
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT;
|
||||||
|
|
||||||
memcpy(adapter->netdev->perm_addr, adapter->mac_addr, netdev->addr_len);
|
memcpy(adapter->netdev->perm_addr, adapter->mac_addr, netdev->addr_len);
|
||||||
|
|
||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
|
@ -735,12 +735,17 @@ static int nicvf_set_channels(struct net_device *dev,
|
|||||||
if (channel->tx_count > nic->max_queues)
|
if (channel->tx_count > nic->max_queues)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (nic->xdp_prog &&
|
if (channel->tx_count + channel->rx_count > nic->max_queues) {
|
||||||
((channel->tx_count + channel->rx_count) > nic->max_queues)) {
|
if (nic->xdp_prog) {
|
||||||
netdev_err(nic->netdev,
|
netdev_err(nic->netdev,
|
||||||
"XDP mode, RXQs + TXQs > Max %d\n",
|
"XDP mode, RXQs + TXQs > Max %d\n",
|
||||||
nic->max_queues);
|
nic->max_queues);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
xdp_clear_features_flag(nic->netdev);
|
||||||
|
} else if (!pass1_silicon(nic->pdev)) {
|
||||||
|
xdp_set_features_flag(dev, NETDEV_XDP_ACT_BASIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (if_up)
|
if (if_up)
|
||||||
|
@ -2218,7 +2218,9 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
netdev->netdev_ops = &nicvf_netdev_ops;
|
netdev->netdev_ops = &nicvf_netdev_ops;
|
||||||
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
|
netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
|
||||||
|
|
||||||
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
|
if (!pass1_silicon(nic->pdev) &&
|
||||||
|
nic->rx_queues + nic->tx_queues <= nic->max_queues)
|
||||||
|
netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
|
||||||
|
|
||||||
/* MTU range: 64 - 9200 */
|
/* MTU range: 64 - 9200 */
|
||||||
netdev->min_mtu = NIC_HW_MIN_FRS;
|
netdev->min_mtu = NIC_HW_MIN_FRS;
|
||||||
|
@ -4996,6 +4996,14 @@ static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu)
|
|||||||
|
|
||||||
for (i = 0; i < priv->port_count; i++) {
|
for (i = 0; i < priv->port_count; i++) {
|
||||||
port = priv->port_list[i];
|
port = priv->port_list[i];
|
||||||
|
if (percpu && port->ntxqs >= num_possible_cpus() * 2)
|
||||||
|
xdp_set_features_flag(port->dev,
|
||||||
|
NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT);
|
||||||
|
else
|
||||||
|
xdp_clear_features_flag(port->dev);
|
||||||
|
|
||||||
mvpp2_swf_bm_pool_init(port);
|
mvpp2_swf_bm_pool_init(port);
|
||||||
if (status[i])
|
if (status[i])
|
||||||
mvpp2_open(port->dev);
|
mvpp2_open(port->dev);
|
||||||
@ -6863,13 +6871,14 @@ static int mvpp2_port_probe(struct platform_device *pdev,
|
|||||||
|
|
||||||
if (!port->priv->percpu_pools)
|
if (!port->priv->percpu_pools)
|
||||||
mvpp2_set_hw_csum(port, port->pool_long->id);
|
mvpp2_set_hw_csum(port, port->pool_long->id);
|
||||||
|
else if (port->ntxqs >= num_possible_cpus() * 2)
|
||||||
|
dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
|
||||||
dev->vlan_features |= features;
|
dev->vlan_features |= features;
|
||||||
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
||||||
|
|
||||||
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
|
||||||
NETDEV_XDP_ACT_NDO_XMIT;
|
|
||||||
|
|
||||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
|
||||||
/* MTU range: 68 - 9704 */
|
/* MTU range: 68 - 9704 */
|
||||||
|
@ -1243,6 +1243,7 @@ void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16
|
|||||||
void mlx5e_rx_dim_work(struct work_struct *work);
|
void mlx5e_rx_dim_work(struct work_struct *work);
|
||||||
void mlx5e_tx_dim_work(struct work_struct *work);
|
void mlx5e_tx_dim_work(struct work_struct *work);
|
||||||
|
|
||||||
|
void mlx5e_set_xdp_feature(struct net_device *netdev);
|
||||||
netdev_features_t mlx5e_features_check(struct sk_buff *skb,
|
netdev_features_t mlx5e_features_check(struct sk_buff *skb,
|
||||||
struct net_device *netdev,
|
struct net_device *netdev,
|
||||||
netdev_features_t features);
|
netdev_features_t features);
|
||||||
|
@ -1985,6 +1985,7 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
|
|||||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||||
struct mlx5_core_dev *mdev = priv->mdev;
|
struct mlx5_core_dev *mdev = priv->mdev;
|
||||||
struct mlx5e_params new_params;
|
struct mlx5e_params new_params;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
/* Checking the regular RQ here; mlx5e_validate_xsk_param called
|
/* Checking the regular RQ here; mlx5e_validate_xsk_param called
|
||||||
@ -2005,7 +2006,14 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
|
|||||||
MLX5E_SET_PFLAG(&new_params, MLX5E_PFLAG_RX_STRIDING_RQ, enable);
|
MLX5E_SET_PFLAG(&new_params, MLX5E_PFLAG_RX_STRIDING_RQ, enable);
|
||||||
mlx5e_set_rq_type(mdev, &new_params);
|
mlx5e_set_rq_type(mdev, &new_params);
|
||||||
|
|
||||||
return mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
|
err = mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* update XDP supported features */
|
||||||
|
mlx5e_set_xdp_feature(netdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
|
static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
|
||||||
|
@ -4004,6 +4004,25 @@ static int mlx5e_handle_feature(struct net_device *netdev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mlx5e_set_xdp_feature(struct net_device *netdev)
|
||||||
|
{
|
||||||
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||||
|
struct mlx5e_params *params = &priv->channels.params;
|
||||||
|
xdp_features_t val;
|
||||||
|
|
||||||
|
if (params->packet_merge.type != MLX5E_PACKET_MERGE_NONE) {
|
||||||
|
xdp_clear_features_flag(netdev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_XSK_ZEROCOPY |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT;
|
||||||
|
if (params->rq_wq_type == MLX5_WQ_TYPE_CYCLIC)
|
||||||
|
val |= NETDEV_XDP_ACT_RX_SG;
|
||||||
|
xdp_set_features_flag(netdev, val);
|
||||||
|
}
|
||||||
|
|
||||||
int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
|
int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
|
||||||
{
|
{
|
||||||
netdev_features_t oper_features = features;
|
netdev_features_t oper_features = features;
|
||||||
@ -4030,6 +4049,9 @@ int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* update XDP supported features */
|
||||||
|
mlx5e_set_xdp_feature(netdev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4761,13 +4783,6 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
|
|||||||
if (old_prog)
|
if (old_prog)
|
||||||
bpf_prog_put(old_prog);
|
bpf_prog_put(old_prog);
|
||||||
|
|
||||||
if (reset) {
|
|
||||||
if (prog)
|
|
||||||
xdp_features_set_redirect_target(netdev, true);
|
|
||||||
else
|
|
||||||
xdp_features_clear_redirect_target(netdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
@ -5163,13 +5178,10 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
|
|||||||
netdev->features |= NETIF_F_HIGHDMA;
|
netdev->features |= NETIF_F_HIGHDMA;
|
||||||
netdev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
|
netdev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
|
||||||
|
|
||||||
netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
|
||||||
NETDEV_XDP_ACT_XSK_ZEROCOPY |
|
|
||||||
NETDEV_XDP_ACT_RX_SG;
|
|
||||||
|
|
||||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||||
|
|
||||||
netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
|
netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
|
||||||
|
mlx5e_set_xdp_feature(netdev);
|
||||||
mlx5e_set_netdev_dev_addr(netdev);
|
mlx5e_set_netdev_dev_addr(netdev);
|
||||||
mlx5e_macsec_build_netdev(priv);
|
mlx5e_macsec_build_netdev(priv);
|
||||||
mlx5e_ipsec_build_netdev(priv);
|
mlx5e_ipsec_build_netdev(priv);
|
||||||
@ -5241,6 +5253,9 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
|
|||||||
mlx5_core_err(mdev, "TLS initialization failed, %d\n", err);
|
mlx5_core_err(mdev, "TLS initialization failed, %d\n", err);
|
||||||
|
|
||||||
mlx5e_health_create_reporters(priv);
|
mlx5e_health_create_reporters(priv);
|
||||||
|
/* update XDP supported features */
|
||||||
|
mlx5e_set_xdp_feature(netdev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -747,6 +747,9 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
|||||||
/* RQ */
|
/* RQ */
|
||||||
mlx5e_build_rq_params(mdev, params);
|
mlx5e_build_rq_params(mdev, params);
|
||||||
|
|
||||||
|
/* update XDP supported features */
|
||||||
|
mlx5e_set_xdp_feature(netdev);
|
||||||
|
|
||||||
/* CQ moderation params */
|
/* CQ moderation params */
|
||||||
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
||||||
mlx5e_set_rx_cq_mode_params(params, cq_period_mode);
|
mlx5e_set_rx_cq_mode_params(params, cq_period_mode);
|
||||||
|
@ -1257,6 +1257,26 @@ static int veth_enable_range_safe(struct net_device *dev, int start, int end)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void veth_set_xdp_features(struct net_device *dev)
|
||||||
|
{
|
||||||
|
struct veth_priv *priv = netdev_priv(dev);
|
||||||
|
struct net_device *peer;
|
||||||
|
|
||||||
|
peer = rcu_dereference(priv->peer);
|
||||||
|
if (peer && peer->real_num_tx_queues <= dev->real_num_rx_queues) {
|
||||||
|
xdp_features_t val = NETDEV_XDP_ACT_BASIC |
|
||||||
|
NETDEV_XDP_ACT_REDIRECT |
|
||||||
|
NETDEV_XDP_ACT_RX_SG;
|
||||||
|
|
||||||
|
if (priv->_xdp_prog || veth_gro_requested(dev))
|
||||||
|
val |= NETDEV_XDP_ACT_NDO_XMIT |
|
||||||
|
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
||||||
|
xdp_set_features_flag(dev, val);
|
||||||
|
} else {
|
||||||
|
xdp_clear_features_flag(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int veth_set_channels(struct net_device *dev,
|
static int veth_set_channels(struct net_device *dev,
|
||||||
struct ethtool_channels *ch)
|
struct ethtool_channels *ch)
|
||||||
{
|
{
|
||||||
@ -1323,6 +1343,12 @@ out:
|
|||||||
if (peer)
|
if (peer)
|
||||||
netif_carrier_on(peer);
|
netif_carrier_on(peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* update XDP supported features */
|
||||||
|
veth_set_xdp_features(dev);
|
||||||
|
if (peer)
|
||||||
|
veth_set_xdp_features(peer);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
revert:
|
revert:
|
||||||
@ -1489,7 +1515,10 @@ static int veth_set_features(struct net_device *dev,
|
|||||||
err = veth_napi_enable(dev);
|
err = veth_napi_enable(dev);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
} else {
|
} else {
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
veth_napi_del(dev);
|
veth_napi_del(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1570,10 +1599,15 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
|
|||||||
peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
|
peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
|
||||||
peer->max_mtu = max_mtu;
|
peer->max_mtu = max_mtu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xdp_features_set_redirect_target(dev, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old_prog) {
|
if (old_prog) {
|
||||||
if (!prog) {
|
if (!prog) {
|
||||||
|
if (!veth_gro_requested(dev))
|
||||||
|
xdp_features_clear_redirect_target(dev);
|
||||||
|
|
||||||
if (dev->flags & IFF_UP)
|
if (dev->flags & IFF_UP)
|
||||||
veth_disable_xdp(dev);
|
veth_disable_xdp(dev);
|
||||||
|
|
||||||
@ -1686,10 +1720,6 @@ static void veth_setup(struct net_device *dev)
|
|||||||
dev->hw_enc_features = VETH_FEATURES;
|
dev->hw_enc_features = VETH_FEATURES;
|
||||||
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
||||||
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
|
||||||
|
|
||||||
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
|
|
||||||
NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
|
|
||||||
NETDEV_XDP_ACT_NDO_XMIT_SG;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1857,6 +1887,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
|||||||
goto err_queues;
|
goto err_queues;
|
||||||
|
|
||||||
veth_disable_gro(dev);
|
veth_disable_gro(dev);
|
||||||
|
/* update XDP supported features */
|
||||||
|
veth_set_xdp_features(dev);
|
||||||
|
veth_set_xdp_features(peer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_queues:
|
err_queues:
|
||||||
|
@ -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 {
|
||||||
|
@ -138,10 +138,8 @@ class SpecEnumSet(SpecElement):
|
|||||||
|
|
||||||
def get_mask(self):
|
def get_mask(self):
|
||||||
mask = 0
|
mask = 0
|
||||||
idx = self.yaml.get('value-start', 0)
|
for e in self.entries.values():
|
||||||
for _ in self.entries.values():
|
mask += e.user_value()
|
||||||
mask |= 1 << idx
|
|
||||||
idx += 1
|
|
||||||
return mask
|
return mask
|
||||||
|
|
||||||
|
|
||||||
|
@ -1931,9 +1931,14 @@ def render_uapi(family, cw):
|
|||||||
|
|
||||||
if const.get('render-max', False):
|
if const.get('render-max', False):
|
||||||
cw.nl()
|
cw.nl()
|
||||||
max_name = c_upper(name_pfx + 'max')
|
if const['type'] == 'flags':
|
||||||
cw.p('__' + max_name + ',')
|
max_name = c_upper(name_pfx + 'mask')
|
||||||
cw.p(max_name + ' = (__' + max_name + ' - 1)')
|
max_val = f' = {enum.get_mask()},'
|
||||||
|
cw.p(max_name + max_val)
|
||||||
|
else:
|
||||||
|
max_name = c_upper(name_pfx + 'max')
|
||||||
|
cw.p('__' + max_name + ',')
|
||||||
|
cw.p(max_name + ' = (__' + max_name + ' - 1)')
|
||||||
cw.block_end(line=';')
|
cw.block_end(line=';')
|
||||||
cw.nl()
|
cw.nl()
|
||||||
elif const['type'] == 'const':
|
elif const['type'] == 'const':
|
||||||
|
Loading…
Reference in New Issue
Block a user