Thread (16 messages) 16 messages, 5 authors, 2018-12-19

Re: [PATCH 2/6] __wr_after_init: write rare for static allocation

From: Peter Zijlstra <peterz@infradead.org>
Date: 2018-12-10 10:00:06
Also in: linux-arch, linux-mm, linux-s390, lkml

On Mon, Dec 10, 2018 at 12:32:21AM +0200, Igor Stoppa wrote:

On 06/12/2018 11:44, Peter Zijlstra wrote:
quoted
On Wed, Dec 05, 2018 at 03:13:56PM -0800, Andy Lutomirski wrote:
quoted
quoted
+       if (op == WR_MEMCPY)
+               memcpy((void *)wr_poking_addr, (void *)src, len);
+       else if (op == WR_MEMSET)
+               memset((u8 *)wr_poking_addr, (u8)src, len);
+       else if (op == WR_RCU_ASSIGN_PTR)
+               /* generic version of rcu_assign_pointer */
+               smp_store_release((void **)wr_poking_addr,
+                                 RCU_INITIALIZER((void **)src));
+       kasan_enable_current();
Hmm.  I suspect this will explode quite badly on sane architectures
like s390.  (In my book, despite how weird s390 is, it has a vastly
nicer model of "user" memory than any other architecture I know
of...).  I think you should use copy_to_user(), etc, instead.  I'm not
entirely sure what the best smp_store_release() replacement is.
Making this change may also mean you can get rid of the
kasan_disable_current().
If you make the MEMCPY one guarantee single-copy atomicity for native
words then you're basically done.

smp_store_release() can be implemented with:

	smp_mb();
	WRITE_ONCE();

So if we make MEMCPY provide the WRITE_ONCE(), all we need is that
barrier, which we can easily place at the call site and not overly
complicate our interface with this.
Ok, so the 3rd case (WR_RCU_ASSIGN_PTR) could be handled outside of this
function.
But, since now memcpy() will be replaced by copy_to_user(), can I assume
that also copy_to_user() will be atomic, if the destination is properly
aligned? On x86_64 it seems yes, however it's not clear to me if this is the
outcome of an optimization or if I can expect it to be always true.
This would be a new contraint; one that needs to be documented and
verified by the various arch maintainers as they enable this feature on
their platform.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help