[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Y5HfxltuOThxi+Wf@boxer>
Date: Thu, 8 Dec 2022 13:59:50 +0100
From: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
To: Gerhard Engleder <gerhard@...leder-embedded.com>
CC: <netdev@...r.kernel.org>, <bpf@...r.kernel.org>,
<davem@...emloft.net>, <kuba@...nel.org>, <edumazet@...gle.com>,
<pabeni@...hat.com>, <ast@...nel.org>, <daniel@...earbox.net>,
<hawk@...nel.org>, <john.fastabend@...il.com>
Subject: Re: [PATCH net-next v2 5/6] tsnep: Add RX queue info for XDP support
On Thu, Dec 08, 2022 at 06:40:44AM +0100, Gerhard Engleder wrote:
> Register xdp_rxq_info with page_pool memory model. This is needed for
> XDP buffer handling.
>
> Signed-off-by: Gerhard Engleder <gerhard@...leder-embedded.com>
> ---
> drivers/net/ethernet/engleder/tsnep.h | 5 ++--
> drivers/net/ethernet/engleder/tsnep_main.c | 34 +++++++++++++++++-----
> 2 files changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/engleder/tsnep.h b/drivers/net/ethernet/engleder/tsnep.h
> index 0e7fc36a64e1..70bc133d4a9d 100644
> --- a/drivers/net/ethernet/engleder/tsnep.h
> +++ b/drivers/net/ethernet/engleder/tsnep.h
> @@ -127,6 +127,7 @@ struct tsnep_rx {
> u32 owner_counter;
> int increment_owner_counter;
> struct page_pool *page_pool;
> + struct xdp_rxq_info xdp_rxq;
this occupies full cacheline, did you make sure that you don't break
tsnep_rx layout with having xdp_rxq_info in the middle of the way?
>
> u32 packets;
> u32 bytes;
> @@ -139,11 +140,11 @@ struct tsnep_queue {
> struct tsnep_adapter *adapter;
> char name[IFNAMSIZ + 9];
>
> + struct napi_struct napi;
> +
> struct tsnep_tx *tx;
> struct tsnep_rx *rx;
>
> - struct napi_struct napi;
why this move?
> -
> int irq;
> u32 irq_mask;
> void __iomem *irq_delay_addr;
> diff --git a/drivers/net/ethernet/engleder/tsnep_main.c b/drivers/net/ethernet/engleder/tsnep_main.c
> index ebfc08c1c46d..2b662a98b62a 100644
> --- a/drivers/net/ethernet/engleder/tsnep_main.c
> +++ b/drivers/net/ethernet/engleder/tsnep_main.c
> @@ -806,6 +806,9 @@ static void tsnep_rx_ring_cleanup(struct tsnep_rx *rx)
> entry->page = NULL;
> }
>
> + if (xdp_rxq_info_is_reg(&rx->xdp_rxq))
> + xdp_rxq_info_unreg(&rx->xdp_rxq);
> +
> if (rx->page_pool)
> page_pool_destroy(rx->page_pool);
>
> @@ -821,7 +824,7 @@ static void tsnep_rx_ring_cleanup(struct tsnep_rx *rx)
> }
> }
>
> -static int tsnep_rx_ring_init(struct tsnep_rx *rx)
> +static int tsnep_rx_ring_init(struct tsnep_rx *rx, unsigned int napi_id)
> {
> struct device *dmadev = rx->adapter->dmadev;
> struct tsnep_rx_entry *entry;
> @@ -864,6 +867,15 @@ static int tsnep_rx_ring_init(struct tsnep_rx *rx)
> goto failed;
> }
>
> + retval = xdp_rxq_info_reg(&rx->xdp_rxq, rx->adapter->netdev,
> + rx->queue_index, napi_id);
> + if (retval)
> + goto failed;
> + retval = xdp_rxq_info_reg_mem_model(&rx->xdp_rxq, MEM_TYPE_PAGE_POOL,
> + rx->page_pool);
> + if (retval)
> + goto failed;
> +
> for (i = 0; i < TSNEP_RING_SIZE; i++) {
> entry = &rx->entry[i];
> next_entry = &rx->entry[(i + 1) % TSNEP_RING_SIZE];
> @@ -1112,7 +1124,8 @@ static bool tsnep_rx_pending(struct tsnep_rx *rx)
> }
>
> static int tsnep_rx_open(struct tsnep_adapter *adapter, void __iomem *addr,
> - int queue_index, struct tsnep_rx *rx)
> + unsigned int napi_id, int queue_index,
> + struct tsnep_rx *rx)
> {
> dma_addr_t dma;
> int retval;
> @@ -1122,7 +1135,7 @@ static int tsnep_rx_open(struct tsnep_adapter *adapter, void __iomem *addr,
> rx->addr = addr;
> rx->queue_index = queue_index;
>
> - retval = tsnep_rx_ring_init(rx);
> + retval = tsnep_rx_ring_init(rx, napi_id);
> if (retval)
> return retval;
>
> @@ -1250,6 +1263,7 @@ int tsnep_netdev_open(struct net_device *netdev)
> {
> struct tsnep_adapter *adapter = netdev_priv(netdev);
> int i;
> + unsigned int napi_id;
> void __iomem *addr;
> int tx_queue_index = 0;
> int rx_queue_index = 0;
> @@ -1257,6 +1271,11 @@ int tsnep_netdev_open(struct net_device *netdev)
>
> for (i = 0; i < adapter->num_queues; i++) {
> adapter->queue[i].adapter = adapter;
> +
> + netif_napi_add(adapter->netdev, &adapter->queue[i].napi,
> + tsnep_poll);
> + napi_id = adapter->queue[i].napi.napi_id;
> +
> if (adapter->queue[i].tx) {
> addr = adapter->addr + TSNEP_QUEUE(tx_queue_index);
> retval = tsnep_tx_open(adapter, addr, tx_queue_index,
> @@ -1267,7 +1286,7 @@ int tsnep_netdev_open(struct net_device *netdev)
> }
> if (adapter->queue[i].rx) {
> addr = adapter->addr + TSNEP_QUEUE(rx_queue_index);
> - retval = tsnep_rx_open(adapter, addr,
> + retval = tsnep_rx_open(adapter, addr, napi_id,
> rx_queue_index,
> adapter->queue[i].rx);
> if (retval)
> @@ -1299,8 +1318,6 @@ int tsnep_netdev_open(struct net_device *netdev)
> goto phy_failed;
>
> for (i = 0; i < adapter->num_queues; i++) {
> - netif_napi_add(adapter->netdev, &adapter->queue[i].napi,
> - tsnep_poll);
> napi_enable(&adapter->queue[i].napi);
>
> tsnep_enable_irq(adapter, adapter->queue[i].irq_mask);
> @@ -1321,6 +1338,8 @@ int tsnep_netdev_open(struct net_device *netdev)
> tsnep_rx_close(adapter->queue[i].rx);
> if (adapter->queue[i].tx)
> tsnep_tx_close(adapter->queue[i].tx);
> +
> + netif_napi_del(&adapter->queue[i].napi);
> }
> return retval;
> }
> @@ -1339,7 +1358,6 @@ int tsnep_netdev_close(struct net_device *netdev)
> tsnep_disable_irq(adapter, adapter->queue[i].irq_mask);
>
> napi_disable(&adapter->queue[i].napi);
> - netif_napi_del(&adapter->queue[i].napi);
>
> tsnep_free_irq(&adapter->queue[i], i == 0);
>
> @@ -1347,6 +1365,8 @@ int tsnep_netdev_close(struct net_device *netdev)
> tsnep_rx_close(adapter->queue[i].rx);
> if (adapter->queue[i].tx)
> tsnep_tx_close(adapter->queue[i].tx);
> +
> + netif_napi_del(&adapter->queue[i].napi);
> }
>
> return 0;
> --
> 2.30.2
>
Powered by blists - more mailing lists