linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v2 03/10] slab: move up code to get kmem_cache_node in free_block()
@ 2014-05-07 21:22 George Spelvin
  2014-05-07 21:30 ` David Rientjes
  0 siblings, 1 reply; 10+ messages in thread
From: George Spelvin @ 2014-05-07 21:22 UTC (permalink / raw)
  To: cl, iamjoonsoo.kim; +Cc: linux, linux-kernel, linux-mm

Seeing this patch made me think of a larger cleanup.
Would this be worth adding to the series?
(I incorporated your patch, as I couldn't decide whether
to write mine before or after; I assume it's no problem
to separate whichever way you want to order it.)

Commit comment something like:

Subject: Let clear_obj_pfmemalloc return the modified pointer

All callers fetch it immediately after, so just return the written
value for convenience.

Signed-off-by: George Spelvin <linux@horizon.com>
---
 mm/slab.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/mm/slab.c b/mm/slab.c
index 388cb1ae6f..7fdc8df104 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -215,9 +215,9 @@ static inline void set_obj_pfmemalloc(void **objp)
 	return;
 }
 
-static inline void clear_obj_pfmemalloc(void **objp)
+static inline void *clear_obj_pfmemalloc(void **objp)
 {
-	*objp = (void *)((unsigned long)*objp & ~SLAB_OBJ_PFMEMALLOC);
+	return *objp = (void *)((unsigned long)*objp & ~SLAB_OBJ_PFMEMALLOC);
 }
 
 /*
@@ -809,10 +809,8 @@ static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
 	if (unlikely(is_obj_pfmemalloc(objp))) {
 		struct kmem_cache_node *n;
 
-		if (gfp_pfmemalloc_allowed(flags)) {
-			clear_obj_pfmemalloc(&objp);
-			return objp;
-		}
+		if (gfp_pfmemalloc_allowed(flags))
+			return clear_obj_pfmemalloc(&objp);
 
 		/* The caller cannot use PFMEMALLOC objects, find another one */
 		for (i = 0; i < ac->avail; i++) {
@@ -833,9 +831,8 @@ static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
 		if (!list_empty(&n->slabs_free) && force_refill) {
 			struct page *page = virt_to_head_page(objp);
 			ClearPageSlabPfmemalloc(page);
-			clear_obj_pfmemalloc(&objp);
 			recheck_pfmemalloc_active(cachep, ac);
-			return objp;
+			return clear_obj_pfmemalloc(&objp);
 		}
 
 		/* No !PFMEMALLOC objects available */
@@ -3362,17 +3359,12 @@ static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects,
 		       int node)
 {
 	int i;
-	struct kmem_cache_node *n;
+	struct kmem_cache_node *n = cachep->node[node];
 
 	for (i = 0; i < nr_objects; i++) {
-		void *objp;
-		struct page *page;
-
-		clear_obj_pfmemalloc(&objpp[i]);
-		objp = objpp[i];
+		void *objp = clear_obj_pfmemalloc(&objpp[i]);
+		struct page *page = virt_to_head_page(objp);
 
-		page = virt_to_head_page(objp);
-		n = cachep->node[node];
 		list_del(&page->lru);
 		check_spinlock_acquired_node(cachep, node);
 		slab_put_obj(cachep, page, objp, node);

^ permalink raw reply related	[flat|nested] 10+ messages in thread
* [PATCH v2 00/10] clean-up and remove lockdep annotation in SLAB
@ 2014-05-07  6:06 Joonsoo Kim
  2014-05-07  6:06 ` [PATCH v2 03/10] slab: move up code to get kmem_cache_node in free_block() Joonsoo Kim
  0 siblings, 1 reply; 10+ messages in thread
From: Joonsoo Kim @ 2014-05-07  6:06 UTC (permalink / raw)
  To: Pekka Enberg
  Cc: Christoph Lameter, Andrew Morton, David Rientjes, linux-mm,
	linux-kernel, Joonsoo Kim, Joonsoo Kim

This patchset does some clean-up and tries to remove lockdep annotation.

Patches 1~3 are just for really really minor improvement.
Patches 4~10 are for clean-up and removing lockdep annotation.

There are two cases that lockdep annotation is needed in SLAB.
1) holding two node locks
2) holding two array cache(alien cache) locks

I looked at the code and found that we can avoid these cases without
any negative effect.

1) occurs if freeing object makes new free slab and we decide to
destroy it. Although we don't need to hold the lock during destroying
a slab, current code do that. Destroying a slab without holding the lock
would help the reduction of the lock contention. To do it, I change the
implementation that new free slab is destroyed after releasing the lock.

2) occurs on similar situation. When we free object from non-local node,
we put this object to alien cache with holding the alien cache lock.
If alien cache is full, we try to flush alien cache to proper node cache,
and, in this time, new free slab could be made. Destroying it would be
started and we will free metadata object which comes from another node.
In this case, we need another node's alien cache lock to free object.
This forces us to hold two array cache locks and then we need lockdep
annotation although they are always different locks and deadlock cannot
be possible. To prevent this situation, I use same way as 1).

In this way, we can avoid 1) and 2) cases, and then, can remove lockdep
annotation. As short stat noted, this makes SLAB code much simpler.

Many of this series get Ack from Christoph Lameter on previous iteration,
but 1, 2, 9 and 10 need to get Ack. There is no big change from previous
iteration. It is just rebased on current linux-next.

Thanks.

Joonsoo Kim (10):
  slab: add unlikely macro to help compiler
  slab: makes clear_obj_pfmemalloc() just return masked value
  slab: move up code to get kmem_cache_node in free_block()
  slab: defer slab_destroy in free_block()
  slab: factor out initialization of arracy cache
  slab: introduce alien_cache
  slab: use the lock on alien_cache, instead of the lock on array_cache
  slab: destroy a slab without holding any alien cache lock
  slab: remove a useless lockdep annotation
  slab: remove BAD_ALIEN_MAGIC

 mm/slab.c |  391 ++++++++++++++++++++++---------------------------------------
 mm/slab.h |    2 +-
 2 files changed, 140 insertions(+), 253 deletions(-)

-- 
1.7.9.5

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-05-08 19:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-07 21:22 [PATCH v2 03/10] slab: move up code to get kmem_cache_node in free_block() George Spelvin
2014-05-07 21:30 ` David Rientjes
2014-05-07 21:50   ` George Spelvin
2014-05-07 22:05     ` David Rientjes
2014-05-08  0:44       ` George Spelvin
2014-05-08  1:46       ` George Spelvin
2014-05-08 13:51   ` Christoph Lameter
2014-05-08 19:24     ` George Spelvin
  -- strict thread matches above, loose matches on Subject: below --
2014-05-07  6:06 [PATCH v2 00/10] clean-up and remove lockdep annotation in SLAB Joonsoo Kim
2014-05-07  6:06 ` [PATCH v2 03/10] slab: move up code to get kmem_cache_node in free_block() Joonsoo Kim
2014-05-08  0:52   ` David Rientjes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).