From: Dust Li <dust.li@linux.alibaba.com>
To: Alexandra Winter <wintera@linux.ibm.com>,
David Miller <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Eric Dumazet <edumazet@google.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"D. Wythe" <alibuda@linux.alibaba.com>,
Sidraya Jayagond <sidraya@linux.ibm.com>,
Wenjia Zhang <wenjia@linux.ibm.com>,
Julian Ruess <julianr@linux.ibm.com>
Cc: netdev@vger.kernel.org, linux-s390@vger.kernel.org,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Thorsten Winkler <twinkler@linux.ibm.com>,
Simon Horman <horms@kernel.org>,
Mahanta Jambigi <mjambigi@linux.ibm.com>,
Tony Lu <tonylu@linux.alibaba.com>,
Wen Gu <guwen@linux.alibaba.com>,
Halil Pasic <pasic@linux.ibm.com>,
linux-rdma@vger.kernel.org
Subject: Re: [RFC net-next 08/17] net/dibs: Register ism as dibs device
Date: Sun, 10 Aug 2025 22:46:04 +0800 [thread overview]
Message-ID: <aJiwrG-XD06gTKb3@linux.alibaba.com> (raw)
In-Reply-To: <20250806154122.3413330-9-wintera@linux.ibm.com>
On 2025-08-06 17:41:13, Alexandra Winter wrote:
>Register ism devices with the dibs layer. Follow-on patches will move
>functionality to the dibs layer.
>
>As DIBS is only a shim layer without any dependencies, we can depend ISM
>on DIBS without adding indirect dependencies. A follow-on patch will
>remove implication of SMC by ISM.
>
>Define struct dibs_dev. Follow-on patches will move more content into
>dibs_dev. The goal of follow-on patches is that ism_dev will only
>contain fields that are special for this device driver. The same concept
>will apply to other dibs device drivers.
>
>Define dibs_dev_alloc(), dibs_dev_add() and dibs_dev_del() to be called
>by dibs device drivers and call them from ism_drv.c
>Use ism_dev.dibs for a pointer to dibs_dev.
I've been wondering whether we should completely remove the ISM concept
from SMC. Including rename smc_ism.c into smc_dibs.c.
Since DIBS already serves as the replacement for ISM, having both ISM
and DIBS coexist in the codebase seems a bit confusing and inconsistent.
Removing ISM could help streamline the code and improve clarity.
Best regards,
Dust
>
>Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
>---
> drivers/s390/net/Kconfig | 2 +-
> drivers/s390/net/ism.h | 1 +
> drivers/s390/net/ism_drv.c | 83 ++++++++++++++++++++++++--------------
> include/linux/dibs.h | 38 +++++++++++++++++
> include/linux/ism.h | 1 +
> net/dibs/dibs_main.c | 36 +++++++++++++++++
> 6 files changed, 129 insertions(+), 32 deletions(-)
>
>diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig
>index 2b43f6f28362..92985f595d59 100644
>--- a/drivers/s390/net/Kconfig
>+++ b/drivers/s390/net/Kconfig
>@@ -81,7 +81,7 @@ config CCWGROUP
>
> config ISM
> tristate "Support for ISM vPCI Adapter"
>- depends on PCI
>+ depends on PCI && DIBS
> imply SMC
> default n
> help
>diff --git a/drivers/s390/net/ism.h b/drivers/s390/net/ism.h
>index b5b03db52fce..3078779fa71e 100644
>--- a/drivers/s390/net/ism.h
>+++ b/drivers/s390/net/ism.h
>@@ -5,6 +5,7 @@
> #include <linux/spinlock.h>
> #include <linux/types.h>
> #include <linux/pci.h>
>+#include <linux/dibs.h>
> #include <linux/ism.h>
> #include <net/smc.h>
> #include <asm/pci_insn.h>
>diff --git a/drivers/s390/net/ism_drv.c b/drivers/s390/net/ism_drv.c
>index a543e59818bb..7948334f8d30 100644
>--- a/drivers/s390/net/ism_drv.c
>+++ b/drivers/s390/net/ism_drv.c
>@@ -599,8 +599,39 @@ static void ism_dev_release(struct device *dev)
> kfree(ism);
> }
>
>+static void ism_dev_exit(struct ism_dev *ism)
>+{
>+ struct pci_dev *pdev = ism->pdev;
>+ unsigned long flags;
>+ int i;
>+
>+ spin_lock_irqsave(&ism->lock, flags);
>+ for (i = 0; i < max_client; ++i)
>+ ism->subs[i] = NULL;
>+ spin_unlock_irqrestore(&ism->lock, flags);
>+
>+ mutex_lock(&ism_dev_list.mutex);
>+ mutex_lock(&clients_lock);
>+ for (i = 0; i < max_client; ++i) {
>+ if (clients[i])
>+ clients[i]->remove(ism);
>+ }
>+ mutex_unlock(&clients_lock);
>+
>+ if (ism_v2_capable)
>+ ism_del_vlan_id(ism, ISM_RESERVED_VLANID);
>+ unregister_ieq(ism);
>+ unregister_sba(ism);
>+ free_irq(pci_irq_vector(pdev, 0), ism);
>+ kfree(ism->sba_client_arr);
>+ pci_free_irq_vectors(pdev);
>+ list_del_init(&ism->list);
>+ mutex_unlock(&ism_dev_list.mutex);
>+}
>+
> static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> {
>+ struct dibs_dev *dibs;
> struct ism_dev *ism;
> int ret;
>
>@@ -636,12 +667,28 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> dma_set_max_seg_size(&pdev->dev, SZ_1M);
> pci_set_master(pdev);
>
>+ dibs = dibs_dev_alloc();
>+ if (!dibs) {
>+ ret = -ENOMEM;
>+ goto err_resource;
>+ }
>+ ism->dibs = dibs;
>+
> ret = ism_dev_init(ism);
> if (ret)
>- goto err_resource;
>+ goto err_dibs;
>+
>+ ret = dibs_dev_add(dibs);
>+ if (ret)
>+ goto err_ism;
>
> return 0;
>
>+err_ism:
>+ ism_dev_exit(ism);
>+err_dibs:
>+ /* pairs with dibs_dev_alloc() */
>+ kfree(dibs);
> err_resource:
> pci_release_mem_regions(pdev);
> err_disable:
>@@ -655,41 +702,15 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> return ret;
> }
>
>-static void ism_dev_exit(struct ism_dev *ism)
>-{
>- struct pci_dev *pdev = ism->pdev;
>- unsigned long flags;
>- int i;
>-
>- spin_lock_irqsave(&ism->lock, flags);
>- for (i = 0; i < max_client; ++i)
>- ism->subs[i] = NULL;
>- spin_unlock_irqrestore(&ism->lock, flags);
>-
>- mutex_lock(&ism_dev_list.mutex);
>- mutex_lock(&clients_lock);
>- for (i = 0; i < max_client; ++i) {
>- if (clients[i])
>- clients[i]->remove(ism);
>- }
>- mutex_unlock(&clients_lock);
>-
>- if (ism_v2_capable)
>- ism_del_vlan_id(ism, ISM_RESERVED_VLANID);
>- unregister_ieq(ism);
>- unregister_sba(ism);
>- free_irq(pci_irq_vector(pdev, 0), ism);
>- kfree(ism->sba_client_arr);
>- pci_free_irq_vectors(pdev);
>- list_del_init(&ism->list);
>- mutex_unlock(&ism_dev_list.mutex);
>-}
>-
> static void ism_remove(struct pci_dev *pdev)
> {
> struct ism_dev *ism = dev_get_drvdata(&pdev->dev);
>+ struct dibs_dev *dibs = ism->dibs;
>
>+ dibs_dev_del(dibs);
> ism_dev_exit(ism);
>+ /* pairs with dibs_dev_alloc() */
>+ kfree(dibs);
>
> pci_release_mem_regions(pdev);
> pci_disable_device(pdev);
>diff --git a/include/linux/dibs.h b/include/linux/dibs.h
>index 5c432699becb..e9a66cc7f25d 100644
>--- a/include/linux/dibs.h
>+++ b/include/linux/dibs.h
>@@ -9,6 +9,7 @@
> #ifndef _DIBS_H
> #define _DIBS_H
>
>+#include <linux/device.h>
> /* DIBS - Direct Internal Buffer Sharing - concept
> * -----------------------------------------------
> * In the case of multiple system sharing the same hardware, dibs fabrics can
>@@ -61,4 +62,41 @@ int dibs_register_client(struct dibs_client *client);
> */
> int dibs_unregister_client(struct dibs_client *client);
>
>+/* DIBS devices
>+ * ------------
>+ */
>+struct dibs_dev {
>+ struct list_head list;
>+};
>+
>+/* ------- End of client-only functions ----------- */
>+
>+/*
>+ * Functions to be called by dibs device drivers:
>+ */
>+/**
>+ * dibs_dev_alloc() - allocate and reference device structure
>+ *
>+ * The following fields will be valid upon successful return: dev
>+ * NOTE: Use put_device(dibs_get_dev(@dibs)) to give up your reference instead
>+ * of freeing @dibs @dev directly once you have successfully called this
>+ * function.
>+ * Return: Pointer to dibs device structure
>+ */
>+struct dibs_dev *dibs_dev_alloc(void);
>+/**
>+ * dibs_dev_add() - register with dibs layer and all clients
>+ * @dibs: dibs device
>+ *
>+ * The following fields must be valid upon entry: dev, ops, drv_priv
>+ * All fields will be valid upon successful return.
>+ * Return: zero on success
>+ */
>+int dibs_dev_add(struct dibs_dev *dibs);
>+/**
>+ * dibs_dev_del() - unregister from dibs layer and all clients
>+ * @dibs: dibs device
>+ */
>+void dibs_dev_del(struct dibs_dev *dibs);
>+
> #endif /* _DIBS_H */
>diff --git a/include/linux/ism.h b/include/linux/ism.h
>index 8358b4cd7ba6..9a53d3c48c16 100644
>--- a/include/linux/ism.h
>+++ b/include/linux/ism.h
>@@ -30,6 +30,7 @@ struct ism_dev {
> spinlock_t lock; /* protects the ism device */
> spinlock_t cmd_lock; /* serializes cmds */
> struct list_head list;
>+ struct dibs_dev *dibs;
> struct pci_dev *pdev;
>
> struct ism_sba *sba;
>diff --git a/net/dibs/dibs_main.c b/net/dibs/dibs_main.c
>index d91e461f2f06..5345e41ae5e4 100644
>--- a/net/dibs/dibs_main.c
>+++ b/net/dibs/dibs_main.c
>@@ -21,6 +21,15 @@ MODULE_LICENSE("GPL");
> static struct dibs_client *clients[MAX_DIBS_CLIENTS];
> static u8 max_client;
> static DEFINE_MUTEX(clients_lock);
>+struct dibs_dev_list {
>+ struct list_head list;
>+ struct mutex mutex; /* protects dibs device list */
>+};
>+
>+static struct dibs_dev_list dibs_dev_list = {
>+ .list = LIST_HEAD_INIT(dibs_dev_list.list),
>+ .mutex = __MUTEX_INITIALIZER(dibs_dev_list.mutex),
>+};
>
> int dibs_register_client(struct dibs_client *client)
> {
>@@ -56,6 +65,33 @@ int dibs_unregister_client(struct dibs_client *client)
> }
> EXPORT_SYMBOL_GPL(dibs_unregister_client);
>
>+struct dibs_dev *dibs_dev_alloc(void)
>+{
>+ struct dibs_dev *dibs;
>+
>+ dibs = kzalloc(sizeof(*dibs), GFP_KERNEL);
>+ return dibs;
>+}
>+EXPORT_SYMBOL_GPL(dibs_dev_alloc);
>+
>+int dibs_dev_add(struct dibs_dev *dibs)
>+{
>+ mutex_lock(&dibs_dev_list.mutex);
>+ list_add(&dibs->list, &dibs_dev_list.list);
>+ mutex_unlock(&dibs_dev_list.mutex);
>+
>+ return 0;
>+}
>+EXPORT_SYMBOL_GPL(dibs_dev_add);
>+
>+void dibs_dev_del(struct dibs_dev *dibs)
>+{
>+ mutex_lock(&dibs_dev_list.mutex);
>+ list_del_init(&dibs->list);
>+ mutex_unlock(&dibs_dev_list.mutex);
>+}
>+EXPORT_SYMBOL_GPL(dibs_dev_del);
>+
> static int __init dibs_init(void)
> {
> memset(clients, 0, sizeof(clients));
>--
>2.48.1
next prev parent reply other threads:[~2025-08-10 14:46 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-06 15:41 [RFC net-next 00/17] dibs - Direct Internal Buffer Sharing Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 01/17] net/smc: Remove __init marker from smc_core_init() Alexandra Winter
2025-08-07 3:34 ` Dust Li
2025-08-07 7:01 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 02/17] s390/ism: Log module load/unload Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 03/17] net/smc: Remove error handling of unregister_dmb() Alexandra Winter
2025-08-10 11:03 ` Dust Li
2025-08-11 11:28 ` Alexandra Winter
2025-08-12 22:53 ` Dust Li
2025-08-06 15:41 ` [RFC net-next 04/17] net/smc: Decouple sf and attached send_buf in smc_loopback Alexandra Winter
2025-08-10 14:00 ` Dust Li
2025-08-11 11:35 ` Alexandra Winter
2025-08-11 12:03 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 05/17] net/smc: Improve log message for devices w/o pnetid Alexandra Winter
2025-08-10 14:07 ` Dust Li
2025-08-11 14:10 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 06/17] net/dibs: Create net/dibs Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 07/17] net/dibs: Register smc as dibs_client Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 08/17] net/dibs: Register ism as dibs device Alexandra Winter
2025-08-07 15:05 ` kernel test robot
2025-08-07 16:37 ` Simon Horman
2025-08-07 18:19 ` Simon Horman
2025-08-08 18:36 ` Alexandra Winter
2025-08-07 16:57 ` kernel test robot
2025-08-10 14:46 ` Dust Li [this message]
2025-08-11 14:27 ` Alexandra Winter
2025-08-12 22:52 ` Dust Li
2025-08-06 15:41 ` [RFC net-next 09/17] net/dibs: Define dibs loopback Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 10/17] net/dibs: Define dibs_client_ops and dibs_dev_ops Alexandra Winter
2025-08-07 19:47 ` Simon Horman
2025-08-08 18:38 ` Alexandra Winter
2025-08-10 14:53 ` Dust Li
2025-08-11 15:12 ` Alexandra Winter
2025-08-12 22:58 ` Dust Li
2025-08-06 15:41 ` [RFC net-next 11/17] net/dibs: Move struct device to dibs_dev Alexandra Winter
2025-08-07 16:32 ` kernel test robot
2025-08-14 8:51 ` Alexandra Winter
2025-08-15 1:56 ` Dust Li
2025-08-15 11:59 ` Alexandra Winter
2025-08-15 15:18 ` Dust Li
2025-09-01 12:46 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 12/17] net/dibs: Create class dibs Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 13/17] net/dibs: Local gid for dibs devices Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 14/17] net/dibs: Move vlan support to dibs_dev_ops Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 15/17] net/dibs: Move query_remote_gid() " Alexandra Winter
2025-08-11 9:34 ` Julian Ruess
2025-08-14 14:49 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 16/17] net/dibs: Move data path to dibs layer Alexandra Winter
2025-08-07 17:20 ` kernel test robot
2025-08-07 20:34 ` Simon Horman
2025-08-08 18:38 ` Alexandra Winter
2025-08-06 15:41 ` [RFC net-next 17/17] net/dibs: Move event handling " Alexandra Winter
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=aJiwrG-XD06gTKb3@linux.alibaba.com \
--to=dust.li@linux.alibaba.com \
--cc=agordeev@linux.ibm.com \
--cc=alibuda@linux.alibaba.com \
--cc=andrew+netdev@lunn.ch \
--cc=borntraeger@linux.ibm.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gor@linux.ibm.com \
--cc=guwen@linux.alibaba.com \
--cc=hca@linux.ibm.com \
--cc=horms@kernel.org \
--cc=julianr@linux.ibm.com \
--cc=kuba@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mjambigi@linux.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=sidraya@linux.ibm.com \
--cc=svens@linux.ibm.com \
--cc=tonylu@linux.alibaba.com \
--cc=twinkler@linux.ibm.com \
--cc=wenjia@linux.ibm.com \
--cc=wintera@linux.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.