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 <[email protected]>
---
 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

Reply via email to