Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "selftests: revocable: Add kselftest cases"

This reverts commit 9d4502fef00fa7a798d3c0806d4da4466a7ffc6f.

The new revocable functionality is fundamentally broken and at a minimum
needs to be redesigned.

Drop the revocable selftests to allow the implementation to be reverted.

Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260204142849.22055-2-johan@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Johan Hovold and committed by
Greg Kroah-Hartman
379a5aad f55ae0bf

-380
-1
MAINTAINERS
··· 22392 22392 F: drivers/base/revocable.c 22393 22393 F: drivers/base/revocable_test.c 22394 22394 F: include/linux/revocable.h 22395 - F: tools/testing/selftests/drivers/base/revocable/ 22396 22395 22397 22396 RFKILL 22398 22397 M: Johannes Berg <johannes@sipsolutions.net>
-7
tools/testing/selftests/drivers/base/revocable/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0 2 - 3 - TEST_GEN_MODS_DIR := test_modules 4 - TEST_GEN_PROGS_EXTENDED := revocable_test 5 - TEST_PROGS := test-revocable.sh 6 - 7 - include ../../../lib.mk
-136
tools/testing/selftests/drivers/base/revocable/revocable_test.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* 3 - * Copyright 2026 Google LLC 4 - * 5 - * A selftest for the revocable API. 6 - * 7 - * The test cases cover the following scenarios: 8 - * 9 - * - Basic: Verifies that a consumer can successfully access the resource 10 - * provided via the provider. 11 - * 12 - * - Revocation: Verifies that after the provider revokes the resource, 13 - * the consumer correctly receives a NULL pointer on a subsequent access. 14 - * 15 - * - Try Access Macro: Same as "Revocation" but uses the 16 - * REVOCABLE_TRY_ACCESS_WITH() and REVOCABLE_TRY_ACCESS_SCOPED(). 17 - */ 18 - 19 - #include <fcntl.h> 20 - #include <unistd.h> 21 - 22 - #include "../../../kselftest_harness.h" 23 - 24 - #define DEBUGFS_PATH "/sys/kernel/debug/revocable_test" 25 - #define TEST_CMD_RESOURCE_GONE "resource_gone" 26 - #define TEST_DATA "12345678" 27 - #define TEST_MAGIC_OFFSET 0x1234 28 - #define TEST_MAGIC_OFFSET2 0x5678 29 - 30 - FIXTURE(revocable_fixture) { 31 - int pfd; 32 - int cfd; 33 - }; 34 - 35 - FIXTURE_SETUP(revocable_fixture) { 36 - int ret; 37 - 38 - self->pfd = open(DEBUGFS_PATH "/provider", O_WRONLY); 39 - ASSERT_NE(-1, self->pfd) 40 - TH_LOG("failed to open provider fd"); 41 - 42 - ret = write(self->pfd, TEST_DATA, strlen(TEST_DATA)); 43 - ASSERT_NE(-1, ret) { 44 - close(self->pfd); 45 - TH_LOG("failed to write test data"); 46 - } 47 - 48 - self->cfd = open(DEBUGFS_PATH "/consumer", O_RDONLY); 49 - ASSERT_NE(-1, self->cfd) 50 - TH_LOG("failed to open consumer fd"); 51 - } 52 - 53 - FIXTURE_TEARDOWN(revocable_fixture) { 54 - close(self->cfd); 55 - close(self->pfd); 56 - } 57 - 58 - /* 59 - * ASSERT_* is only available in TEST or TEST_F block. Use 60 - * macro for the helper. 61 - */ 62 - #define READ_TEST_DATA(_fd, _offset, _data, _msg) \ 63 - do { \ 64 - int ret; \ 65 - \ 66 - ret = lseek(_fd, _offset, SEEK_SET); \ 67 - ASSERT_NE(-1, ret) \ 68 - TH_LOG("failed to lseek"); \ 69 - \ 70 - ret = read(_fd, _data, sizeof(_data) - 1); \ 71 - ASSERT_NE(-1, ret) \ 72 - TH_LOG(_msg); \ 73 - data[ret] = '\0'; \ 74 - } while (0) 75 - 76 - TEST_F(revocable_fixture, basic) { 77 - char data[16]; 78 - 79 - READ_TEST_DATA(self->cfd, 0, data, "failed to read test data"); 80 - EXPECT_STREQ(TEST_DATA, data); 81 - } 82 - 83 - TEST_F(revocable_fixture, revocation) { 84 - char data[16]; 85 - int ret; 86 - 87 - READ_TEST_DATA(self->cfd, 0, data, "failed to read test data"); 88 - EXPECT_STREQ(TEST_DATA, data); 89 - 90 - ret = write(self->pfd, TEST_CMD_RESOURCE_GONE, 91 - strlen(TEST_CMD_RESOURCE_GONE)); 92 - ASSERT_NE(-1, ret) 93 - TH_LOG("failed to write resource gone cmd"); 94 - 95 - READ_TEST_DATA(self->cfd, 0, data, 96 - "failed to read test data after resource gone"); 97 - EXPECT_STREQ("(null)", data); 98 - } 99 - 100 - TEST_F(revocable_fixture, try_access_macro) { 101 - char data[16]; 102 - int ret; 103 - 104 - READ_TEST_DATA(self->cfd, TEST_MAGIC_OFFSET, data, 105 - "failed to read test data"); 106 - EXPECT_STREQ(TEST_DATA, data); 107 - 108 - ret = write(self->pfd, TEST_CMD_RESOURCE_GONE, 109 - strlen(TEST_CMD_RESOURCE_GONE)); 110 - ASSERT_NE(-1, ret) 111 - TH_LOG("failed to write resource gone cmd"); 112 - 113 - READ_TEST_DATA(self->cfd, TEST_MAGIC_OFFSET, data, 114 - "failed to read test data after resource gone"); 115 - EXPECT_STREQ("(null)", data); 116 - } 117 - 118 - TEST_F(revocable_fixture, try_access_macro2) { 119 - char data[16]; 120 - int ret; 121 - 122 - READ_TEST_DATA(self->cfd, TEST_MAGIC_OFFSET2, data, 123 - "failed to read test data"); 124 - EXPECT_STREQ(TEST_DATA, data); 125 - 126 - ret = write(self->pfd, TEST_CMD_RESOURCE_GONE, 127 - strlen(TEST_CMD_RESOURCE_GONE)); 128 - ASSERT_NE(-1, ret) 129 - TH_LOG("failed to write resource gone cmd"); 130 - 131 - READ_TEST_DATA(self->cfd, TEST_MAGIC_OFFSET2, data, 132 - "failed to read test data after resource gone"); 133 - EXPECT_STREQ("(null)", data); 134 - } 135 - 136 - TEST_HARNESS_MAIN
-39
tools/testing/selftests/drivers/base/revocable/test-revocable.sh
··· 1 - #!/bin/bash 2 - # SPDX-License-Identifier: GPL-2.0 3 - 4 - mod_name="revocable_test" 5 - ksft_fail=1 6 - ksft_skip=4 7 - 8 - if [ "$(id -u)" -ne 0 ]; then 9 - echo "$0: Must be run as root" 10 - exit "$ksft_skip" 11 - fi 12 - 13 - if ! which insmod > /dev/null 2>&1; then 14 - echo "$0: Need insmod" 15 - exit "$ksft_skip" 16 - fi 17 - 18 - if ! which rmmod > /dev/null 2>&1; then 19 - echo "$0: Need rmmod" 20 - exit "$ksft_skip" 21 - fi 22 - 23 - insmod test_modules/"${mod_name}".ko 24 - 25 - if [ ! -d /sys/kernel/debug/revocable_test/ ]; then 26 - mount -t debugfs none /sys/kernel/debug/ 27 - 28 - if [ ! -d /sys/kernel/debug/revocable_test/ ]; then 29 - echo "$0: Error mounting debugfs" 30 - exit "$ksft_fail" 31 - fi 32 - fi 33 - 34 - ./revocable_test 35 - ret=$? 36 - 37 - rmmod "${mod_name}" 38 - 39 - exit "${ret}"
-10
tools/testing/selftests/drivers/base/revocable/test_modules/Makefile
··· 1 - TESTMODS_DIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) 2 - KDIR ?= /lib/modules/$(shell uname -r)/build 3 - 4 - obj-m += revocable_test.o 5 - 6 - all: 7 - $(Q)$(MAKE) -C $(KDIR) M=$(TESTMODS_DIR) 8 - 9 - clean: 10 - $(Q)$(MAKE) -C $(KDIR) M=$(TESTMODS_DIR) clean
-187
tools/testing/selftests/drivers/base/revocable/test_modules/revocable_test.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* 3 - * Copyright 2026 Google LLC 4 - * 5 - * A kernel module for testing the revocable API. 6 - */ 7 - 8 - #include <linux/debugfs.h> 9 - #include <linux/module.h> 10 - #include <linux/revocable.h> 11 - #include <linux/slab.h> 12 - 13 - #define TEST_CMD_RESOURCE_GONE "resource_gone" 14 - #define TEST_MAGIC_OFFSET 0x1234 15 - #define TEST_MAGIC_OFFSET2 0x5678 16 - 17 - static struct dentry *debugfs_dir; 18 - 19 - struct revocable_test_provider_priv { 20 - struct revocable_provider __rcu *rp; 21 - struct dentry *dentry; 22 - char res[16]; 23 - }; 24 - 25 - static int revocable_test_consumer_open(struct inode *inode, struct file *filp) 26 - { 27 - filp->private_data = inode->i_private; 28 - return 0; 29 - } 30 - 31 - static ssize_t revocable_test_consumer_read(struct file *filp, 32 - char __user *buf, 33 - size_t count, loff_t *offset) 34 - { 35 - int ret; 36 - char *res; 37 - char data[16]; 38 - size_t len; 39 - struct revocable rev; 40 - struct revocable_provider __rcu *rp = filp->private_data; 41 - 42 - switch (*offset) { 43 - case 0: 44 - ret = revocable_init(rp, &rev); 45 - if (ret) { 46 - snprintf(data, sizeof(data), "%s", "(null)"); 47 - break; 48 - } 49 - res = revocable_try_access(&rev); 50 - snprintf(data, sizeof(data), "%s", res ?: "(null)"); 51 - revocable_withdraw_access(&rev); 52 - revocable_deinit(&rev); 53 - break; 54 - case TEST_MAGIC_OFFSET: 55 - { 56 - REVOCABLE_TRY_ACCESS_WITH(rp, res); 57 - snprintf(data, sizeof(data), "%s", res ?: "(null)"); 58 - } 59 - break; 60 - case TEST_MAGIC_OFFSET2: 61 - REVOCABLE_TRY_ACCESS_SCOPED(rp, res) 62 - snprintf(data, sizeof(data), "%s", res ?: "(null)"); 63 - break; 64 - default: 65 - return 0; 66 - } 67 - 68 - len = min_t(size_t, strlen(data), count); 69 - if (copy_to_user(buf, data, len)) 70 - return -EFAULT; 71 - 72 - *offset = len; 73 - return len; 74 - } 75 - 76 - static const struct file_operations revocable_test_consumer_fops = { 77 - .open = revocable_test_consumer_open, 78 - .read = revocable_test_consumer_read, 79 - .llseek = default_llseek, 80 - }; 81 - 82 - static int revocable_test_provider_open(struct inode *inode, struct file *filp) 83 - { 84 - struct revocable_test_provider_priv *priv; 85 - 86 - priv = kzalloc(sizeof(*priv), GFP_KERNEL); 87 - if (!priv) 88 - return -ENOMEM; 89 - filp->private_data = priv; 90 - 91 - return 0; 92 - } 93 - 94 - static int revocable_test_provider_release(struct inode *inode, 95 - struct file *filp) 96 - { 97 - struct revocable_test_provider_priv *priv = filp->private_data; 98 - 99 - debugfs_remove(priv->dentry); 100 - if (unrcu_pointer(priv->rp)) 101 - revocable_provider_revoke(&priv->rp); 102 - kfree(priv); 103 - 104 - return 0; 105 - } 106 - 107 - static ssize_t revocable_test_provider_write(struct file *filp, 108 - const char __user *buf, 109 - size_t count, loff_t *offset) 110 - { 111 - size_t copied; 112 - char data[64]; 113 - struct revocable_test_provider_priv *priv = filp->private_data; 114 - 115 - copied = strncpy_from_user(data, buf, sizeof(data)); 116 - if (copied < 0) 117 - return copied; 118 - if (copied == sizeof(data)) 119 - data[sizeof(data) - 1] = '\0'; 120 - 121 - /* 122 - * Note: The test can't just close the FD for signaling the 123 - * resource gone. Subsequent file operations on the opening 124 - * FD of debugfs return -EIO after calling debugfs_remove(). 125 - * See also debugfs_file_get(). 126 - * 127 - * Here is a side command channel for signaling the resource 128 - * gone. 129 - */ 130 - if (!strcmp(data, TEST_CMD_RESOURCE_GONE)) { 131 - revocable_provider_revoke(&priv->rp); 132 - rcu_assign_pointer(priv->rp, NULL); 133 - } else { 134 - if (priv->res[0] != '\0') 135 - return 0; 136 - 137 - strscpy(priv->res, data); 138 - 139 - priv->rp = revocable_provider_alloc(&priv->res); 140 - if (!unrcu_pointer(priv->rp)) 141 - return -ENOMEM; 142 - 143 - priv->dentry = debugfs_create_file("consumer", 0400, 144 - debugfs_dir, 145 - unrcu_pointer(priv->rp), 146 - &revocable_test_consumer_fops); 147 - if (!priv->dentry) { 148 - revocable_provider_revoke(&priv->rp); 149 - return -ENOMEM; 150 - } 151 - } 152 - 153 - return copied; 154 - } 155 - 156 - static const struct file_operations revocable_test_provider_fops = { 157 - .open = revocable_test_provider_open, 158 - .release = revocable_test_provider_release, 159 - .write = revocable_test_provider_write, 160 - }; 161 - 162 - static int __init revocable_test_init(void) 163 - { 164 - debugfs_dir = debugfs_create_dir("revocable_test", NULL); 165 - if (!debugfs_dir) 166 - return -ENOMEM; 167 - 168 - if (!debugfs_create_file("provider", 0200, debugfs_dir, NULL, 169 - &revocable_test_provider_fops)) { 170 - debugfs_remove_recursive(debugfs_dir); 171 - return -ENOMEM; 172 - } 173 - 174 - return 0; 175 - } 176 - 177 - static void __exit revocable_test_exit(void) 178 - { 179 - debugfs_remove_recursive(debugfs_dir); 180 - } 181 - 182 - module_init(revocable_test_init); 183 - module_exit(revocable_test_exit); 184 - 185 - MODULE_LICENSE("GPL"); 186 - MODULE_AUTHOR("Tzung-Bi Shih <tzungbi@kernel.org>"); 187 - MODULE_DESCRIPTION("Revocable Kselftest");