From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>
To: "peterz@infradead.org" <peterz@infradead.org>,
Vineet Gupta <Vineet.Gupta1@synopsys.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
"linux-snps-arc@lists.infradead.org"
<linux-snps-arc@lists.infradead.org>
Subject: Re: arc_usr_cmpxchg and preemption
Date: Fri, 16 Mar 2018 17:33:27 +0000 [thread overview]
Message-ID: <1521221606.4805.16.camel@synopsys.com> (raw)
In-Reply-To: <20180314175352.GP4064@hirez.programming.kicks-ass.net>
Hi Peter, Vineet,
On Wed, 2018-03-14 at 18:53 +0100, Peter Zijlstra wrote:
> On Wed, Mar 14, 2018 at 09:58:19AM -0700, Vineet Gupta wrote:
>
> > Well it is broken wrt the semantics the syscall is supposed to provide.
> > Preemption disabling is what prevents a concurrent thread from coming in and
> > modifying the same location (Imagine a variable which is being cmpxchg
> > concurrently by 2 threads).
> >
> > One approach is to do it the MIPS way, emulate the llsc flag - set it under
> > preemption disabled section and clear it in switch_to
>
> *shudder*... just catch the -EFAULT, force the write fault and retry.
More I look at this initially quite simple thing more it looks like
a can of worms...
> Something like:
>
> int sys_cmpxchg(u32 __user *user_ptr, u32 old, u32 new)
> {
That functions is supposed to return old value stored in memory.
At least that's how it is used in case of ARC and M68K.
Remember there's already libc that relies on that established API
and we cannot just change it... even though it might be a good idea.
For example return "errno" and pass old value via pointer in an argument.
But now I guess it's better to use what we have now.
> u32 val;
> int ret;
>
> again:
> ret = 0;
>
> preempt_disable();
> val = get_user(user_ptr);
What if get_user() fails?
In Peter's implementation we will return 0, in Vineet's
we will return -EFAULT... and who knows what kind of unexpected behavior happens
further down the line in user-space... so I think it would be safer to kill
the process then.
And that's my take:
-------------------------->8------------------------
int sys_cmpxchg(u32 __user *user_ptr, u32 old, u32 new)
{
u32 val;
int ret;
again:
ret = 0;
preempt_disable();
ret = get_user(val, user_ptr);
if(ret == -EFAULT) {
struct page *page;
preempt_enable();
ret = get_user_pages_fast((unsigned long)user_ptr, 1, 1, &page);
if (ret < 0) {
force_sig(SIGSEGV, current);
return ret;
}
put_page(page);
goto again;
}
if (val == old)
ret = put_user(new, user_ptr);
preempt_enable();
if (ret == -EFAULT) {
struct page *page;
ret = get_user_pages_fast((unsigned long)user_ptr, 1, 1, &page);
if (ret < 0) {
force_sig(SIGSEGV, current);
return ret;
}
put_page(page);
goto again;
}
return ret;
}
-------------------------->8------------------------
-Alexey
next prev parent reply other threads:[~2018-03-16 17:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1521045375.11552.27.camel@synopsys.com>
2018-03-14 16:58 ` arc_usr_cmpxchg and preemption Vineet Gupta
2018-03-14 17:53 ` Peter Zijlstra
2018-03-14 18:20 ` Peter Zijlstra
2018-03-14 20:38 ` Alexey Brodkin
2018-03-14 20:55 ` Vineet Gupta
2018-03-15 8:18 ` Peter Zijlstra
2018-03-15 9:12 ` Alexey Brodkin
2018-03-15 11:28 ` Peter Zijlstra
2018-03-15 19:03 ` Alexey Brodkin
2018-03-16 7:55 ` Peter Zijlstra
2018-03-16 18:12 ` Max Filippov
2018-03-16 17:33 ` Alexey Brodkin [this message]
2018-03-16 17:54 ` Vineet Gupta
2018-03-16 17:58 ` Peter Zijlstra
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=1521221606.4805.16.camel@synopsys.com \
--to=alexey.brodkin@synopsys.com \
--cc=Vineet.Gupta1@synopsys.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-snps-arc@lists.infradead.org \
--cc=peterz@infradead.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;
as well as URLs for NNTP newsgroup(s).