1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * DIBS - Direct Internal Buffer Sharing 4 * 5 * Implementation of the DIBS class module 6 * 7 * Copyright IBM Corp. 2025 8 */ 9 #define KMSG_COMPONENT "dibs" 10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 11 12 #include <linux/module.h> 13 #include <linux/types.h> 14 #include <linux/err.h> 15 #include <linux/dibs.h> 16 17 MODULE_DESCRIPTION("Direct Internal Buffer Sharing class"); 18 MODULE_LICENSE("GPL"); 19 20 /* use an array rather a list for fast mapping: */ 21 static struct dibs_client *clients[MAX_DIBS_CLIENTS]; 22 static u8 max_client; 23 static DEFINE_MUTEX(clients_lock); 24 25 int dibs_register_client(struct dibs_client *client) 26 { 27 int i, rc = -ENOSPC; 28 29 mutex_lock(&clients_lock); 30 for (i = 0; i < MAX_DIBS_CLIENTS; ++i) { 31 if (!clients[i]) { 32 clients[i] = client; 33 client->id = i; 34 if (i == max_client) 35 max_client++; 36 rc = 0; 37 break; 38 } 39 } 40 mutex_unlock(&clients_lock); 41 42 return rc; 43 } 44 EXPORT_SYMBOL_GPL(dibs_register_client); 45 46 int dibs_unregister_client(struct dibs_client *client) 47 { 48 int rc = 0; 49 50 mutex_lock(&clients_lock); 51 clients[client->id] = NULL; 52 if (client->id + 1 == max_client) 53 max_client--; 54 mutex_unlock(&clients_lock); 55 return rc; 56 } 57 EXPORT_SYMBOL_GPL(dibs_unregister_client); 58 59 static int __init dibs_init(void) 60 { 61 memset(clients, 0, sizeof(clients)); 62 max_client = 0; 63 64 return 0; 65 } 66 67 static void __exit dibs_exit(void) 68 { 69 } 70 71 module_init(dibs_init); 72 module_exit(dibs_exit); 73