mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
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:
parent
269726968f
commit
cb990a45d7
7 changed files with 140 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -5,3 +5,4 @@
|
|||
|
||||
dibs-y += dibs_main.o
|
||||
obj-$(CONFIG_DIBS) += dibs.o
|
||||
dibs-$(CONFIG_DIBS_LO) += dibs_loopback.o
|
||||
78
drivers/dibs/dibs_loopback.c
Normal file
78
drivers/dibs/dibs_loopback.c
Normal 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();
|
||||
}
|
||||
38
drivers/dibs/dibs_loopback.h
Normal file
38
drivers/dibs/dibs_loopback.h
Normal 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 */
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue