linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Santos <danielfsantos@att.net>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Christopher Li <sparse@chrisli.org>,
	David Daney <david.daney@cavium.com>,
	David Howells <dhowells@redhat.com>,
	David Rientjes <rientjes@google.com>,
	Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Ingo Molnar <mingo@kernel.org>, Joe Perches <joe@perches.com>,
	Konstantin Khlebnikov <khlebnikov@openvz.org>,
	linux-doc@vger.kernel.org, linux-sparse@vger.kernel.org,
	LKML <linux-kernel@vger.kernel.org>,
	Paul Gortmaker <paul.gortmaker@windriver.com>,
	Paul Turner <pjt@google.com>, Pavel Pisa <pisa@cmp.felk.cvut.cz>,
	Richard Weinberger <richard@nod.at>,
	Rob Landley <rob@landley.net>,
	Steven Rostedt <rostedt@goodmis.org>,
	Suresh Siddha <suresh.b.siddha@intel.com>
Subject: Re: [PATCH v4 12/13] fair.c: Use generic rbtree impl in fair scheduler
Date: Tue, 26 Jun 2012 16:59:14 -0500	[thread overview]
Message-ID: <4FEA30B2.9010902@att.net> (raw)
In-Reply-To: <1340712949.21991.57.camel@twins>

On 06/26/2012 07:15 AM, Peter Zijlstra wrote:
> On Fri, 2012-06-22 at 23:00 -0500, Daniel Santos wrote:
>> +static inline long compare_vruntime(u64 *a, u64 *b)
>> +{
>> +#if __BITS_PER_LONG >= 64
>> +       return (long)((s64)*a - (s64)*b);
>> +#else
>> +/* This is hacky, but is done to reduce instructions -- we wont use this for
>> + * rbtree lookups, only inserts, and since our relationship is defined as
>> + * non-unique, we only need to return positive if a > b and any other value
>> + * means less than.
>> + */
>> +       return (long)(*a > *b);
>> +#endif
>> +} 
> That's wrong.. suppose: a = 10, b = ULLONG_MAX - 10
>
> In that case (s64)(a - b) = 20, however a > b is false.
>
> And yes, vruntime wrap does happen.
Oh, I see now! (looking at entity_before)

static inline int entity_before(struct sched_entity *a,
                                struct sched_entity *b)
{
        return (s64)(a->vruntime - b->vruntime) < 0;
}

Do the subtraction unsigned, then evaluate the result as signed.  Thank
you very much, I'll fix that.

Also, to address why we're not using entity_before (or a less()
function) directly, there's two main reasons (one that doesn't even
affect CFS).  The first reason is that an "is equal" evaluation would
also be required for insertions in trees with unique keys, as well as
all lookups.  This doesn't doesn't affect CFS because it isn't doing
lookups (it only cares about leftmost) and duplicate keys are allowed.

The second is that the compare function is only evaluated once by just
returning a diff.  This *would* have an better performance benefit on
x86 if only gcc were willing to do the cmp or sub operation and then use
the CPU zero & negative flags to branch.  Instead, it seems to like to
do a sub (to subtract the values) and then cmp the result with zero. 
This is only once extra instruction in this case, but when you need to
use the (a > b ? 1 : (a < b ? -1 : 0)) construct, it's worse.  Off
topic, but something I wanted to mention in light of my "this is hacky"
section.

I guess I just need "get off of my duff", put together a succinct test
case and file a gcc bug report for this.

Daniel

  reply	other threads:[~2012-06-26 21:59 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-23  4:00 [PATCH v4 0/13] Generic Red-Black Trees Daniel Santos
2012-06-23  4:00 ` [PATCH v4 1/13] compiler-gcc4.h: Correct verion check for __compiletime_error Daniel Santos
2012-06-23  4:00 ` [PATCH v4 2/13] compiler-gcc4.h: Reorder macros based upon gcc ver Daniel Santos
2012-06-23  4:00 ` [PATCH v4 3/13] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro Daniel Santos
2012-06-23  4:00 ` [PATCH v4 4/13] compiler-gcc{3,4}.h: Use " Daniel Santos
2012-06-23  4:00 ` [PATCH v4 5/13] compiler{,-gcc4}.h: Remove duplicate macros Daniel Santos
2012-06-23  4:00 ` [PATCH v4 6/13] bug.h: Replace __linktime_error with __compiletime_error Daniel Santos
2012-06-25 18:16   ` Paul Gortmaker
2012-06-25 19:30     ` Daniel Santos
2012-06-23  4:00 ` [PATCH v4 7/13] compiler{,-gcc4}.h: Introduce __flatten function attribute Daniel Santos
2012-06-23  4:00 ` [PATCH v4 8/13] bug.h: Make BUILD_BUG_ON generate compile-time error Daniel Santos
2012-06-23  4:00 ` [PATCH v4 9/13] bug.h: Add BUILD_BUG_ON_NON_CONST macro Daniel Santos
2012-06-23  4:00 ` [PATCH v4 10/13] bug.h: Add gcc 4.2+ versions of BUILD_BUG_ON_* macros Daniel Santos
2012-06-23  4:00 ` [PATCH v4 11/13] rbtree.h: Generic Red-Black Trees Daniel Santos
2012-06-27 13:00   ` Peter Zijlstra
2012-06-23  4:00 ` [PATCH v4 12/13] fair.c: Use generic rbtree impl in fair scheduler Daniel Santos
2012-06-26 12:15   ` Peter Zijlstra
2012-06-26 21:59     ` Daniel Santos [this message]
2012-06-27 12:36       ` Peter Zijlstra
2012-06-23  4:00 ` [PATCH v4 13/13] documentation for rbtrees Daniel Santos
2012-06-23 23:01 ` [PATCH v4 0/13] Generic Red-Black Trees Rob Landley
2012-06-24  0:40   ` Daniel Santos
2012-06-24  4:39     ` Rob Landley
2012-06-24  7:57       ` Pavel Pisa
2012-06-24 23:29         ` Rob Landley
2012-06-25  8:35         ` Daniel Santos
2012-06-24 16:06       ` Alan Cox
2012-06-25  0:33       ` Daniel Santos

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=4FEA30B2.9010902@att.net \
    --to=danielfsantos@att.net \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=daniel.santos@pobox.com \
    --cc=david.daney@cavium.com \
    --cc=dhowells@redhat.com \
    --cc=hpa@zytor.com \
    --cc=joe@perches.com \
    --cc=khlebnikov@openvz.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sparse@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=mingo@kernel.org \
    --cc=paul.gortmaker@windriver.com \
    --cc=pisa@cmp.felk.cvut.cz \
    --cc=pjt@google.com \
    --cc=richard@nod.at \
    --cc=rientjes@google.com \
    --cc=rob@landley.net \
    --cc=rostedt@goodmis.org \
    --cc=seto.hidetoshi@jp.fujitsu.com \
    --cc=sparse@chrisli.org \
    --cc=suresh.b.siddha@intel.com \
    /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;
as well as URLs for NNTP newsgroup(s).