Skip to contentSkip to conversation

net: rds: use this_cpu_ptr per-cpu helper

PATCH Superseded Shan Wei 2 participants 4 messages Nov 9, 2012 – Nov 12, 2012

Subsystems (3)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

Shan Wei

author
#0 lore raw

PATCH v3 2/9 net: rds: use this_cpu_ptr per-cpu helper

From: Shan Wei <[email protected]>

---
no changes vs v2.

---
 net/rds/ib_recv.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
net/rds/ib_recv.c +1 -1
index 8d19491..a4a5064 100644
@@ -423,7 +423,7 @@ static void rds_ib_recv_cache_put(struct list_head *new_item,
 
 	local_irq_save(flags);
 
-	chp = per_cpu_ptr(cache->percpu, smp_processor_id());
+	chp = this_cpu_ptr(cache->percpu);
 	if (!chp->first)
 		INIT_LIST_HEAD(new_item);
 	else /* put on front */
Signature · 1 line
1.7.1
#1 lore raw
Quoted 8 lines · Shan Wei
 net/rds/ib_recv.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
net/rds/ib_recv.c +0 -0
index 8d19491..a4a5064 100644

net/rds/ib_recv.c static void rds_ib_recv_cache_put(struct list_head *new_item, · line 427

Quoted 6 lines
net/rds/ib_recv.c +1 -1
@@ -423,7 +423,7 @@ static void rds_ib_recv_cache_put(struct list_head *new_item,
 
 	local_irq_save(flags);
 
-	chp = per_cpu_ptr(cache->percpu, smp_processor_id());
+	chp = this_cpu_ptr(cache->percpu);
 	if (!chp->first)

if (!__this_cpu_read(cache-0>percpu->first))

?

author
#2 lore raw

Christoph Lameter said, at 2012/11/10 4:09:

Quoted 7 lines

Review

Quoted 3 lines
(quoted diff) +1 -1
-	chp = per_cpu_ptr(cache->percpu, smp_processor_id());
+	chp = this_cpu_ptr(cache->percpu);
 	if (!chp->first)

if (!__this_cpu_read(cache-0>percpu->first))

?

__percpu annotations in struct rds_ib_refill_cache is missing.

you mean that read/write fields of struct rds_ib_cache_head using __this_cpu_* operation like following?
How about it?

net/rds/ib.h +1 -1
index 8d2b3d5..7280ab8 100644
@@ -50,7 +50,7 @@ struct rds_ib_cache_head {
 };
 
 struct rds_ib_refill_cache {
-	struct rds_ib_cache_head *percpu;
+	struct rds_ib_cache_head __percpu *percpu;
 	struct list_head	 *xfer;
 	struct list_head	 *ready;
 };
net/rds/ib_recv.c +13 -11
index 8d19491..8c5bc85 100644
@@ -418,20 +418,21 @@ static void rds_ib_recv_cache_put(struct list_head *new_item,
 				 struct rds_ib_refill_cache *cache)
 {
 	unsigned long flags;
-	struct rds_ib_cache_head *chp;
 	struct list_head *old;
+	struct list_head __percpu *chpfirst;
 
 	local_irq_save(flags);
 
-	chp = per_cpu_ptr(cache->percpu, smp_processor_id());
-	if (!chp->first)
+	chpfirst = __this_cpu_read(cache->percpu->first);
+	if (!chpfirst)
 		INIT_LIST_HEAD(new_item);
 	else /* put on front */
-		list_add_tail(new_item, chp->first);
-	chp->first = new_item;
-	chp->count++;
+		list_add_tail(new_item, chpfirst);
 
-	if (chp->count < RDS_IB_RECYCLE_BATCH_COUNT)
+	__this_cpu_write(chpfirst, new_item);
+	__this_cpu_inc(cache->percpu->count);
+
+	if (__this_cpu_read(cache->percpu->count) < RDS_IB_RECYCLE_BATCH_COUNT)
 		goto end;
 
 	/*
@@ -443,12 +444,13 @@ static void rds_ib_recv_cache_put(struct list_head *new_item,
 	do {
 		old = xchg(&cache->xfer, NULL);
 		if (old)
-			list_splice_entire_tail(old, chp->first);
-		old = cmpxchg(&cache->xfer, NULL, chp->first);
+			list_splice_entire_tail(old, chpfirst);
+		old = cmpxchg(&cache->xfer, NULL, chpfirst);
 	} while (old);
 
-	chp->first = NULL;
-	chp->count = 0;
+
+	__this_cpu_write(chpfirst, NULL);
+	__this_cpu_write(cache->percpu->count, 0);
 end:
 	local_irq_restore(flags);
 }
#3 lore raw
Quoted 11 lines · Shan Wei

__percpu annotations in struct rds_ib_refill_cache is missing.

you mean that read/write fields of struct rds_ib_cache_head using __this_cpu_* operation like following?
How about it?

net/rds/ib.h +0 -0
index 8d2b3d5..7280ab8 100644

net/rds/ib.h struct rds_ib_cache_head { · line 53

Quoted 5 lines
net/rds/ib.h +1 -1
@@ -50,7 +50,7 @@ struct rds_ib_cache_head {
 };
 
 struct rds_ib_refill_cache {
-	struct rds_ib_cache_head *percpu;
+	struct rds_ib_cache_head __percpu *percpu;

That looks ok.