[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20190806101327.GO2332@hirez.programming.kicks-ass.net>
Date: Tue, 6 Aug 2019 12:13:27 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: Gabriel Krisman Bertazi <krisman@...labora.com>
Cc: tglx@...utronix.de, mingo@...hat.com, dvhart@...radead.org,
linux-kernel@...r.kernel.org, kernel@...labora.com,
Zebediah Figura <z.figura12@...il.com>,
Steven Noonan <steven@...vesoftware.com>,
"Pierre-Loup A . Griffais" <pgriffais@...vesoftware.com>,
viro@...iv.linux.org.uk, jannh@...gle.com
Subject: Re: [PATCH RFC 2/2] futex: Implement mechanism to wait on any of
several futexes
On Tue, Aug 06, 2019 at 02:26:38AM -0400, Gabriel Krisman Bertazi wrote:
> Peter Zijlstra <peterz@...radead.org> writes:
>
> >
> >> +static int futex_wait_multiple(u32 __user *uaddr, unsigned int flags,
> >> + u32 count, ktime_t *abs_time)
> >> +{
> >> + struct futex_wait_block *wb;
> >> + struct restart_block *restart;
> >> + int ret;
> >> +
> >> + if (!count)
> >> + return -EINVAL;
> >> +
> >> + wb = kcalloc(count, sizeof(struct futex_wait_block), GFP_KERNEL);
> >> + if (!wb)
> >> + return -ENOMEM;
> >> +
> >> + if (copy_from_user(wb, uaddr,
> >> + count * sizeof(struct futex_wait_block))) {
> >> + ret = -EFAULT;
> >> + goto out;
> >> + }
> >
> > I'm thinking we can do away with this giant copy and do it one at a time
> > from the other function, just extend the storage allocated there to
> > store whatever values are still required later.
> I'm not sure I get the suggestion here. If I understand the code
> correctly, once we do it one at a time, we need to queue_me() each futex
> and then drop the hb lock, before going to the next one.
So the idea is to reduce to a single allocation; like Thomas also said.
And afaict, we've not yet taken any locks the first time we iterate --
that only does get_futex_key(), the whole __futex_wait_setup() and
queue_me(), comes later, in the second iteration.
Powered by blists - more mailing lists