[PATCH 1/4] blktrace: use rcu calls to access q->blk_trace

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Since request queue's blk_trace member is been markds as __rcu,
replace xchg() and cmdxchg() calls with appropriate rcu API.
This removes the sparse warnings.

The xchg() call is replaced with rcu_replace_pointer() since all the
calls for xchg are protected are q->blk_trace_mutex. On replacing
the pointer rcu_replace_pointer returns the old value if that value is
NULL then existing code returns an error.

In setup functions cmpxchg() call is replaced with calls to
rcu_dereference_pointer() and rcu_replace_pointer(). The first
dereference pointer call returns the existing value. If the value is
not NULL existing code returns an error, otherwise the second call to
replace pointer sets the new value.        

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@xxxxxxx>
---
 kernel/trace/blktrace.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index ea47f2084087..27c19db01ba4 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -344,7 +344,8 @@ static int __blk_trace_remove(struct request_queue *q)
 {
 	struct blk_trace *bt;
 
-	bt = xchg(&q->blk_trace, NULL);
+	bt = rcu_replace_pointer(q->blk_trace, NULL,
+				 lockdep_is_held(&q->blk_trace_mutex));
 	if (!bt)
 		return -EINVAL;
 
@@ -544,9 +545,13 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
 	bt->trace_state = Blktrace_setup;
 
 	ret = -EBUSY;
-	if (cmpxchg(&q->blk_trace, NULL, bt))
+	if (rcu_dereference_protected(q->blk_trace,
+				      lockdep_is_held(&q->blk_trace_mutex)))
 		goto err;
 
+	rcu_replace_pointer(q->blk_trace, bt,
+			    lockdep_is_held(&q->blk_trace_mutex));
+
 	get_probe_ref();
 
 	ret = 0;
@@ -1637,7 +1642,8 @@ static int blk_trace_remove_queue(struct request_queue *q)
 {
 	struct blk_trace *bt;
 
-	bt = xchg(&q->blk_trace, NULL);
+	bt = rcu_replace_pointer(q->blk_trace, NULL,
+				 lockdep_is_held(&q->blk_trace_mutex));
 	if (bt == NULL)
 		return -EINVAL;
 
@@ -1670,9 +1676,13 @@ static int blk_trace_setup_queue(struct request_queue *q,
 	blk_trace_setup_lba(bt, bdev);
 
 	ret = -EBUSY;
-	if (cmpxchg(&q->blk_trace, NULL, bt))
+	if (rcu_dereference_protected(q->blk_trace,
+				      lockdep_is_held(&q->blk_trace_mutex)))
 		goto free_bt;
 
+	rcu_replace_pointer(q->blk_trace, bt,
+			    lockdep_is_held(&q->blk_trace_mutex));
+
 	get_probe_ref();
 	return 0;
 
-- 
2.22.1




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux