* [PATCH v3-resend 07/11] powerpc: uaccess s/might_sleep/might_fault/ [not found] <1369575487-26176-1-git-send-email-mst@redhat.com> @ 2013-05-26 14:31 ` Michael S. Tsirkin 2013-05-27 9:36 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 2+ messages in thread From: Michael S. Tsirkin @ 2013-05-26 14:31 UTC (permalink / raw) To: linux-kernel Cc: Arnd Bergmann, Peter Zijlstra, Ingo Molnar, Paul Mackerras, linuxppc-dev The only reason uaccess routines might sleep is if they fault. Make this explicit. Arnd Bergmann suggested that the following code if (!is_kernel_addr((unsigned long)__pu_addr)) might_fault(); can be further simplified by adding a version of might_fault that includes the kernel addr check. Will be considered as a further optimization in future. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- arch/powerpc/include/asm/uaccess.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h index 4db4959..9485b43 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h @@ -178,7 +178,7 @@ do { \ long __pu_err; \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ if (!is_kernel_addr((unsigned long)__pu_addr)) \ - might_sleep(); \ + might_fault(); \ __chk_user_ptr(ptr); \ __put_user_size((x), __pu_addr, (size), __pu_err); \ __pu_err; \ @@ -188,7 +188,7 @@ do { \ ({ \ long __pu_err = -EFAULT; \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ - might_sleep(); \ + might_fault(); \ if (access_ok(VERIFY_WRITE, __pu_addr, size)) \ __put_user_size((x), __pu_addr, (size), __pu_err); \ __pu_err; \ @@ -268,7 +268,7 @@ do { \ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __chk_user_ptr(ptr); \ if (!is_kernel_addr((unsigned long)__gu_addr)) \ - might_sleep(); \ + might_fault(); \ __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ @@ -282,7 +282,7 @@ do { \ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ __chk_user_ptr(ptr); \ if (!is_kernel_addr((unsigned long)__gu_addr)) \ - might_sleep(); \ + might_fault(); \ __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ @@ -294,7 +294,7 @@ do { \ long __gu_err = -EFAULT; \ unsigned long __gu_val = 0; \ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ - might_sleep(); \ + might_fault(); \ if (access_ok(VERIFY_READ, __gu_addr, (size))) \ __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ @@ -419,14 +419,14 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to, static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long size) { - might_sleep(); + might_fault(); return __copy_from_user_inatomic(to, from, size); } static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long size) { - might_sleep(); + might_fault(); return __copy_to_user_inatomic(to, from, size); } @@ -434,7 +434,7 @@ extern unsigned long __clear_user(void __user *addr, unsigned long size); static inline unsigned long clear_user(void __user *addr, unsigned long size) { - might_sleep(); + might_fault(); if (likely(access_ok(VERIFY_WRITE, addr, size))) return __clear_user(addr, size); if ((unsigned long)addr < TASK_SIZE) { -- MST ^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3-resend 07/11] powerpc: uaccess s/might_sleep/might_fault/ 2013-05-26 14:31 ` [PATCH v3-resend 07/11] powerpc: uaccess s/might_sleep/might_fault/ Michael S. Tsirkin @ 2013-05-27 9:36 ` Benjamin Herrenschmidt 0 siblings, 0 replies; 2+ messages in thread From: Benjamin Herrenschmidt @ 2013-05-27 9:36 UTC (permalink / raw) To: Michael S. Tsirkin Cc: Arnd Bergmann, Peter Zijlstra, linux-kernel, Ingo Molnar, Paul Mackerras, linuxppc-dev On Sun, 2013-05-26 at 17:31 +0300, Michael S. Tsirkin wrote: > The only reason uaccess routines might sleep > is if they fault. Make this explicit. > > Arnd Bergmann suggested that the following code > if (!is_kernel_addr((unsigned long)__pu_addr)) > might_fault(); > can be further simplified by adding a version of might_fault > that includes the kernel addr check. > > Will be considered as a further optimization in future. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> As long as Peter is happy with the general semantics of might_fault() and you have at least build-tested it, then I'm happy. Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > --- > arch/powerpc/include/asm/uaccess.h | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h > index 4db4959..9485b43 100644 > --- a/arch/powerpc/include/asm/uaccess.h > +++ b/arch/powerpc/include/asm/uaccess.h > @@ -178,7 +178,7 @@ do { \ > long __pu_err; \ > __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ > if (!is_kernel_addr((unsigned long)__pu_addr)) \ > - might_sleep(); \ > + might_fault(); \ > __chk_user_ptr(ptr); \ > __put_user_size((x), __pu_addr, (size), __pu_err); \ > __pu_err; \ > @@ -188,7 +188,7 @@ do { \ > ({ \ > long __pu_err = -EFAULT; \ > __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ > - might_sleep(); \ > + might_fault(); \ > if (access_ok(VERIFY_WRITE, __pu_addr, size)) \ > __put_user_size((x), __pu_addr, (size), __pu_err); \ > __pu_err; \ > @@ -268,7 +268,7 @@ do { \ > const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ > __chk_user_ptr(ptr); \ > if (!is_kernel_addr((unsigned long)__gu_addr)) \ > - might_sleep(); \ > + might_fault(); \ > __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ > (x) = (__typeof__(*(ptr)))__gu_val; \ > __gu_err; \ > @@ -282,7 +282,7 @@ do { \ > const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ > __chk_user_ptr(ptr); \ > if (!is_kernel_addr((unsigned long)__gu_addr)) \ > - might_sleep(); \ > + might_fault(); \ > __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ > (x) = (__typeof__(*(ptr)))__gu_val; \ > __gu_err; \ > @@ -294,7 +294,7 @@ do { \ > long __gu_err = -EFAULT; \ > unsigned long __gu_val = 0; \ > const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ > - might_sleep(); \ > + might_fault(); \ > if (access_ok(VERIFY_READ, __gu_addr, (size))) \ > __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ > (x) = (__typeof__(*(ptr)))__gu_val; \ > @@ -419,14 +419,14 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to, > static inline unsigned long __copy_from_user(void *to, > const void __user *from, unsigned long size) > { > - might_sleep(); > + might_fault(); > return __copy_from_user_inatomic(to, from, size); > } > > static inline unsigned long __copy_to_user(void __user *to, > const void *from, unsigned long size) > { > - might_sleep(); > + might_fault(); > return __copy_to_user_inatomic(to, from, size); > } > > @@ -434,7 +434,7 @@ extern unsigned long __clear_user(void __user *addr, unsigned long size); > > static inline unsigned long clear_user(void __user *addr, unsigned long size) > { > - might_sleep(); > + might_fault(); > if (likely(access_ok(VERIFY_WRITE, addr, size))) > return __clear_user(addr, size); > if ((unsigned long)addr < TASK_SIZE) { ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-05-27 9:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1369575487-26176-1-git-send-email-mst@redhat.com>
2013-05-26 14:31 ` [PATCH v3-resend 07/11] powerpc: uaccess s/might_sleep/might_fault/ Michael S. Tsirkin
2013-05-27 9:36 ` Benjamin Herrenschmidt
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).