dibs: Define dibs loopback

The first stage of loopback-ism was implemented as part of the
SMC module [1]. Now that we have the dibs layer, provide access to a
dibs_loopback device to all dibs clients.

This is the first step of moving loopback-ism from net/smc/smc_loopback.*
to drivers/dibs/dibs_loopback.*. One global structure lo_dev is allocated
and added to the dibs devices. Follow-on patches will move functionality.

Same as smc_loopback, dibs_loopback is provided by a config option.
Note that there is no way to dynamically add or remove the loopback
device. That could be a future improvement.

When moving code to drivers/dibs, replace ism_ prefix with dibs_ prefix.
As this is mostly a move of existing code, copyright and authors are
unchanged.

Link: https://lore.kernel.org/lkml/20240428060738.60843-1-guwen@linux.alibaba.com/ [1]
Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
Link: https://patch.msgid.link/20250918110500.1731261-7-wintera@linux.ibm.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Alexandra Winter 2025-09-18 13:04:52 +02:00 committed by Paolo Abeni
parent 269726968f
commit cb990a45d7
7 changed files with 140 additions and 1 deletions

View file

@ -121,6 +121,7 @@ CONFIG_UNIX_DIAG=m
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m
CONFIG_DIBS=y
CONFIG_DIBS_LO=y
CONFIG_SMC_DIAG=m
CONFIG_SMC_LO=y
CONFIG_INET=y

View file

@ -112,6 +112,7 @@ CONFIG_UNIX_DIAG=m
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m
CONFIG_DIBS=y
CONFIG_DIBS_LO=y
CONFIG_SMC_DIAG=m
CONFIG_SMC_LO=y
CONFIG_INET=y

View file

@ -10,3 +10,14 @@ config DIBS
Select this option to provide the abstraction layer between
dibs devices and dibs clients like the SMC protocol.
The module name is dibs.
config DIBS_LO
bool "intra-OS shortcut with dibs loopback"
depends on DIBS
default n
help
DIBS_LO enables the creation of an software-emulated dibs device
named lo which can be used for transferring data when communication
occurs within the same OS. This helps in convenient testing of
dibs clients, since dibs loopback is independent of architecture or
hardware.

View file

@ -5,3 +5,4 @@
dibs-y += dibs_main.o
obj-$(CONFIG_DIBS) += dibs.o
dibs-$(CONFIG_DIBS_LO) += dibs_loopback.o

View file

@ -0,0 +1,78 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Functions for dibs loopback/loopback-ism device.
*
* Copyright (c) 2024, Alibaba Inc.
*
* Author: Wen Gu <guwen@linux.alibaba.com>
* Tony Lu <tonylu@linux.alibaba.com>
*
*/
#include <linux/dibs.h>
#include <linux/slab.h>
#include <linux/types.h>
#include "dibs_loopback.h"
/* global loopback device */
static struct dibs_lo_dev *lo_dev;
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;
struct dibs_dev *dibs;
int ret;
ldev = kzalloc(sizeof(*ldev), GFP_KERNEL);
if (!ldev)
return -ENOMEM;
dibs = dibs_dev_alloc();
if (!dibs) {
kfree(ldev);
return -ENOMEM;
}
ldev->dibs = dibs;
ret = dibs_dev_add(dibs);
if (ret)
goto err_reg;
lo_dev = ldev;
return 0;
err_reg:
/* pairs with dibs_dev_alloc() */
kfree(dibs);
kfree(ldev);
return ret;
}
static void dibs_lo_dev_remove(void)
{
if (!lo_dev)
return;
dibs_lo_dev_exit(lo_dev);
/* pairs with dibs_dev_alloc() */
kfree(lo_dev->dibs);
kfree(lo_dev);
lo_dev = NULL;
}
int dibs_loopback_init(void)
{
return dibs_lo_dev_probe();
}
void dibs_loopback_exit(void)
{
dibs_lo_dev_remove();
}

View file

@ -0,0 +1,38 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* dibs loopback (aka loopback-ism) device structure definitions.
*
* Copyright (c) 2024, Alibaba Inc.
*
* Author: Wen Gu <guwen@linux.alibaba.com>
* Tony Lu <tonylu@linux.alibaba.com>
*
*/
#ifndef _DIBS_LOOPBACK_H
#define _DIBS_LOOPBACK_H
#include <linux/dibs.h>
#include <linux/types.h>
#include <linux/wait.h>
#if IS_ENABLED(CONFIG_DIBS_LO)
struct dibs_lo_dev {
struct dibs_dev *dibs;
};
int dibs_loopback_init(void);
void dibs_loopback_exit(void);
#else
static inline int dibs_loopback_init(void)
{
return 0;
}
static inline void dibs_loopback_exit(void)
{
}
#endif
#endif /* _DIBS_LOOPBACK_H */

View file

@ -15,6 +15,8 @@
#include <linux/err.h>
#include <linux/dibs.h>
#include "dibs_loopback.h"
MODULE_DESCRIPTION("Direct Internal Buffer Sharing class");
MODULE_LICENSE("GPL");
@ -96,14 +98,21 @@ EXPORT_SYMBOL_GPL(dibs_dev_del);
static int __init dibs_init(void)
{
int rc;
memset(clients, 0, sizeof(clients));
max_client = 0;
return 0;
rc = dibs_loopback_init();
if (rc)
pr_err("%s fails with %d\n", __func__, rc);
return rc;
}
static void __exit dibs_exit(void)
{
dibs_loopback_exit();
}
module_init(dibs_init);