From: Daniel Santos <danielfsantos@att.net>
To: linux-kernel@vger.kernel.org
Cc: Kent Overstreet <koverstreet@google.com>,
tj@kernel.org, Peter Zijlstra <peterz@infradead.org>,
axboe@kernel.dk, paul.gortmaker@windriver.com,
Andi Kleen <andi@firstfloor.org>,
jack@suse.cz, Andrea Arcangeli <aarcange@redhat.com>,
John Stultz <john.stultz@linaro.org>
Subject: [PATCH v2 3/3] [RFC] Generic Red-Black Trees
Date: Thu, 31 May 2012 18:30:10 -0500 [thread overview]
Message-ID: <4FC7FF02.6050304@att.net> (raw)
In-Reply-To: <4FC7FE2F.6010600@att.net>
[-- Attachment #1: Type: text/plain, Size: 353 bytes --]
I've put a few performance notes in comments. Specifically, I'm curious
if an inline function that expands to 128+ bytes like this should
possibly be wrapped in an __attribute__((flatten))
__attribute__((noinline)) function to force full expansion in one place
and then prevent it from getting inlined elsewhere (to keep the
generated code size down).
[-- Attachment #2: 0008-Use-generic-rbtree-impl-in-fair-scheduler.patch --]
[-- Type: text/x-patch, Size: 3359 bytes --]
>From 599576c4f48c97fe5e6f0cfa4e31d9dbb22ea043 Mon Sep 17 00:00:00 2001
From: Daniel Santos <daniel.santos@pobox.com>
Date: Thu, 31 May 2012 17:49:53 -0500
Subject: Use generic rbtree impl in fair scheduler
---
kernel/sched/fair.c | 76 +++++++++++++++++++++++---------------------------
1 files changed, 35 insertions(+), 41 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index e955364..64e8c29 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -447,6 +447,19 @@ static inline int entity_before(struct sched_entity *a,
return (s64)(a->vruntime - b->vruntime) < 0;
}
+static inline long compare_vruntime(u64 *a, u64 *b)
+{
+#if __BITS_PER_LONG >= 64
+ return (long)((s64)*a - (s64)*b);
+#else
+/* this is hacky -- 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
+}
+
static void update_min_vruntime(struct cfs_rq *cfs_rq)
{
u64 vruntime = cfs_rq->min_vruntime;
@@ -472,57 +485,38 @@ static void update_min_vruntime(struct cfs_rq *cfs_rq)
#endif
}
+RB_DEFINE_INTERFACE(
+ fair_tree,
+ struct cfs_rq, tasks_timeline, rb_leftmost, /* no rightmost */,
+ struct sched_entity, run_node, vruntime,
+ 0, compare_vruntime, 0)
+
+#ifndef __flatten
+#define __flatten __attribute__((flatten))
+#endif
+
/*
- * Enqueue an entity into the rb-tree:
+ * Enqueue an entity into the rb-tree:(these are wrappers so that inline
+ * expansion happens in only one place)
+ *
+ * NOTE: When compiling under gcc 4.5 and 4.6 (amd64), it decided to inline
+ * these anyway. I would be interested in profiling this as-is and declaring
+ * each function __flatten noinline (forcing all in-lining in the function, but
+ * preventing them from being inlined themselves). Also, it may not do this on
+ * other archs where the (not sure, gcc docs don't seem to say anything about
+ * arch influence).
*/
static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
- struct rb_node **link = &cfs_rq->tasks_timeline.rb_node;
- struct rb_node *parent = NULL;
- struct sched_entity *entry;
- int leftmost = 1;
-
- /*
- * Find the right place in the rbtree:
- */
- while (*link) {
- parent = *link;
- entry = rb_entry(parent, struct sched_entity, run_node);
- /*
- * We dont care about collisions. Nodes with
- * the same key stay together.
- */
- if (entity_before(se, entry)) {
- link = &parent->rb_left;
- } else {
- link = &parent->rb_right;
- leftmost = 0;
- }
- }
-
- /*
- * Maintain a cache of leftmost tree entries (it is frequently
- * used):
- */
- if (leftmost)
- cfs_rq->rb_leftmost = &se->run_node;
-
- rb_link_node(&se->run_node, parent, link);
- rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline);
+ fair_tree_insert(cfs_rq, se);
}
static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
- if (cfs_rq->rb_leftmost == &se->run_node) {
- struct rb_node *next_node;
-
- next_node = rb_next(&se->run_node);
- cfs_rq->rb_leftmost = next_node;
- }
-
- rb_erase(&se->run_node, &cfs_rq->tasks_timeline);
+ fair_tree_remove(cfs_rq, se);
}
+
struct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq)
{
struct rb_node *left = cfs_rq->rb_leftmost;
--
1.7.3.4
next prev parent reply other threads:[~2012-05-31 23:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-31 23:22 [PATCH v2 1/3] [RFC] Generic Red-Black Trees Daniel Santos
2012-05-31 23:26 ` [PATCH v2 2/3] " Daniel Santos
2012-05-31 23:30 ` Daniel Santos [this message]
2012-06-01 1:08 ` [PATCH v2 1/3] " Daniel Santos
2012-06-01 17:56 ` [PATCH v2 1/3] [RFC] Generic Red-Black Trees (performance notes) 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=4FC7FF02.6050304@att.net \
--to=danielfsantos@att.net \
--cc=aarcange@redhat.com \
--cc=andi@firstfloor.org \
--cc=axboe@kernel.dk \
--cc=daniel.santos@pobox.com \
--cc=jack@suse.cz \
--cc=john.stultz@linaro.org \
--cc=koverstreet@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=paul.gortmaker@windriver.com \
--cc=peterz@infradead.org \
--cc=tj@kernel.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