All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20140703124015.GA17431@richard>

diff --git a/a/1.txt b/N1/1.txt
index a48fcdc..bc110d1 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -16,3 +16,77 @@ On Wed, Jul 02, 2014 at 09:20:20AM -0500, Christoph Lameter wrote:
 Hi, Christoph
 
 Here is my refined version, hope this is more friendly to the audience.
+
+
+>From 3f4fdeab600e53fdcbd65c817db3aa560ac16bfb Mon Sep 17 00:00:00 2001
+From: Wei Yang <weiyang@linux.vnet.ibm.com>
+Date: Tue, 24 Jun 2014 15:48:59 +0800
+Subject: [PATCH] slub: reduce duplicate creation on the first object
+
+When a kmem_cache is created with ctor, each object in the kmem_cache will be
+initialized before ready to use. While in slub implementation, the first
+object will be initialized twice.
+
+This patch reduces the duplication of initialization of the first object.
+
+Fix commit 7656c72b: SLUB: add macros for scanning objects in a slab.
+
+Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
+---
+ mm/slub.c |   19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+diff --git a/mm/slub.c b/mm/slub.c
+index b2b0473..79611d9 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -288,6 +288,10 @@ static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)
+ 	for (__p = (__addr); __p < (__addr) + (__objects) * (__s)->size;\
+ 			__p += (__s)->size)
+ 
++#define for_each_object_idx(__p, __idx, __s, __addr, __objects) \
++	for (__p = (__addr), __idx = 1; __idx <= __objects;\
++			__p += (__s)->size, __idx++)
++
+ /* Determine object index from a given position */
+ static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
+ {
+@@ -1409,9 +1413,9 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
+ {
+ 	struct page *page;
+ 	void *start;
+-	void *last;
+ 	void *p;
+ 	int order;
++	int idx;
+ 
+ 	BUG_ON(flags & GFP_SLAB_BUG_MASK);
+ 
+@@ -1432,14 +1436,13 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
+ 	if (unlikely(s->flags & SLAB_POISON))
+ 		memset(start, POISON_INUSE, PAGE_SIZE << order);
+ 
+-	last = start;
+-	for_each_object(p, s, start, page->objects) {
+-		setup_object(s, page, last);
+-		set_freepointer(s, last, p);
+-		last = p;
++	for_each_object_idx(p, idx, s, start, page->objects) {
++		setup_object(s, page, p);
++		if (likely(idx < page->objects))
++			set_freepointer(s, p, p + s->size);
++		else
++			set_freepointer(s, p, NULL);
+ 	}
+-	setup_object(s, page, last);
+-	set_freepointer(s, last, NULL);
+ 
+ 	page->freelist = start;
+ 	page->inuse = page->objects;
+-- 
+1.7.9.5
+
+
+-- 
+Richard Yang
+Help you, Help me
diff --git a/a/content_digest b/N1/content_digest
index 8e40d2b..d4aacb9 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -36,6 +36,80 @@
  "\n"
  "Hi, Christoph\n"
  "\n"
- Here is my refined version, hope this is more friendly to the audience.
+ "Here is my refined version, hope this is more friendly to the audience.\n"
+ "\n"
+ "\n"
+ ">From 3f4fdeab600e53fdcbd65c817db3aa560ac16bfb Mon Sep 17 00:00:00 2001\n"
+ "From: Wei Yang <weiyang@linux.vnet.ibm.com>\n"
+ "Date: Tue, 24 Jun 2014 15:48:59 +0800\n"
+ "Subject: [PATCH] slub: reduce duplicate creation on the first object\n"
+ "\n"
+ "When a kmem_cache is created with ctor, each object in the kmem_cache will be\n"
+ "initialized before ready to use. While in slub implementation, the first\n"
+ "object will be initialized twice.\n"
+ "\n"
+ "This patch reduces the duplication of initialization of the first object.\n"
+ "\n"
+ "Fix commit 7656c72b: SLUB: add macros for scanning objects in a slab.\n"
+ "\n"
+ "Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>\n"
+ "---\n"
+ " mm/slub.c |   19 +++++++++++--------\n"
+ " 1 file changed, 11 insertions(+), 8 deletions(-)\n"
+ "\n"
+ "diff --git a/mm/slub.c b/mm/slub.c\n"
+ "index b2b0473..79611d9 100644\n"
+ "--- a/mm/slub.c\n"
+ "+++ b/mm/slub.c\n"
+ "@@ -288,6 +288,10 @@ static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)\n"
+ " \tfor (__p = (__addr); __p < (__addr) + (__objects) * (__s)->size;\\\n"
+ " \t\t\t__p += (__s)->size)\n"
+ " \n"
+ "+#define for_each_object_idx(__p, __idx, __s, __addr, __objects) \\\n"
+ "+\tfor (__p = (__addr), __idx = 1; __idx <= __objects;\\\n"
+ "+\t\t\t__p += (__s)->size, __idx++)\n"
+ "+\n"
+ " /* Determine object index from a given position */\n"
+ " static inline int slab_index(void *p, struct kmem_cache *s, void *addr)\n"
+ " {\n"
+ "@@ -1409,9 +1413,9 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)\n"
+ " {\n"
+ " \tstruct page *page;\n"
+ " \tvoid *start;\n"
+ "-\tvoid *last;\n"
+ " \tvoid *p;\n"
+ " \tint order;\n"
+ "+\tint idx;\n"
+ " \n"
+ " \tBUG_ON(flags & GFP_SLAB_BUG_MASK);\n"
+ " \n"
+ "@@ -1432,14 +1436,13 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)\n"
+ " \tif (unlikely(s->flags & SLAB_POISON))\n"
+ " \t\tmemset(start, POISON_INUSE, PAGE_SIZE << order);\n"
+ " \n"
+ "-\tlast = start;\n"
+ "-\tfor_each_object(p, s, start, page->objects) {\n"
+ "-\t\tsetup_object(s, page, last);\n"
+ "-\t\tset_freepointer(s, last, p);\n"
+ "-\t\tlast = p;\n"
+ "+\tfor_each_object_idx(p, idx, s, start, page->objects) {\n"
+ "+\t\tsetup_object(s, page, p);\n"
+ "+\t\tif (likely(idx < page->objects))\n"
+ "+\t\t\tset_freepointer(s, p, p + s->size);\n"
+ "+\t\telse\n"
+ "+\t\t\tset_freepointer(s, p, NULL);\n"
+ " \t}\n"
+ "-\tsetup_object(s, page, last);\n"
+ "-\tset_freepointer(s, last, NULL);\n"
+ " \n"
+ " \tpage->freelist = start;\n"
+ " \tpage->inuse = page->objects;\n"
+ "-- \n"
+ "1.7.9.5\n"
+ "\n"
+ "\n"
+ "-- \n"
+ "Richard Yang\n"
+ Help you, Help me
 
-b90bd64e6df1d5637e4d4399621c19c08756fc3cdd1f03c90987e78f136d58a2
+1713cdefe02e889f942dd98fb38d83d0e38613b5aa39f876883c1013340188c2

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.