From nobody Mon Feb 9 12:25:36 2026 Received: from mail-yw1-f175.google.com (mail-yw1-f175.google.com [209.85.128.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F8F443E493 for ; Fri, 6 Feb 2026 19:13:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770405194; cv=none; b=PYUgUZiXXXodVOIVQ3O9Qodt3qawSw7BBSQZOlYfa+RwHCL9x0mz9Vvn5zsP4wnSFKZpLuhFBsN7CjQKAudW7z7lJTqCsACcRIkYRng+U/5gd6dzq43ptWw3Cjzvc0UCwmF7Tk9+OPzYaHXAx3nu90J24nRX4Oj18eAAMKAhvtc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770405194; c=relaxed/simple; bh=K/DVzBOCmPx/5xulxQPQA2jh8fJo6vYnCVmEwIInAPw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dOycXW+3XTpBFRZkqCqF6LUkJTn1Sdcenpxbvevy+JXKxEmC1JSbM/Q6qKT5SjcheovCeQ8Ht8Ro8bL9TaGA/XhttK22tD5PnznqQhxEVwveO2a2YO/cRNnGDCgAckPX74dA+/tc5lqn+BxwRhin8xENftUxzmVZjDkeFB7pXXo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dubeyko.com; spf=pass smtp.mailfrom=dubeyko.com; dkim=pass (2048-bit key) header.d=dubeyko-com.20230601.gappssmtp.com header.i=@dubeyko-com.20230601.gappssmtp.com header.b=GoJSOBy5; arc=none smtp.client-ip=209.85.128.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dubeyko.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=dubeyko.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dubeyko-com.20230601.gappssmtp.com header.i=@dubeyko-com.20230601.gappssmtp.com header.b="GoJSOBy5" Received: by mail-yw1-f175.google.com with SMTP id 00721157ae682-794ed669269so40449737b3.1 for ; Fri, 06 Feb 2026 11:13:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dubeyko-com.20230601.gappssmtp.com; s=20230601; t=1770405193; x=1771009993; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Hp7dE9rfuLorTfLe8+rhBEONpAq5JPSPoipR3P8yp2s=; b=GoJSOBy5vbp0HCrKs9pVp1eQlwvUg7H3Me6IfbkTJqTi6s/0Scgya6AiM5ls2dOqvU YrF8cAmBYUjLxkGR5uGOkU8ptIX42ZPDpkLFDvuXZEmfbcakzhc60CHARBFLqNiFy2r4 bPD+U2zxaacb6A5X3eoL8R9gj3zRSj5dWM2wthcPVvFrBGrvOEEq4QiJ6v0XuIoet4P6 mVPzTLV9waiCKS3dlD0/kF6NZxwbMS18uC4tmKOimgew/lOdZDTyNAg4wjZ1OYBUEu4G p9fbruLPt9aXlkor7SYjgr5db1ODXZxeSVBOeyE6D1mcMYgEM4FLRlwzioUJ3HbhsShG UH1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770405193; x=1771009993; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Hp7dE9rfuLorTfLe8+rhBEONpAq5JPSPoipR3P8yp2s=; b=KKTVpBljHuZHmV/ECr+ghr5RLczfozd69FwVVWCOi+jxDorSr5M3D2gJIW5ZZkREPf iqmn9p2Jqok5AbksuvT0aiArsP8cYlv0FgRXG0Nl6auEBceMwklvsZgPFvI25TjNSE35 PXIgIZ0L8nqbPKEYFxQjZF/+kHXMKqlovqqedGF5w9PIzhtkzHMl9hUH0ZvzOEecvqKj oz5R4Kz98Iwxqe4ZBMjTRcOyQH/xej01eMfJ51OxyQq8HbnHmA/w7WZxq5ADe3XMJJIo YD8dUBJVlBCL92l0+EzFl7AoNEQIfeSisGzaWG6+y1ALWrieh4tFiAb+XNDWxWn3BNas Rh+w== X-Forwarded-Encrypted: i=1; AJvYcCVQnv4m350d41kVZfwT+yQLD5JRYSxPfzJXHhYWYL+QxduvAyH20BVKC5sVM4kF/lGNjb6cGom08rL9+kA=@vger.kernel.org X-Gm-Message-State: AOJu0YwLW4AnN+21x0kv+crJhuS4x0vULAQhherXK8og4dDlRvbElyI+ KGKTjfon0jC8z8Kz7pQs7Ihhlv6ZDokynvT7IgOOtwzhIPGPBiRMxjjzLtuErlOGe23fKpJjH3r lWrNiEQQ= X-Gm-Gg: AZuq6aIxR6psllb0Cg/UtdWuPx9okTv4Ex9h9CHdbzF3ZGT2sQrd+G/QSOHESGkXZd9 l4EAdcoCng3Ggff898hZ90bkBasFpOKMdanc0MiU53TF8I+7HCnr3zFXaeBiaqfnQuohn2kJPoi ByEx9bUpMpgned/BC7skIe9d17ldT8u6zb8XheC3XRc5Ors+LKZ0PTcukbDj/gMMm3dn8bfwUQV 1U9zAtUUpcM+6YOAqWoEetm5VJSOnTfyTjCLyaFi8mR3VGxAauSfNMZGlzQhZCKaUOtfxwMZuRh it+k+9yFp7HEoVY4P1Zsz9XkJJAvPlw8JvYTJNzdAas+mK6cbSAd+cNjuA3TKjcfIALjiteqAGT y/8ZfXP0tWTwF6zSM1hOLeQAApPspNnCk6ULe6y6JqtS7Ryh/rpGNoeQMNqbC9yBbUfc7CIM8J/ mQL/kvcL/Ckqel+W5c6SoHuCon0AjTdqUXPnHpccDtu+mSCJKCEfT3oj09jnP5MUE+M8uPgrxof YylbuJFG/fV X-Received: by 2002:a05:690c:d8b:b0:788:181b:86c1 with SMTP id 00721157ae682-7952a63e4bcmr38138647b3.5.1770405193303; Fri, 06 Feb 2026 11:13:13 -0800 (PST) Received: from pop-os.attlocal.net ([2600:1700:6476:1430:9fc0:ed7d:72bd:ecd1]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7952a28697fsm29051277b3.50.2026.02.06.11.13.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 11:13:12 -0800 (PST) From: Viacheslav Dubeyko To: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, bpf@vger.kernel.org Cc: Slava.Dubeyko@ibm.com, slava@dubeyko.com, linux-kernel@vger.kernel.org Subject: [RFC PATCH v1 4/4] ml-lib: Implement simple user-space testing application Date: Fri, 6 Feb 2026 11:11:36 -0800 Message-Id: <20260206191136.2609767-5-slava@dubeyko.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260206191136.2609767-1-slava@dubeyko.com> References: <20260206191136.2609767-1-slava@dubeyko.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement simple user-space testing application Signed-off-by: Viacheslav Dubeyko --- .../test_application/ml_lib_char_dev_ioctl.h | 21 ++ .../test_application/test_ml_lib_char_dev.c | 206 ++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 lib/ml-lib/test_driver/test_application/ml_lib_char_dev= _ioctl.h create mode 100644 lib/ml-lib/test_driver/test_application/test_ml_lib_cha= r_dev.c diff --git a/lib/ml-lib/test_driver/test_application/ml_lib_char_dev_ioctl.= h b/lib/ml-lib/test_driver/test_application/ml_lib_char_dev_ioctl.h new file mode 100644 index 000000000000..7ea74e840fda --- /dev/null +++ b/lib/ml-lib/test_driver/test_application/ml_lib_char_dev_ioctl.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Machine Learning (ML) library + * + * Userspace API for ml_lib_dev testing driver + * + * Copyright (C) 2025-2026 Viacheslav Dubeyko + */ + +#ifndef _ML_LIB_TEST_DEV_IOCTL_H +#define _ML_LIB_TEST_DEV_IOCTL_H + +#include + +/* IOCTL commands */ +#define ML_LIB_TEST_DEV_IOC_MAGIC 'M' +#define ML_LIB_TEST_DEV_IOCRESET _IO(ML_LIB_TEST_DEV_IOC_MAGIC, 0) +#define ML_LIB_TEST_DEV_IOCGETSIZE _IOR(ML_LIB_TEST_DEV_IOC_MAGIC, 1, int) +#define ML_LIB_TEST_DEV_IOCSETSIZE _IOW(ML_LIB_TEST_DEV_IOC_MAGIC, 2, int) + +#endif /* _ML_LIB_TEST_DEV_IOCTL_H */ diff --git a/lib/ml-lib/test_driver/test_application/test_ml_lib_char_dev.c= b/lib/ml-lib/test_driver/test_application/test_ml_lib_char_dev.c new file mode 100644 index 000000000000..432b8a0ad068 --- /dev/null +++ b/lib/ml-lib/test_driver/test_application/test_ml_lib_char_dev.c @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Machine Learning (ML) library + * + * Test program for ml_lib_dev testing driver + * + * Copyright (C) 2025-2026 Viacheslav Dubeyko + * + * Compile with: gcc -o test_ml_lib_char_dev test_ml_lib_char_dev.c + * Run with: sudo ./test_ml_lib_char_dev + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "ml_lib_char_dev_ioctl.h" + +#define DEVICE_PATH "/dev/mllibdev" +#define SYSFS_BASE "/sys/class/ml_lib_test/mllibdev" +#define PROC_PATH "/proc/mllibdev" + +static void print_separator(const char *title) +{ + printf("\n=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D %s =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D\n", title); +} + +static void read_sysfs_attr(const char *attr_name) +{ + char path[256]; + char buffer[256]; + FILE *fp; + + snprintf(path, sizeof(path), "%s/%s", SYSFS_BASE, attr_name); + fp =3D fopen(path, "r"); + if (!fp) { + perror("Failed to open sysfs attribute"); + return; + } + + if (fgets(buffer, sizeof(buffer), fp)) { + printf(" %s: %s", attr_name, buffer); + } + + fclose(fp); +} + +static void show_sysfs_info(void) +{ + print_separator("Sysfs Attributes"); + read_sysfs_attr("buffer_size"); + read_sysfs_attr("data_size"); + read_sysfs_attr("access_count"); + printf("\n"); + read_sysfs_attr("stats"); +} + +static void show_proc_info(void) +{ + char buffer[1024]; + FILE *fp; + + print_separator("Procfs Information"); + + fp =3D fopen(PROC_PATH, "r"); + if (!fp) { + perror("Failed to open procfs entry"); + return; + } + + while (fgets(buffer, sizeof(buffer), fp)) { + printf("%s", buffer); + } + + fclose(fp); +} + +static void test_write(int fd) +{ + const char *test_data =3D "Hello from userspace! This is a test of the ml= libdev driver."; + ssize_t ret; + + print_separator("Write Test"); + + ret =3D write(fd, test_data, strlen(test_data)); + if (ret < 0) { + perror("Write failed"); + return; + } + + printf("Successfully wrote %zd bytes\n", ret); + printf("Data: \"%s\"\n", test_data); +} + +static void test_read(int fd) +{ + char buffer[256]; + ssize_t ret; + + print_separator("Read Test"); + + /* Seek to beginning */ + lseek(fd, 0, SEEK_SET); + + ret =3D read(fd, buffer, sizeof(buffer) - 1); + if (ret < 0) { + perror("Read failed"); + return; + } + + buffer[ret] =3D '\0'; + printf("Successfully read %zd bytes\n", ret); + printf("Data: \"%s\"\n", buffer); +} + +static void test_ioctl(int fd) +{ + int size; + int ret; + + print_separator("IOCTL Tests"); + + /* Get current size */ + ret =3D ioctl(fd, ML_LIB_TEST_DEV_IOCGETSIZE, &size); + if (ret < 0) { + perror("IOCTL GETSIZE failed"); + return; + } + printf("Current data size: %d bytes\n", size); + + /* Set new size */ + size =3D 50; + ret =3D ioctl(fd, ML_LIB_TEST_DEV_IOCSETSIZE, &size); + if (ret < 0) { + perror("IOCTL SETSIZE failed"); + return; + } + printf("Set data size to: %d bytes\n", size); + + /* Verify new size */ + ret =3D ioctl(fd, ML_LIB_TEST_DEV_IOCGETSIZE, &size); + if (ret < 0) { + perror("IOCTL GETSIZE failed"); + return; + } + printf("Verified new size: %d bytes\n", size); + + /* Reset buffer */ + ret =3D ioctl(fd, ML_LIB_TEST_DEV_IOCRESET); + if (ret < 0) { + perror("IOCTL RESET failed"); + return; + } + printf("Buffer reset successfully\n"); + + /* Verify size after reset */ + ret =3D ioctl(fd, ML_LIB_TEST_DEV_IOCGETSIZE, &size); + if (ret < 0) { + perror("IOCTL GETSIZE failed"); + return; + } + printf("Size after reset: %d bytes\n", size); +} + +int main(void) +{ + int fd; + + printf("ML Library Testing Device Driver Test Program\n"); + printf("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n"); + + /* Open the device */ + fd =3D open(DEVICE_PATH, O_RDWR); + if (fd < 0) { + perror("Failed to open device"); + printf("\nMake sure:\n"); + printf("1. The driver module is loaded (lsmod | grep mllibdev)\n"); + printf("2. You have proper permissions (run with sudo)\n"); + printf("3. The device node exists (ls -l /dev/mllibdev)\n"); + return 1; + } + + printf("Device opened successfully: %s\n", DEVICE_PATH); + + /* Run tests */ + test_write(fd); + test_read(fd); + test_ioctl(fd); + + /* Show sysfs and proc information */ + show_sysfs_info(); + show_proc_info(); + + /* Final stats */ + print_separator("Final Test"); + printf("All tests completed successfully!\n\n"); + + /* Close the device */ + close(fd); + + return 0; +} --=20 2.34.1