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.