All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Christoph Lameter <clameter@sgi.com>
Cc: Hugh Dickins <hugh@veritas.com>, Nick Piggin <npiggin@suse.de>,
	dgc@sgi.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] Optimize compound_head() by avoiding a shared page flag
Date: Sat, 7 Apr 2007 15:51:48 -0700	[thread overview]
Message-ID: <20070407155148.94da92e8.akpm@linux-foundation.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0704071509550.31503@schroedinger.engr.sgi.com>

On Sat, 7 Apr 2007 15:16:17 -0700 (PDT) Christoph Lameter <clameter@sgi.com> wrote:

> On Fri, 6 Apr 2007, Andrew Morton wrote:
> 
> > Did you investigate
> > 
> > static inline int page_tail(struct page *page)
> > {
> > 	return ((page->flags & (PG_compound|PG_tail)) == (PG_compound|PG_tail));
> > }
> 
> The usual test_bit that we are using there uses a volatile reference 
> so these wont be combined if I check them separately.
> 
> A working example of the above would be much uglier:
> 
> static inline int page_tail(struct page *page)
> {
>  	return ((page->flags & ((1L << PG_compound)|(1L << PG_tail))) == 
> ((1L << PG_compound)|(1L << PG_tail)));
> }
> 
> May be this can be cleaned up somehow.

It might generate better code to do

	unsigned long compound;

	compound = page->flags & (1 << PG_compound);
	if (PG_compound > PG_tail)
		return compound & (page->flags << (PG_compound - PG_tail));
	else
		return compound & (page->flags << (PG_tail - PG_compound));


ie: get the PG_compound flag into `compound', then bitwise-and that with
the PG_tail flag, after shifting it into PG_compound' slot.  The return
value will be zero if either bit is clear, (1<<PG_compound) if both are
set.  The `if (PG_compound > PG_tail)' will be swallowed by the compiler.

The compiler should turn it all into

	(page->flags & N) & (page->flags << M)

Which may or may not be better than (page->flags & N == N), dunno. 
Probably not - if the compiler's any good it won't save a branch, I
suspect.



Which is all a ton of fun, but this subversion of the architecture's
freedom to use volatile, memory barriers etc is a worry.  We do the same in
page_alloc.c, of course...  


  reply	other threads:[~2007-04-07 22:51 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-05 22:36 [PATCH 1/2] Make page->private usable in compound pages V1 Christoph Lameter
2007-04-05 22:36 ` [PATCH 2/2] Optimize compound_head() by avoiding a shared page flag Christoph Lameter
2007-04-07  5:23   ` Andrew Morton
2007-04-07 22:16     ` Christoph Lameter
2007-04-07 22:51       ` Andrew Morton [this message]
2007-04-08  0:21         ` Christoph Lameter
2007-04-08  1:25           ` Andrew Morton
2007-04-08  1:32             ` Christoph Lameter
2007-04-08  1:48               ` Andrew Morton
2007-04-09 17:22                 ` Christoph Lameter
2007-04-09 18:09                 ` Christoph Lameter
2007-04-09 18:45                   ` Andrew Morton
2007-04-09 18:49                     ` Christoph Lameter
2007-04-09 22:05                     ` Christoph Lameter
2007-04-05 23:43 ` [PATCH 1/2] Make page->private usable in compound pages V1 Andrew Morton
2007-04-06 17:01   ` Christoph Lameter
2007-04-06 20:04     ` Andrew Morton
2007-04-06 20:28       ` Christoph Lameter
2007-04-06 19:46   ` Christoph Lameter

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=20070407155148.94da92e8.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=clameter@sgi.com \
    --cc=dgc@sgi.com \
    --cc=hugh@veritas.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=npiggin@suse.de \
    /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 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.