Commit cb990a45 authored by Alexandra Winter's avatar Alexandra Winter Committed by Paolo Abeni
Browse files

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: default avatarAlexandra Winter <wintera@linux.ibm.com>
Link: https://patch.msgid.link/20250918110500.1731261-7-wintera@linux.ibm.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 26972696
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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.
+1 −0
Original line number Diff line number Diff line
@@ -5,3 +5,4 @@

dibs-y += dibs_main.o
obj-$(CONFIG_DIBS) += dibs.o
dibs-$(CONFIG_DIBS_LO) += dibs_loopback.o
 No newline at end of file
+78 −0
Original line number Diff line number Diff line
// 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();
}
Loading