>From 4dc689c1439cc6f68989cdc2b5c177ec06002910 Mon Sep 17 00:00:00 2001 From: Akira Yokosawa <akiyks@xxxxxxxxx> Date: Mon, 8 Oct 2018 09:13:15 +0900 Subject: [PATCH 2/5] count: Fix uses of READ/WRITE_ONCE()s in count_end and count_tstat Add/remove READ_ONCE()/WRITE_ONCE()s to comply with the guideline to be expanded in toolsoftrade. Note on addition of READ_ONCE() while holding a lock: In read_count() of count_end.c, READ_ONCE() is added to access of *counterp[t] while holding final_mutex. This is because final_mutex protects only counterp[], but per-thread variables pointed to by the array are updated by the owning threads' inc_count(). Signed-off-by: Akira Yokosawa <akiyks@xxxxxxxxx> --- CodeSamples/count/count_end.c | 5 ++--- CodeSamples/count/count_tstat.c | 11 +++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CodeSamples/count/count_end.c b/CodeSamples/count/count_end.c index 94b9273..61f9d81 100644 --- a/CodeSamples/count/count_end.c +++ b/CodeSamples/count/count_end.c @@ -29,8 +29,7 @@ DEFINE_SPINLOCK(final_mutex); //\lnlbl{var:e} static __inline__ void inc_count(void) //\lnlbl{inc:b} { - WRITE_ONCE(counter, - READ_ONCE(counter) + 1); + WRITE_ONCE(counter, counter + 1); } //\lnlbl{inc:e} static __inline__ unsigned long read_count(void) @@ -42,7 +41,7 @@ static __inline__ unsigned long read_count(void) sum = finalcount; //\lnlbl{read:sum:init} for_each_thread(t) //\lnlbl{read:loop:b} if (counterp[t] != NULL) //\lnlbl{read:check} - sum += *counterp[t]; //\lnlbl{read:loop:e} + sum += READ_ONCE(*counterp[t]); //\lnlbl{read:loop:e} spin_unlock(&final_mutex); //\lnlbl{read:release} return sum; //\lnlbl{read:return} } diff --git a/CodeSamples/count/count_tstat.c b/CodeSamples/count/count_tstat.c index 4318bc3..4b99415 100644 --- a/CodeSamples/count/count_tstat.c +++ b/CodeSamples/count/count_tstat.c @@ -30,8 +30,7 @@ DEFINE_SPINLOCK(final_mutex); static __inline__ void inc_count(void) { - WRITE_ONCE(counter, - READ_ONCE(counter) + 1); + WRITE_ONCE(counter, counter + 1); } static __inline__ unsigned long read_count(void) @@ -41,8 +40,8 @@ static __inline__ unsigned long read_count(void) unsigned long sum = 0; for_each_thread(t) - if (counterp[t] != NULL) - sum += *counterp[t]; + if (READ_ONCE(counterp[t]) != NULL) + sum += READ_ONCE(*counterp[t]); return sum; } @@ -52,7 +51,7 @@ void count_init(void) //\fcvexclude //\fcvexclude void count_register_thread(unsigned long *p) { - counterp[smp_thread_id()] = &counter; + WRITE_ONCE(counterp[smp_thread_id()], &counter); } void count_unregister_thread(int nthreadsexpected) @@ -60,7 +59,7 @@ void count_unregister_thread(int nthreadsexpected) spin_lock(&final_mutex); finalthreadcount++; spin_unlock(&final_mutex); - while (finalthreadcount < nthreadsexpected) + while (READ_ONCE(finalthreadcount) < nthreadsexpected) poll(NULL, 0, 1); } //\end{snippet} -- 2.7.4