From: Paolo Abeni <pabeni@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>, netdev@vger.kernel.org
Cc: Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Wen Gu <guwen@linux.alibaba.com>,
Philo Lu <lulie@linux.alibaba.com>,
Lorenzo Bianconi <lorenzo@kernel.org>,
Vadim Fedorenko <vadim.fedorenko@linux.dev>,
Lukas Bulwahn <lukas.bulwahn@redhat.com>,
Geert Uytterhoeven <geert+renesas@glider.be>,
Vivian Wang <wangruikang@iscas.ac.cn>,
Troy Mitchell <troy.mitchell@linux.spacemit.com>,
Dust Li <dust.li@linux.alibaba.com>,
alok.a.tiwari@oracle.com, kalesh-anakkur.purayil@broadcom.com
Subject: Re: [PATCH net-next v5] eea: Add basic driver framework for Alibaba Elastic Ethernet Adaptor
Date: Tue, 14 Oct 2025 13:25:47 +0200 [thread overview]
Message-ID: <8b853379-1601-4387-adaf-31f786f306ca@redhat.com> (raw)
In-Reply-To: <20251013021833.100459-1-xuanzhuo@linux.alibaba.com>
On 10/13/25 4:18 AM, Xuan Zhuo wrote:
> Add a driver framework for EEA that will be available in the future.
>
> This driver is currently quite minimal, implementing only fundamental
> core functionalities. Key features include: I/O queue management via
> adminq, basic PCI-layer operations, and essential RX/TX data
> communication capabilities. It also supports the creation,
> initialization, and management of network devices (netdev). Furthermore,
> the ring structures for both I/O queues and adminq have been abstracted
> into a simple, unified, and reusable library implementation,
> facilitating future extension and maintenance.
>
> Reviewed-by: Dust Li <dust.li@linux.alibaba.com>
> Reviewed-by: Philo Lu <lulie@linux.alibaba.com>
> Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> ---
>
> v5: Thanks for the comments from Kalesh Anakkur Purayil, ALOK TIWARI
> v4: Thanks for the comments from Troy Mitchell, Przemek Kitszel, Andrew Lunn, Kalesh Anakkur Purayil
> v3: Thanks for the comments from Paolo Abenchi
> v2: Thanks for the comments from Simon Horman and Andrew Lunn
> v1: Thanks for the comments from Simon Horman and Andrew Lunn
You should add a synopsis of the major changes vs the previous revision
to make reiviewer's work easier.
>
> This commit is indeed quite large, but further splitting it would not be
> meaningful. Historically, many similar drivers have been introduced with
> commits of similar size and scope, so we chose not to invest excessive
> effort into finer-grained splitting.
That also means that you require the reviewers to invest a lot of extra
effort here, which in turn does not help making progresses.
[...]> +/* resources: ring, buffers, irq */
> +int eea_reset_hw_resources(struct eea_net *enet, struct eea_net_tmp *tmp)
> +{
> + struct eea_net_tmp _tmp = {};
> + int err;
> +
> + if (!tmp) {
> + enet_mk_tmp_cfg(enet, &_tmp);
> + tmp = &_tmp;
This is quite ugly. Let the caller always pass non zero 'tmp'. Also a
more describing name would help.
> + }
> +
> + if (!netif_running(enet->netdev)) {
> + enet->cfg = tmp->cfg;
> + return 0;
> + }
> +
> + err = eea_alloc_rxtx_q_mem(tmp);
> + if (err) {
> + netdev_warn(enet->netdev,
> + "eea reset: alloc q failed. stop reset. err %d\n",
> + err);
> + return err;
> + }
> +
> + eea_netdev_stop(enet->netdev);
> +
> + enet_bind_new_q_and_cfg(enet, tmp);
> +
> + err = eea_active_ring_and_irq(enet);
> + if (err) {
> + netdev_warn(enet->netdev,
> + "eea reset: active new ring and irq failed. err %d\n",
> + err);
> + return err;
> + }
> +
> + err = eea_start_rxtx(enet->netdev);
> + if (err)
> + netdev_warn(enet->netdev,
> + "eea reset: start queue failed. err %d\n", err);
I'm unsure why you ignore my feedback on v2 WRT errors generated here?
> +
> + return err;
> +}
> +
> +int eea_queues_check_and_reset(struct eea_device *edev)
> +{
> + struct eea_aq_dev_status *dstatus __free(kfree) = NULL;
> + struct eea_aq_queue_status *qstatus;
> + struct eea_aq_queue_status *qs;
> + bool need_reset = false;
> + int num, i, err = 0;
> +
> + num = edev->enet->cfg.tx_ring_num * 2 + 1;
The above should probably moved under the RTNL lock or you could access
stale values.
> +
> + rtnl_lock();
> +
> + dstatus = eea_adminq_dev_status(edev->enet);
> + if (!dstatus) {
> + netdev_warn(edev->enet->netdev, "query queue status failed.\n");
err = -ENOMEM;
goto out_unlock;
> + rtnl_unlock();
> + return -ENOMEM;
> + }
> +
> + if (le16_to_cpu(dstatus->link_status) == EEA_LINK_DOWN_STATUS) {
> + eea_netdev_stop(edev->enet->netdev);
> + edev->enet->link_err = EEA_LINK_ERR_LINK_DOWN;
> + netdev_warn(edev->enet->netdev, "device link is down. stop device.\n");
> + rtnl_unlock();
> + return 0;
goto out_unlock;
> + }
> +
> + qstatus = dstatus->q_status;
> +
> + for (i = 0; i < num; ++i) {
> + qs = &qstatus[i];
> +
> + if (le16_to_cpu(qs->status) == EEA_QUEUE_STATUS_NEED_RESET) {
> + netdev_warn(edev->enet->netdev,
> + "queue status: queue %u needs to reset\n",
> + le16_to_cpu(qs->qidx));
> + need_reset = true;
> + }
> + }
> +
> + if (need_reset)
> + err = eea_reset_hw_resources(edev->enet, NULL);
> +
out_unlock:> + rtnl_unlock();
> + return err;
[...]> +/* ha handle code */
> +static void eea_ha_handle_work(struct work_struct *work)
> +{
> + struct eea_pci_device *ep_dev;
> + struct eea_device *edev;
> + struct pci_dev *pci_dev;
> + u16 reset;
> +
> + ep_dev = container_of(work, struct eea_pci_device, ha_handle_work);
> + edev = &ep_dev->edev;
> +
> + /* Ha interrupt is triggered, so there maybe some error, we may need to
> + * reset the device or reset some queues.
> + */
> + dev_warn(&ep_dev->pci_dev->dev, "recv ha interrupt.\n");
> +
> + if (ep_dev->reset_pos) {
> + pci_read_config_word(ep_dev->pci_dev, ep_dev->reset_pos,
> + &reset);
> + /* clear bit */
> + pci_write_config_word(ep_dev->pci_dev, ep_dev->reset_pos,
> + 0xFFFF);
> +
> + if (reset & EEA_PCI_CAP_RESET_FLAG) {
> + dev_warn(&ep_dev->pci_dev->dev,
> + "recv device reset request.\n");
> +
> + pci_dev = ep_dev->pci_dev;
> +
> + /* The pci remove callback may hold this lock. If the
> + * pci remove callback is called, then we can ignore the
> + * ha interrupt.
> + */
> + if (mutex_trylock(&edev->ha_lock)) {
> + edev->ha_reset = true;
> +
> + __eea_pci_remove(pci_dev, false);
> + __eea_pci_probe(pci_dev, ep_dev);
> +
> + edev->ha_reset = false;
> + mutex_unlock(&edev->ha_lock);
> + } else {
> + dev_warn(&ep_dev->pci_dev->dev,
> + "ha device reset: trylock failed.\n");
Nesting here is quite high, possibly move the above in a separate helper.
> + }
> + return;
> + }
> + }
> +
> + eea_queues_check_and_reset(&ep_dev->edev);
> +}
I'm sorry, EPATCHISTOOBIG I can't complete the review even in with an
unreasonable amount of time.
/P
next prev parent reply other threads:[~2025-10-14 11:25 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-13 2:18 [PATCH net-next v5] eea: Add basic driver framework for Alibaba Elastic Ethernet Adaptor Xuan Zhuo
2025-10-14 11:25 ` Paolo Abeni [this message]
2025-10-14 11:34 ` Xuan Zhuo
2025-10-14 12:43 ` Andrew Lunn
2025-10-14 12:19 ` Jiri Pirko
2025-10-15 0:57 ` Xuan Zhuo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8b853379-1601-4387-adaf-31f786f306ca@redhat.com \
--to=pabeni@redhat.com \
--cc=alok.a.tiwari@oracle.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=dust.li@linux.alibaba.com \
--cc=edumazet@google.com \
--cc=geert+renesas@glider.be \
--cc=guwen@linux.alibaba.com \
--cc=kalesh-anakkur.purayil@broadcom.com \
--cc=kuba@kernel.org \
--cc=lorenzo@kernel.org \
--cc=lukas.bulwahn@redhat.com \
--cc=lulie@linux.alibaba.com \
--cc=netdev@vger.kernel.org \
--cc=troy.mitchell@linux.spacemit.com \
--cc=vadim.fedorenko@linux.dev \
--cc=wangruikang@iscas.ac.cn \
--cc=xuanzhuo@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox