summaryrefslogtreecommitdiff
path: root/drivers/dibs
diff options
context:
space:
mode:
authorJulian Ruess <julianr@linux.ibm.com>2025-09-18 14:04:54 +0300
committerPaolo Abeni <pabeni@redhat.com>2025-09-23 12:13:22 +0300
commit845c334a0186a23c2ac4abfb444e499fec831b24 (patch)
treedc2183658a74a4fa69761f4ea8f503e802273aaa /drivers/dibs
parent69baaac9361edd169713562f088829a1be9c51a9 (diff)
downloadlinux-845c334a0186a23c2ac4abfb444e499fec831b24.tar.xz
dibs: Move struct device to dibs_dev
Move struct device from ism_dev and smc_lo_dev to dibs_dev, and define a corresponding release function. Free ism_dev in ism_remove() and smc_lo_dev in smc_lo_dev_remove(). Replace smcd->ops->get_dev(smcd) by using dibs->dev directly. An alternative design would be to embed dibs_dev as a field in ism_dev and do the same for other dibs device driver specific structs. However that would have the disadvantage that each dibs device driver needs to allocate dibs_dev and each dibs device driver needs a different device release function. The advantage would be that ism_dev and other device driver specific structs would be covered by device reference counts. Signed-off-by: Julian Ruess <julianr@linux.ibm.com> Co-developed-by: Alexandra Winter <wintera@linux.ibm.com> Signed-off-by: Alexandra Winter <wintera@linux.ibm.com> Reviewed-by: Mahanta Jambigi <mjambigi@linux.ibm.com> Link: https://patch.msgid.link/20250918110500.1731261-9-wintera@linux.ibm.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'drivers/dibs')
-rw-r--r--drivers/dibs/dibs_loopback.c15
-rw-r--r--drivers/dibs/dibs_main.c21
2 files changed, 27 insertions, 9 deletions
diff --git a/drivers/dibs/dibs_loopback.c b/drivers/dibs/dibs_loopback.c
index 215986ae54a4..76e479d5724b 100644
--- a/drivers/dibs/dibs_loopback.c
+++ b/drivers/dibs/dibs_loopback.c
@@ -15,6 +15,7 @@
#include "dibs_loopback.h"
+static const char dibs_lo_dev_name[] = "lo";
/* global loopback device */
static struct dibs_lo_dev *lo_dev;
@@ -27,11 +28,6 @@ static const struct dibs_dev_ops dibs_lo_ops = {
.get_fabric_id = dibs_lo_get_fabric_id,
};
-static void dibs_lo_dev_exit(struct dibs_lo_dev *ldev)
-{
- dibs_dev_del(ldev->dibs);
-}
-
static int dibs_lo_dev_probe(void)
{
struct dibs_lo_dev *ldev;
@@ -52,6 +48,9 @@ static int dibs_lo_dev_probe(void)
dibs->drv_priv = ldev;
dibs->ops = &dibs_lo_ops;
+ dibs->dev.parent = NULL;
+ dev_set_name(&dibs->dev, "%s", dibs_lo_dev_name);
+
ret = dibs_dev_add(dibs);
if (ret)
goto err_reg;
@@ -60,7 +59,7 @@ static int dibs_lo_dev_probe(void)
err_reg:
/* pairs with dibs_dev_alloc() */
- kfree(dibs);
+ put_device(&dibs->dev);
kfree(ldev);
return ret;
@@ -71,9 +70,9 @@ static void dibs_lo_dev_remove(void)
if (!lo_dev)
return;
- dibs_lo_dev_exit(lo_dev);
+ dibs_dev_del(lo_dev->dibs);
/* pairs with dibs_dev_alloc() */
- kfree(lo_dev->dibs);
+ put_device(&lo_dev->dibs->dev);
kfree(lo_dev);
lo_dev = NULL;
}
diff --git a/drivers/dibs/dibs_main.c b/drivers/dibs/dibs_main.c
index f1cfa5849277..610b6c452211 100644
--- a/drivers/dibs/dibs_main.c
+++ b/drivers/dibs/dibs_main.c
@@ -88,11 +88,24 @@ int dibs_unregister_client(struct dibs_client *client)
}
EXPORT_SYMBOL_GPL(dibs_unregister_client);
+static void dibs_dev_release(struct device *dev)
+{
+ struct dibs_dev *dibs;
+
+ dibs = container_of(dev, struct dibs_dev, dev);
+
+ kfree(dibs);
+}
+
struct dibs_dev *dibs_dev_alloc(void)
{
struct dibs_dev *dibs;
dibs = kzalloc(sizeof(*dibs), GFP_KERNEL);
+ if (!dibs)
+ return dibs;
+ dibs->dev.release = dibs_dev_release;
+ device_initialize(&dibs->dev);
return dibs;
}
@@ -100,7 +113,11 @@ EXPORT_SYMBOL_GPL(dibs_dev_alloc);
int dibs_dev_add(struct dibs_dev *dibs)
{
- int i;
+ int i, ret;
+
+ ret = device_add(&dibs->dev);
+ if (ret)
+ return ret;
mutex_lock(&dibs_dev_list.mutex);
mutex_lock(&clients_lock);
@@ -129,6 +146,8 @@ void dibs_dev_del(struct dibs_dev *dibs)
mutex_unlock(&clients_lock);
list_del_init(&dibs->list);
mutex_unlock(&dibs_dev_list.mutex);
+
+ device_del(&dibs->dev);
}
EXPORT_SYMBOL_GPL(dibs_dev_del);