From: Christoph Lameter <clameter@sgi.com>
To: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Eric Dumazet <dada1@cosmosbay.com>,
Pekka Enberg <penberg@cs.helsinki.fi>,
Torsten Kaiser <just.for.lkml@googlemail.com>,
Ingo Molnar <mingo@elte.hu>,
Linus Torvalds <torvalds@linux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] Implement slub fastpath in terms of freebase and freeoffset
Date: Thu, 28 Feb 2008 11:08:49 -0800 (PST) [thread overview]
Message-ID: <Pine.LNX.4.64.0802281054230.29191@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <20080228055510.GA9026@Krystal>
On Thu, 28 Feb 2008, Mathieu Desnoyers wrote:
> Yep, I have an experimental patch ready. It would need some thorough
> testing though. I seems to run fine on an x86_32 with and without
> preemption (therefore with and without the slub cmpxchg_local fastpath).
What is the performance impact?
More comments follow...
> freeoffset & PAGE_MASK is the offset of the freelist element within the page.
> freeoffset & ~PAGE_MASK is the counter to detect object re-use.
> freebase is the address of the page in this the object is located. It is a
> multiple of PAGE_SIZE.
How does the page mask work for order 1 and other higher order allocations?
> Whenever an object is freed in the cpu slab cache, the counter is incremented.
> Whenever the alloc/free slow paths are modifying the freeoffset or freebase, the
> freeoffset counter is also incremented. It is used to make sure we know if
> freebase has been modified in an interrupt nested over the fast path.
> + unsigned long freebase; /*
> + * Pointer to the page address
> + * containing the first free per cpu
> + * object.
> + */
This is page_address(c->page)?
> struct page *page; /* The slab from which we are allocating */
> int node; /* The node of the page (or -1 for debug) */
> unsigned int offset; /* Freepointer offset (in word units) */
> +/*
> + * Used when interrupts are disabled, so no memory barriers are needed.
> + */
> +static inline void **get_freelist_ptr(struct kmem_cache_cpu *c)
> +{
> + return (void **)(c->freebase | (c->freeoffset & PAGE_MASK));
> +}
page_address(c->page) + (c->freeoffset & (PAGE_MASK << s->order)) ?
store the page mask also in the kmem_cache_cpu structure?
> +/*
> + * Updates the freebase and freeoffset concurrently with slub fastpath.
> + * We can nest over the fastpath as an interrupt. Therefore, all the freebase
> + * and freeoffset modifications will appear to have happened atomically from the
> + * fastpath point of view. (those are per-cpu variables)
> + */
> +static inline void set_freelist_ptr(struct kmem_cache_cpu *c, void **freelist)
> +{
> + c->freebase = (unsigned long)freelist & ~PAGE_MASK;
> + c->freeoffset += PAGE_SIZE;
> + c->freeoffset &= ~PAGE_MASK;
> + c->freeoffset |= (unsigned long)freelist & PAGE_MASK;
> +}
How is this going to show up as an atomic update? You modify multiple per
cpu fields and an interrupt could happen in between.
> @@ -1411,7 +1411,7 @@ static void deactivate_slab(struct kmem_
> struct page *page = c->page;
> int tail = 1;
>
> - if (c->freelist)
> + if (get_freelist_ptr(c))
> stat(c, DEACTIVATE_REMOTE_FREES);
> /*
The original code is wrong. It should be
if (is_end(c->freelist))
stat(c, DEACTIVATE_REMOTE_FREES)
> - c->freelist = c->freelist[c->offset];
> + object = get_freelist_ptr(c);
> + set_freelist_ptr(c, object[c->offset]);
That use of set_freelist is safe since interrupts are disabled. So the
function can only be used i interrupts are disabled?
> + /* No need to increment the MSB counter here, because only
> + * object free will lead to counter re-use. */
> + } while (cmpxchg_local(&c->freeoffset, freeoffset,
> + (freeoffset + (c->offset * sizeof(void *)))) != freeoffset);
How does this work? You replace the freeoffset with the the once
incremented by the object offset??? The objects may not be in sequence on
the freelist and the increment wont get you to the next object anyways
since c->offset is usually 0.
next prev parent reply other threads:[~2008-02-28 19:09 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-15 21:23 Linux 2.6.25-rc2 Linus Torvalds
2008-02-16 2:08 ` Rafael J. Wysocki
2008-02-16 5:44 ` [BUG] Linux 2.6.25-rc2 - Kernel Ooops while running dbench Kamalesh Babulal
2008-02-18 12:59 ` Andrew Morton
2008-02-18 14:25 ` Jeff Garzik
2008-02-18 16:11 ` Frans Pop
2008-03-03 11:51 ` Pekka Enberg
2008-03-04 4:03 ` Kamalesh Babulal
2008-02-16 6:10 ` [BUG] Linux 2.6.25-rc2 - Regression from 2.6.24-rc1-git1 softlockup while bootup on powerpc Kamalesh Babulal
2008-02-17 19:29 ` Jens Axboe
2008-02-19 8:04 ` KAMEZAWA Hiroyuki
2008-02-19 8:36 ` Jens Axboe
2008-02-19 8:47 ` KAMEZAWA Hiroyuki
2008-02-19 8:58 ` Jens Axboe
2008-02-19 9:07 ` KAMEZAWA Hiroyuki
2008-02-19 9:09 ` Jens Axboe
2008-02-19 9:02 ` KAMEZAWA Hiroyuki
2008-02-19 9:01 ` Jens Axboe
2008-02-19 13:19 ` Kamalesh Babulal
2008-02-22 7:24 ` Andrew Morton
2008-02-22 7:40 ` Jens Axboe
2008-02-17 20:08 ` Rafael J. Wysocki
2008-02-16 16:52 ` Linux 2.6.25-rc2 Jan Engelhardt
2008-02-16 19:14 ` Linux 2.6.25-rc2 regression: LVM cannot find volume group Tilman Schmidt
2008-02-16 20:12 ` Alan Cox
2008-02-16 22:37 ` Jiri Slaby
2008-02-18 0:57 ` Tilman Schmidt
2008-02-18 1:22 ` Jeff Chua
2008-02-18 10:35 ` Tilman Schmidt
2008-02-19 1:53 ` Alasdair G Kergon
2008-02-19 8:56 ` Tilman Schmidt
2008-02-16 21:38 ` Linux 2.6.25-rc2 Torsten Kaiser
2008-02-17 20:25 ` Rafael J. Wysocki
2008-02-17 21:32 ` Torsten Kaiser
2008-02-18 23:54 ` Linus Torvalds
2008-02-19 6:44 ` Torsten Kaiser
2008-02-19 6:11 ` Ingo Molnar
2008-02-19 6:54 ` Torsten Kaiser
2008-02-19 7:21 ` Pekka Enberg
2008-02-19 10:27 ` Ingo Molnar
2008-02-19 10:45 ` Pekka Enberg
2008-02-19 13:02 ` Mathieu Desnoyers
2008-02-19 14:00 ` Ingo Molnar
2008-02-19 14:02 ` Mathieu Desnoyers
2008-02-19 14:21 ` Pekka Enberg
2008-02-19 14:38 ` Pekka Enberg
2008-02-19 14:55 ` Ingo Molnar
2008-02-19 14:57 ` Ingo Molnar
2008-02-19 15:54 ` Pekka Enberg
2008-02-19 15:52 ` Pekka Enberg
2008-02-20 0:36 ` Zhang, Yanmin
2008-02-20 2:08 ` Zhang, Yanmin
2008-02-20 6:53 ` Zhang, Yanmin
2008-02-20 7:10 ` Pekka Enberg
2008-02-19 16:20 ` Linus Torvalds
2008-02-19 16:45 ` Ingo Molnar
2008-02-19 16:48 ` Ingo Molnar
2008-02-19 19:27 ` Torsten Kaiser
2008-02-19 20:08 ` Mathieu Desnoyers
2008-02-27 23:32 ` Christoph Lameter
2008-02-28 1:57 ` Andrew Morton
2008-02-28 2:43 ` Christoph Lameter
2008-02-28 8:14 ` Ingo Molnar
2008-02-28 11:15 ` Alan Cox
2008-02-28 11:13 ` Jiri Kosina
2008-02-19 16:27 ` Eric Dumazet
2008-02-19 16:38 ` Linus Torvalds
2008-02-19 20:03 ` Mathieu Desnoyers
2008-02-27 23:34 ` Christoph Lameter
2008-02-28 5:55 ` [PATCH] Implement slub fastpath in terms of freebase and freeoffset Mathieu Desnoyers
2008-02-28 19:08 ` Christoph Lameter [this message]
2008-02-28 23:25 ` Mathieu Desnoyers
2008-02-29 0:57 ` Christoph Lameter
2008-02-29 1:56 ` Mathieu Desnoyers
2008-02-29 2:12 ` Christoph Lameter
2008-02-29 3:32 ` Mathieu Desnoyers
2008-02-29 5:11 ` Christoph Lameter
2008-02-29 13:03 ` Mathieu Desnoyers
2008-02-29 19:57 ` Christoph Lameter
2008-02-29 13:28 ` [PATCH] Slub Freeoffset check overflow Mathieu Desnoyers
2008-03-04 6:17 ` [PATCH] Slub Freeoffset check overflow (updated) Mathieu Desnoyers
2008-03-04 7:15 ` Christoph Lameter
2008-02-27 23:32 ` Linux 2.6.25-rc2 Christoph Lameter
2008-02-19 18:39 ` Torsten Kaiser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.64.0802281054230.29191@schroedinger.engr.sgi.com \
--to=clameter@sgi.com \
--cc=dada1@cosmosbay.com \
--cc=just.for.lkml@googlemail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=penberg@cs.helsinki.fi \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®