lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 13 Dec 2022 10:56:44 +0200 From: Tariq Toukan <ttoukan.linux@...il.com> To: Stanislav Fomichev <sdf@...gle.com>, bpf@...r.kernel.org Cc: ast@...nel.org, daniel@...earbox.net, andrii@...nel.org, martin.lau@...ux.dev, song@...nel.org, yhs@...com, john.fastabend@...il.com, kpsingh@...nel.org, haoluo@...gle.com, jolsa@...nel.org, Tariq Toukan <tariqt@...dia.com>, David Ahern <dsahern@...il.com>, Jakub Kicinski <kuba@...nel.org>, Willem de Bruijn <willemb@...gle.com>, Jesper Dangaard Brouer <brouer@...hat.com>, Anatoly Burakov <anatoly.burakov@...el.com>, Alexander Lobakin <alexandr.lobakin@...el.com>, Magnus Karlsson <magnus.karlsson@...il.com>, Maryam Tahhan <mtahhan@...hat.com>, xdp-hints@...-project.net, netdev@...r.kernel.org Subject: Re: [PATCH bpf-next v4 11/15] net/mlx4_en: Support RX XDP metadata On 12/13/2022 4:36 AM, Stanislav Fomichev wrote: > 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: Tariq Toukan <tariqt@...dia.com> > Cc: John Fastabend <john.fastabend@...il.com> > Cc: David Ahern <dsahern@...il.com> > Cc: Martin KaFai Lau <martin.lau@...ux.dev> > Cc: Jakub Kicinski <kuba@...nel.org> > Cc: Willem de Bruijn <willemb@...gle.com> > Cc: Jesper Dangaard Brouer <brouer@...hat.com> > Cc: Anatoly Burakov <anatoly.burakov@...el.com> > Cc: Alexander Lobakin <alexandr.lobakin@...el.com> > Cc: Magnus Karlsson <magnus.karlsson@...il.com> > Cc: Maryam Tahhan <mtahhan@...hat.com> > Cc: xdp-hints@...-project.net > Cc: netdev@...r.kernel.org > Signed-off-by: Stanislav Fomichev <sdf@...gle.com> > --- > drivers/net/ethernet/mellanox/mlx4/en_clock.c | 13 +++++--- > .../net/ethernet/mellanox/mlx4/en_netdev.c | 6 ++++ > drivers/net/ethernet/mellanox/mlx4/en_rx.c | 33 ++++++++++++++++++- > drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 5 +++ > 4 files changed, 52 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c > index 98b5ffb4d729..9e3b76182088 100644 > --- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c > +++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c > @@ -58,9 +58,7 @@ u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe) > return hi | lo; > } > > -void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, > - struct skb_shared_hwtstamps *hwts, > - u64 timestamp) > +u64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp) > { > unsigned int seq; > u64 nsec; > @@ -70,8 +68,15 @@ void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, > nsec = timecounter_cyc2time(&mdev->clock, timestamp); > } while (read_seqretry(&mdev->clock_lock, seq)); > > + return ns_to_ktime(nsec); > +} > + > +void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, > + struct skb_shared_hwtstamps *hwts, > + u64 timestamp) > +{ > memset(hwts, 0, sizeof(struct skb_shared_hwtstamps)); > - hwts->hwtstamp = ns_to_ktime(nsec); > + hwts->hwtstamp = mlx4_en_get_hwtstamp(mdev, timestamp); > } > > /** > diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c > index 8800d3f1f55c..af4c4858f397 100644 > --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c > +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c > @@ -2889,6 +2889,11 @@ static const struct net_device_ops mlx4_netdev_ops_master = { > .ndo_bpf = mlx4_xdp, > }; > > +static const struct xdp_metadata_ops mlx4_xdp_metadata_ops = { > + .xmo_rx_timestamp = mlx4_en_xdp_rx_timestamp, > + .xmo_rx_hash = mlx4_en_xdp_rx_hash, > +}; > + > struct mlx4_en_bond { > struct work_struct work; > struct mlx4_en_priv *priv; > @@ -3310,6 +3315,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, > dev->netdev_ops = &mlx4_netdev_ops_master; > else > dev->netdev_ops = &mlx4_netdev_ops; > + dev->xdp_metadata_ops = &mlx4_xdp_metadata_ops; > dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT; > netif_set_real_num_tx_queues(dev, priv->tx_ring_num[TX]); > netif_set_real_num_rx_queues(dev, priv->rx_ring_num); > diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c > index 014a80af2813..0869d4fff17b 100644 > --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c > +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c > @@ -663,8 +663,35 @@ static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va, > > struct mlx4_en_xdp_buff { > struct xdp_buff xdp; > + struct mlx4_cqe *cqe; > + struct mlx4_en_dev *mdev; > + struct mlx4_en_rx_ring *ring; > + struct net_device *dev; > }; > > +int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > +{ > + struct mlx4_en_xdp_buff *_ctx = (void *)ctx; > + > + if (unlikely(_ctx->ring->hwtstamp_rx_filter != HWTSTAMP_FILTER_ALL)) > + return -EOPNOTSUPP; > + > + *timestamp = mlx4_en_get_hwtstamp(_ctx->mdev, > + mlx4_en_get_cqe_ts(_ctx->cqe)); > + return 0; > +} > + > +int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash) > +{ > + struct mlx4_en_xdp_buff *_ctx = (void *)ctx; > + > + if (unlikely(!(_ctx->dev->features & NETIF_F_RXHASH))) > + return -EOPNOTSUPP; > + > + *hash = be32_to_cpu(_ctx->cqe->immed_rss_invalid); > + return 0; > +} > + > int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int budget) > { > 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 > DMA_FROM_DEVICE); > > xdp_prepare_buff(&mxbuf.xdp, va - frags[0].page_offset, > - frags[0].page_offset, length, false); > + frags[0].page_offset, length, true); > orig_data = mxbuf.xdp.data; > + mxbuf.cqe = cqe; > + mxbuf.mdev = priv->mdev; > + mxbuf.ring = ring; > + mxbuf.dev = dev; > > act = bpf_prog_run_xdp(xdp_prog, &mxbuf.xdp); > > diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h > index e132ff4c82f2..2f8ef0b30083 100644 > --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h > +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h > @@ -788,10 +788,15 @@ void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev, > int mlx4_en_netdev_event(struct notifier_block *this, > unsigned long event, void *ptr); > > +struct xdp_md; > +int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp); > +int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash); > + > /* > * Functions for time stamping > */ > u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe); > +u64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp); > void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, > struct skb_shared_hwtstamps *hwts, > u64 timestamp); Reviewed-by: Tariq Toukan <tariqt@...dia.com>
Powered by blists - more mailing lists