Re: [RFC PATCH for 4.17 02/21] rseq: Introduce restartable sequences system call (v12)

From: Mathieu Desnoyers
Date: Wed Mar 28 2018 - 11:03:42 EST


----- On Mar 28, 2018, at 8:52 AM, Peter Zijlstra peterz@xxxxxxxxxxxxx wrote:

> On Wed, Mar 28, 2018 at 02:29:46PM +0200, Peter Zijlstra wrote:
>> > +static int rseq_get_rseq_cs(struct task_struct *t,
>> > + unsigned long *start_ip,
>> > + unsigned long *post_commit_offset,
>> > + unsigned long *abort_ip,
>> > + uint32_t *cs_flags)
>> > +{
>
>>
>> > +
>> > + *cs_flags = rseq_cs.flags;
>> > + *start_ip = rseq_cs.start_ip;
>> > + *post_commit_offset = rseq_cs.post_commit_offset;
>> > + *abort_ip = rseq_cs.abort_ip;
>>
>> Then this becomes a straight struct assignment.
>
> I initially suggested passing a structure instead of many arguments, but
> then recondidered, mostly because it will be inlined (due to having only
> the one caller) anyway. Still, maybe a struct will work better, I dunno.

I find the result of struct pointer argument cleaner indeed. I'll go for that
approach.

I'll memset rseq_cs to 0 in the following case though, because the caller
expects the content of the structure to be set when rseq_get_rseq_cs() succeeds.

static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
{
struct rseq_cs __user *urseq_cs;
unsigned long ptr;
u32 __user *usig;
u32 sig;
int ret;

ret = __get_user(ptr, &t->rseq->rseq_cs);
if (ret)
return ret;
if (!ptr) {
memset(rseq_cs, 0, sizeof(*rseq_cs));
return 0;
}

[...]

Thanks!

Mathieu


--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com