From: Rusty Russell <rusty@rustcorp.com.au>
To: Hugh Dickins <hugh@veritas.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jamie Lokier <jamie@shareable.org>, Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org, Linus Torvalds <torvalds@osdl.org>
Subject: Re: [PATCH 2] Little fixes to previous futex patch
Date: Mon, 08 Sep 2003 11:56:12 +1000 [thread overview]
Message-ID: <20030908020812.47E0C2C4C1@lists.samba.org> (raw)
In-Reply-To: Your message of "Sun, 07 Sep 2003 13:27:36 +0100." <Pine.LNX.4.44.0309071248510.3022-100000@localhost.localdomain>
In message <Pine.LNX.4.44.0309071248510.3022-100000@localhost.localdomain> you write:
> On Sun, 7 Sep 2003, Ingo Molnar wrote:
> >
> > btw., regarding this fix:
> >
> > ChangeSet@1.1179.2.5, 2003-09-06 12:28:20-07:00, hugh@veritas.com
> > [PATCH] Fix futex hashing bugs
> >
> > why dont we do this:
> >
> > } else {
> > /* Make sure to stop if key1 == key2 */
> > if (head1 == head2)
> > break;
> > list_add_tail(i, head2);
> > this->key = key2;
> > if (ret - nr_wake >= nr_requeue)
> > break;
> > }
Why not make the code a *whole* lot more readable (and only marginally
slower, if at all) by doing it in two passes: pull them off onto a
(on-stack) list in one pass, then requeue them all in another.
This on top of Hugh's patch on top of Jamie's. Untested, but you get
the idea...
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
Name: FUTEX_REQUEUE simplyfication
Author: Rusty Russell
Status: Booted on 2.6.0-test4-bk9
Depends: Misc/futex-hugh.patch.gz
D: Simplify the logic of FUTEX_REQUEUE.
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .32421-linux-2.6.0-test4-bk9/kernel/futex.c .32421-linux-2.6.0-test4-bk9.updated/kernel/futex.c
--- .32421-linux-2.6.0-test4-bk9/kernel/futex.c 2003-09-08 10:44:26.000000000 +1000
+++ .32421-linux-2.6.0-test4-bk9.updated/kernel/futex.c 2003-09-08 11:24:15.000000000 +1000
@@ -253,8 +253,10 @@ out:
static int futex_requeue(unsigned long uaddr1, unsigned long uaddr2,
int nr_wake, int nr_requeue)
{
- struct list_head *i, *next, *head1, *head2;
+ struct list_head *head1, *head2;
+ struct futex_q *this, *next;
union futex_key key1, key2;
+ LIST_HEAD(moved);
int ret;
down_read(¤t->mm->mmap_sem);
@@ -270,27 +272,29 @@ static int futex_requeue(unsigned long u
head2 = hash_futex(&key2);
spin_lock(&futex_lock);
- list_for_each_safe(i, next, head1) {
- struct futex_q *this = list_entry(i, struct futex_q, list);
-
- if (match_futex (&this->key, &key1)) {
- list_del_init(i);
+ list_for_each_entry_safe(this, next, head1, list) {
+ if (match_futex(&this->key, &key1)) {
if (++ret <= nr_wake) {
+ list_del_init(&this->list);
wake_up_all(&this->waiters);
if (this->filp)
send_sigio(&this->filp->f_owner,
this->fd, POLL_IN);
} else {
- list_add_tail(i, head2);
- this->key = key2;
+ /* Dequeue. */
+ list_del(&this->list);
+ list_add(&this->list, &moved);
if (ret - nr_wake >= nr_requeue)
break;
- /* Make sure to stop if key1 == key2 */
- if (head1 == head2 && head1 != next)
- head1 = i;
}
}
}
+
+ /* Requeue */
+ list_for_each_entry_safe(this, next, &moved, list) {
+ list_del(&this->list);
+ list_add_tail(&this->list, head2);
+ }
spin_unlock(&futex_lock);
out:
next prev parent reply other threads:[~2003-09-08 2:09 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-08-26 3:12 [PATCH 2/2] Futex non-page-pinning fix Rusty Russell
2003-08-26 4:06 ` Andrew Morton
2003-08-26 5:30 ` Ingo Molnar
2003-08-26 5:50 ` Andrew Morton
2003-08-26 5:58 ` Ingo Molnar
2003-08-26 6:14 ` Andrew Morton
2003-08-26 6:36 ` Ingo Molnar
2003-08-26 7:02 ` Andrew Morton
2003-08-26 7:56 ` Arjan van de Ven
2003-08-26 8:08 ` Muli Ben-Yehuda
2003-08-26 8:11 ` Arjan van de Ven
2003-08-26 8:25 ` Andrew Morton
2003-08-26 9:02 ` Muli Ben-Yehuda
2003-08-26 10:38 ` William Lee Irwin III
2003-08-26 10:44 ` Andrew Morton
2003-08-26 10:45 ` William Lee Irwin III
2003-08-26 17:29 ` Andrew Morton
2003-08-26 19:35 ` William Lee Irwin III
2003-08-27 5:17 ` Rusty Russell
2003-08-27 6:20 ` Andrew Morton
2003-08-28 0:47 ` Rusty Russell
2003-08-28 8:21 ` Andrew Morton
2003-08-29 3:46 ` Rusty Russell
2003-08-29 4:17 ` Andrew Morton
2003-08-30 7:49 ` Rusty Russell
2003-09-01 0:35 ` Jamie Lokier
2003-09-01 4:11 ` Rusty Russell
2003-09-01 20:57 ` Hugh Dickins
2003-09-02 3:12 ` Rusty Russell
2003-09-02 6:51 ` Jamie Lokier
2003-09-02 16:14 ` Hugh Dickins
2003-09-02 19:54 ` Jamie Lokier
2003-09-02 20:15 ` Andrew Morton
2003-09-02 21:20 ` Jamie Lokier
2003-09-03 2:40 ` Rusty Russell
2003-09-03 7:36 ` [PATCH] Alternate futex non-page-pinning and COW fix Jamie Lokier
2003-09-03 11:19 ` Hugh Dickins
2003-09-03 14:38 ` Jamie Lokier
2003-09-03 17:39 ` Jamie Lokier
2003-09-03 17:55 ` Linus Torvalds
2003-09-03 18:06 ` Hugh Dickins
2003-09-03 18:19 ` Linus Torvalds
2003-09-03 18:43 ` Hugh Dickins
2003-09-03 19:05 ` Linus Torvalds
2003-09-03 19:40 ` Hugh Dickins
2003-09-03 20:04 ` Linus Torvalds
2003-09-04 2:43 ` Rusty Russell
2003-09-04 8:28 ` Linus Torvalds
2003-09-04 12:20 ` Hugh Dickins
2003-09-04 15:40 ` Linus Torvalds
2003-09-04 16:55 ` Hugh Dickins
2003-09-04 18:38 ` Jamie Lokier
2003-09-04 18:46 ` Linus Torvalds
2003-09-04 20:04 ` Jamie Lokier
2003-09-04 21:49 ` Linus Torvalds
2003-09-04 22:10 ` Jamie Lokier
2003-09-04 17:16 ` Jamie Lokier
2003-09-04 17:38 ` Linus Torvalds
2003-09-04 18:42 ` Linus Torvalds
2003-09-04 18:42 ` Linus Torvalds
2003-09-05 3:55 ` Rusty Russell
2003-09-05 17:55 ` Jamie Lokier
2003-09-04 17:26 ` Jamie Lokier
2003-09-04 1:30 ` Rusty Russell
2003-09-04 21:00 ` Jamie Lokier
2003-09-05 5:19 ` Rusty Russell
2003-09-05 20:54 ` Jamie Lokier
2003-09-07 6:45 ` Rusty Russell
2003-09-07 13:20 ` Jamie Lokier
2003-09-08 1:49 ` Rusty Russell
2003-09-08 9:44 ` Jamie Lokier
2003-09-03 14:40 ` [PATCH 2] Little fixes to previous futex patch Jamie Lokier
2003-09-04 16:45 ` Hugh Dickins
2003-09-04 17:59 ` Jamie Lokier
2003-09-04 18:35 ` Hugh Dickins
2003-09-04 20:11 ` Jamie Lokier
2003-09-04 21:36 ` Hugh Dickins
2003-09-04 21:58 ` Jamie Lokier
2003-09-07 7:23 ` Ingo Molnar
2003-09-07 12:27 ` Hugh Dickins
2003-09-07 15:03 ` Jamie Lokier
2003-09-08 1:56 ` Rusty Russell [this message]
2003-09-07 13:00 ` Jamie Lokier
2003-09-08 3:32 ` Ingo Molnar
2003-09-08 9:33 ` Jamie Lokier
2003-09-08 9:57 ` Ingo Molnar
2003-09-05 4:56 ` Rusty Russell
2003-09-03 15:34 ` [PATCH] Alternate futex non-page-pinning and COW fix Andrew Morton
2003-09-03 17:16 ` Jamie Lokier
2003-09-04 1:35 ` Rusty Russell
2003-09-04 17:35 ` Jamie Lokier
2003-09-03 0:14 ` [PATCH 2/2] Futex non-page-pinning fix Rusty Russell
2003-09-03 1:16 ` Andrew Morton
2003-09-03 1:54 ` Dave Hansen
2003-09-03 2:54 ` Andrew Morton
2003-09-02 3:23 ` Hugh Dickins
2003-09-02 23:58 ` Rusty Russell
2003-08-27 8:37 ` Hugh Dickins
2003-08-27 8:56 ` William Lee Irwin III
2003-08-27 10:38 ` Andrew Morton
2003-08-27 10:57 ` Hugh Dickins
2003-08-28 8:03 ` Rusty Russell
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=20030908020812.47E0C2C4C1@lists.samba.org \
--to=rusty@rustcorp.com.au \
--cc=hugh@veritas.com \
--cc=mingo@redhat.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
all inboxes | Powered by JetHome®