[PATCH v2 05/13] drivers/base/test/test_async_driver_probe: convert to use seqnum_ops
From: Shuah Khan
Date: Fri Nov 13 2020 - 12:47:38 EST
Sequence Number api provides interfaces for unsigned atomic up counters
leveraging atomic_t and atomic64_t ops underneath.
atomic_t variables used to count errors, warns, keep track of timeout,
and async completion are counters. Convert them to use seqnum32 and init
counters to 0.
Signed-off-by: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
---
drivers/base/test/test_async_driver_probe.c | 28 +++++++++++++--------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/drivers/base/test/test_async_driver_probe.c b/drivers/base/test/test_async_driver_probe.c
index 3bb7beb127a9..75a3b617dcac 100644
--- a/drivers/base/test/test_async_driver_probe.c
+++ b/drivers/base/test/test_async_driver_probe.c
@@ -14,11 +14,15 @@
#include <linux/numa.h>
#include <linux/nodemask.h>
#include <linux/topology.h>
+#include <linux/seqnum_ops.h>
#define TEST_PROBE_DELAY (5 * 1000) /* 5 sec */
#define TEST_PROBE_THRESHOLD (TEST_PROBE_DELAY / 2)
-static atomic_t warnings, errors, timeout, async_completed;
+static struct seqnum32 warnings = SEQNUM_INIT(0);
+static struct seqnum32 errors = SEQNUM_INIT(0);
+static struct seqnum32 timeout = SEQNUM_INIT(0);
+static struct seqnum32 async_completed = SEQNUM_INIT(0);
static int test_probe(struct platform_device *pdev)
{
@@ -29,9 +33,9 @@ static int test_probe(struct platform_device *pdev)
* have then report it as an error, otherwise we wil sleep for the
* required amount of time and then report completion.
*/
- if (atomic_read(&timeout)) {
+ if (seqnum32_fetch(&timeout)) {
dev_err(dev, "async probe took too long\n");
- atomic_inc(&errors);
+ seqnum32_inc_return(&errors);
} else {
dev_dbg(&pdev->dev, "sleeping for %d msecs in probe\n",
TEST_PROBE_DELAY);
@@ -48,10 +52,10 @@ static int test_probe(struct platform_device *pdev)
dev_to_node(dev) != numa_node_id()) {
dev_warn(dev, "NUMA node mismatch %d != %d\n",
dev_to_node(dev), numa_node_id());
- atomic_inc(&warnings);
+ seqnum32_inc_return(&warnings);
}
- atomic_inc(&async_completed);
+ seqnum32_inc_return(&async_completed);
}
return 0;
@@ -244,11 +248,12 @@ static int __init test_async_probe_init(void)
* Otherwise if they completed without errors or warnings then
* report successful completion.
*/
- if (atomic_read(&async_completed) != async_id) {
+ if (seqnum32_fetch(&async_completed) != async_id) {
pr_err("async events still pending, forcing timeout\n");
- atomic_inc(&timeout);
+ seqnum32_inc_return(&timeout);
err = -ETIMEDOUT;
- } else if (!atomic_read(&errors) && !atomic_read(&warnings)) {
+ } else if (!seqnum32_fetch(&errors) &&
+ !seqnum32_fetch(&warnings)) {
pr_info("completed successfully\n");
return 0;
}
@@ -271,12 +276,13 @@ static int __init test_async_probe_init(void)
* errors or warnings being reported by the probe routine.
*/
if (err)
- atomic_inc(&errors);
+ seqnum32_inc_return(&errors);
else
err = -EINVAL;
- pr_err("Test failed with %d errors and %d warnings\n",
- atomic_read(&errors), atomic_read(&warnings));
+ pr_err("Test failed with %u errors and %u warnings\n",
+ seqnum32_fetch(&errors),
+ seqnum32_fetch(&warnings));
return err;
}
--
2.27.0