Skip to content

Commit ab46182

Browse files
fomichevMartin KaFai Lau
authored andcommitted
net/mlx4_en: Support RX XDP metadata
RX timestamp and hash for now. Tested using the prog from the next patch. Also enabling xdp metadata support; don't see why it's disabled, there is enough headroom.. Cc: John Fastabend <john.fastabend@gmail.com> Cc: David Ahern <dsahern@gmail.com> Cc: Martin KaFai Lau <martin.lau@linux.dev> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Willem de Bruijn <willemb@google.com> Cc: Jesper Dangaard Brouer <brouer@redhat.com> Cc: Anatoly Burakov <anatoly.burakov@intel.com> Cc: Alexander Lobakin <alexandr.lobakin@intel.com> Cc: Magnus Karlsson <magnus.karlsson@gmail.com> Cc: Maryam Tahhan <mtahhan@redhat.com> Cc: xdp-hints@xdp-project.net Cc: netdev@vger.kernel.org Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Stanislav Fomichev <sdf@google.com> Link: https://lore.kernel.org/r/20230119221536.3349901-14-sdf@google.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
1 parent 4444584 commit ab46182

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

drivers/net/ethernet/mellanox/mlx4/en_clock.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe)
5858
return hi | lo;
5959
}
6060

61-
void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
62-
struct skb_shared_hwtstamps *hwts,
63-
u64 timestamp)
61+
u64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp)
6462
{
6563
unsigned int seq;
6664
u64 nsec;
@@ -70,8 +68,15 @@ void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
7068
nsec = timecounter_cyc2time(&mdev->clock, timestamp);
7169
} while (read_seqretry(&mdev->clock_lock, seq));
7270

71+
return ns_to_ktime(nsec);
72+
}
73+
74+
void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
75+
struct skb_shared_hwtstamps *hwts,
76+
u64 timestamp)
77+
{
7378
memset(hwts, 0, sizeof(struct skb_shared_hwtstamps));
74-
hwts->hwtstamp = ns_to_ktime(nsec);
79+
hwts->hwtstamp = mlx4_en_get_hwtstamp(mdev, timestamp);
7580
}
7681

7782
/**

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,6 +2889,11 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
28892889
.ndo_bpf = mlx4_xdp,
28902890
};
28912891

2892+
static const struct xdp_metadata_ops mlx4_xdp_metadata_ops = {
2893+
.xmo_rx_timestamp = mlx4_en_xdp_rx_timestamp,
2894+
.xmo_rx_hash = mlx4_en_xdp_rx_hash,
2895+
};
2896+
28922897
struct mlx4_en_bond {
28932898
struct work_struct work;
28942899
struct mlx4_en_priv *priv;
@@ -3310,6 +3315,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
33103315
dev->netdev_ops = &mlx4_netdev_ops_master;
33113316
else
33123317
dev->netdev_ops = &mlx4_netdev_ops;
3318+
dev->xdp_metadata_ops = &mlx4_xdp_metadata_ops;
33133319
dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT;
33143320
netif_set_real_num_tx_queues(dev, priv->tx_ring_num[TX]);
33153321
netif_set_real_num_rx_queues(dev, priv->rx_ring_num);

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,8 +663,35 @@ static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
663663

664664
struct mlx4_en_xdp_buff {
665665
struct xdp_buff xdp;
666+
struct mlx4_cqe *cqe;
667+
struct mlx4_en_dev *mdev;
668+
struct mlx4_en_rx_ring *ring;
669+
struct net_device *dev;
666670
};
667671

672+
int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
673+
{
674+
struct mlx4_en_xdp_buff *_ctx = (void *)ctx;
675+
676+
if (unlikely(_ctx->ring->hwtstamp_rx_filter != HWTSTAMP_FILTER_ALL))
677+
return -EOPNOTSUPP;
678+
679+
*timestamp = mlx4_en_get_hwtstamp(_ctx->mdev,
680+
mlx4_en_get_cqe_ts(_ctx->cqe));
681+
return 0;
682+
}
683+
684+
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
685+
{
686+
struct mlx4_en_xdp_buff *_ctx = (void *)ctx;
687+
688+
if (unlikely(!(_ctx->dev->features & NETIF_F_RXHASH)))
689+
return -EOPNOTSUPP;
690+
691+
*hash = be32_to_cpu(_ctx->cqe->immed_rss_invalid);
692+
return 0;
693+
}
694+
668695
int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int budget)
669696
{
670697
struct mlx4_en_priv *priv = netdev_priv(dev);
@@ -781,8 +808,12 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
781808
DMA_FROM_DEVICE);
782809

783810
xdp_prepare_buff(&mxbuf.xdp, va - frags[0].page_offset,
784-
frags[0].page_offset, length, false);
811+
frags[0].page_offset, length, true);
785812
orig_data = mxbuf.xdp.data;
813+
mxbuf.cqe = cqe;
814+
mxbuf.mdev = priv->mdev;
815+
mxbuf.ring = ring;
816+
mxbuf.dev = dev;
786817

787818
act = bpf_prog_run_xdp(xdp_prog, &mxbuf.xdp);
788819

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,10 +796,15 @@ void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev,
796796
int mlx4_en_netdev_event(struct notifier_block *this,
797797
unsigned long event, void *ptr);
798798

799+
struct xdp_md;
800+
int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp);
801+
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash);
802+
799803
/*
800804
* Functions for time stamping
801805
*/
802806
u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe);
807+
u64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp);
803808
void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
804809
struct skb_shared_hwtstamps *hwts,
805810
u64 timestamp);

0 commit comments

Comments
 (0)