Add selftest case to verify DEFINE_REVOCABLE() can successfully access the resource.
Signed-off-by: Tzung-Bi Shih <[email protected]> --- .../drivers/base/revocable/revocable_test.c | 12 ++++++ .../revocable/test_modules/revocable_test.c | 37 +++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/drivers/base/revocable/revocable_test.c b/tools/testing/selftests/drivers/base/revocable/revocable_test.c index f024164e9273..723e5ea9ec84 100644 --- a/tools/testing/selftests/drivers/base/revocable/revocable_test.c +++ b/tools/testing/selftests/drivers/base/revocable/revocable_test.c @@ -14,6 +14,9 @@ * * - Try Access Macro: Same as "Revocation" but uses the * REVOCABLE_TRY_ACCESS_WITH() and REVOCABLE_TRY_ACCESS_SCOPED(). + * + * - Define Macro: Verifies DEFINE_REVOCABLE() can successfully access the + * resource. */ #include <fcntl.h> @@ -26,6 +29,7 @@ #define TEST_DATA "12345678" #define TEST_MAGIC_OFFSET 0x1234 #define TEST_MAGIC_OFFSET2 0x5678 +#define TEST_MAGIC_OFFSET3 0x9abc FIXTURE(revocable_fixture) { int pfd; @@ -133,4 +137,12 @@ TEST_F(revocable_fixture, try_access_macro2) { EXPECT_STREQ("(null)", data); } +TEST_F(revocable_fixture, define_macro) { + char data[16]; + + READ_TEST_DATA(self->cfd, TEST_MAGIC_OFFSET3, data, + "failed to read test data"); + EXPECT_STREQ(TEST_DATA, data); +} + TEST_HARNESS_MAIN diff --git a/tools/testing/selftests/drivers/base/revocable/test_modules/revocable_test.c b/tools/testing/selftests/drivers/base/revocable/test_modules/revocable_test.c index 1b0692eb75f3..d3bd0ce3a645 100644 --- a/tools/testing/selftests/drivers/base/revocable/test_modules/revocable_test.c +++ b/tools/testing/selftests/drivers/base/revocable/test_modules/revocable_test.c @@ -13,6 +13,7 @@ #define TEST_CMD_RESOURCE_GONE "resource_gone" #define TEST_MAGIC_OFFSET 0x1234 #define TEST_MAGIC_OFFSET2 0x5678 +#define TEST_MAGIC_OFFSET3 0x9abc static struct dentry *debugfs_dir; @@ -22,15 +23,27 @@ struct revocable_test_provider_priv { char res[16]; }; +struct revocable_test_consumer_priv { + struct revocable_provider *rp; + struct revocable *rev; +}; + static int revocable_test_consumer_open(struct inode *inode, struct file *filp) { - struct revocable *rev; struct revocable_provider *rp = inode->i_private; + struct revocable_test_consumer_priv *priv; - rev = revocable_alloc(rp); - if (!rev) + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) return -ENOMEM; - filp->private_data = rev; + + priv->rp = rp; + priv->rev = revocable_alloc(rp); + if (!priv->rev) { + kfree(priv); + return -ENOMEM; + } + filp->private_data = priv; return 0; } @@ -38,9 +51,10 @@ static int revocable_test_consumer_open(struct inode *inode, struct file *filp) static int revocable_test_consumer_release(struct inode *inode, struct file *filp) { - struct revocable *rev = filp->private_data; + struct revocable_test_consumer_priv *priv = filp->private_data; - revocable_free(rev); + revocable_free(priv->rev); + kfree(priv); return 0; } @@ -51,7 +65,8 @@ static ssize_t revocable_test_consumer_read(struct file *filp, char *res; char data[16]; size_t len; - struct revocable *rev = filp->private_data; + struct revocable_test_consumer_priv *priv = filp->private_data; + struct revocable *rev = priv->rev; switch (*offset) { case 0: @@ -69,6 +84,14 @@ static ssize_t revocable_test_consumer_read(struct file *filp, REVOCABLE_TRY_ACCESS_SCOPED(rev, res) snprintf(data, sizeof(data), "%s", res ?: "(null)"); break; + case TEST_MAGIC_OFFSET3: + { + DEFINE_REVOCABLE(rev_on_stack, priv->rp); + + REVOCABLE_TRY_ACCESS_WITH(rev_on_stack, res); + snprintf(data, sizeof(data), "%s", res ?: "(null)"); + } + break; default: return 0; } -- 2.52.0.457.g6b5491de43-goog
