[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <0013632d-76f0-4480-b7b5-601c0d8e3041@davidwei.uk>
Date: Sun, 5 May 2024 17:38:28 -0700
From: David Wei <dw@...idwei.uk>
To: Mina Almasry <almasrymina@...gle.com>
Cc: netdev@...r.kernel.org, Michael Chan <michael.chan@...adcom.com>,
Pavan Chebbi <pavan.chebbi@...adcom.com>,
Andy Gospodarek <andrew.gospodarek@...adcom.com>,
Adrian Alvarado <adrian.alvarado@...adcom.com>,
Shailend Chand <shailend@...gle.com>, Jakub Kicinski <kuba@...nel.org>,
"David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>,
Paolo Abeni <pabeni@...hat.com>
Subject: Re: [RFC PATCH net-next v2 3/9] netdev: add netdev_rx_queue_restart()
On 2024-05-02 10:27, Mina Almasry wrote:
> On Wed, May 1, 2024 at 9:54 PM David Wei <dw@...idwei.uk> wrote:
>>
...
>> +int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq)
>> +{
>> + void *new_mem;
>> + void *old_mem;
>> + int err;
>> +
>> + if (!dev->queue_mgmt_ops->ndo_queue_stop ||
>> + !dev->queue_mgmt_ops->ndo_queue_mem_free ||
>> + !dev->queue_mgmt_ops->ndo_queue_mem_alloc ||
>> + !dev->queue_mgmt_ops->ndo_queue_start)
>> + return -EOPNOTSUPP;
>> +
>> + new_mem = dev->queue_mgmt_ops->ndo_queue_mem_alloc(dev, rxq);
>> + if (!new_mem)
>> + return -ENOMEM;
>> +
>> + rtnl_lock();
>> + err = dev->queue_mgmt_ops->ndo_queue_stop(dev, rxq, &old_mem);
>> + if (err)
>> + goto err_free_new_mem;
>> +
>> + err = dev->queue_mgmt_ops->ndo_queue_start(dev, rxq, new_mem);
>> + if (err)
>> + goto err_start_queue;
>> + rtnl_unlock();
>> +
>> + dev->queue_mgmt_ops->ndo_queue_mem_free(dev, old_mem);
>> +
>> + return 0;
>> +
>> +err_start_queue:
>> + /* Restarting the queue with old_mem should be successful as we haven't
>> + * changed any of the queue configuration, and there is not much we can
>> + * do to recover from a failure here.
>> + *
>> + * WARN if the we fail to recover the old rx queue, and at least free
>> + * old_mem so we don't also leak that.
>> + */
>> + if (dev->queue_mgmt_ops->ndo_queue_start(dev, rxq, old_mem)) {
>> + WARN(1,
>> + "Failed to restart old queue in error path. RX queue %d may be unhealthy.",
>> + rxq);
>> + dev->queue_mgmt_ops->ndo_queue_mem_free(dev, &old_mem);
>> + }
>> +
>> +err_free_new_mem:
>> + dev->queue_mgmt_ops->ndo_queue_mem_free(dev, new_mem);
>> + rtnl_unlock();
>> +
>> + return err;
>> +}
>
> The function looks good to me. It's very similar to what we are doing with GVE.
>
>> +EXPORT_SYMBOL_GPL(netdev_rx_queue_restart);
>
> I would still prefer not to export this, unless necessary, and it
> seems it's not at the moment (we only need to call it from core net
> and core io uring which doesn't need an export).
>
> Unexporting later, as far as my primitive understanding goes, is maybe
> tricky because it may break out of tree drivers that decided to call
> this. I don't feel strongly about unexporting, but someone else may.
Sorry, I didn't mean to ignore you, I forgot to do it. :(
I'll change it for the next series.
Powered by blists - more mailing lists