Re: [RFC][PATCH 7/12 not tested yet] PPC: introduce __set_bit() like function for bitmaps in user space

2010-05-12 Thread Takuya Yoshikawa




+static inline int set_bit_user_non_atomic(int nr, void __user *addr)
+{
+   u8 __user *p;
+   u8 val;
+
+   p = (u8 __user *)((unsigned long)addr + nr / BITS_PER_BYTE);



Does C do the + or the / first? Either way, I'd like to see brackets here :)


OK, I'll change like that! I like brackets style too :)




Alex



___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC][PATCH 7/12 not tested yet] PPC: introduce __set_bit() like function for bitmaps in user space

2010-05-11 Thread Alexander Graf
Takuya Yoshikawa wrote:
 During the work of KVM's dirty page logging optimization, we encountered
 the need of manipulating bitmaps in user space efficiantly. To achive this,
 we introduce a uaccess function for setting a bit in user space following
 Avi's suggestion.

   KVM is now using dirty bitmaps for live-migration and VGA. Although we need
   to update them from kernel side, copying them every time for updating the
   dirty log is a big bottleneck. Especially, we tested that zero-copy bitmap
   manipulation improves responses of GUI manipulations a lot.

 We also found one similar need in drivers/vhost/vhost.c in which the author
 implemented set_bit_to_user() locally using inefficient functions: see TODO
 at the top of that.

 Probably, this kind of need would be common for virtualization area.

 So we introduce a function set_bit_user_non_atomic().

 Signed-off-by: Takuya Yoshikawa yoshikawa.tak...@oss.ntt.co.jp
 Signed-off-by: Fernando Luis Vazquez Cao ferna...@oss.ntt.co.jp
 CC: Alexander Graf ag...@suse.de
 CC: Benjamin Herrenschmidt b...@kernel.crashing.org
 CC: Paul Mackerras pau...@samba.org
 ---
  arch/powerpc/include/asm/uaccess.h |   19 +++
  1 files changed, 19 insertions(+), 0 deletions(-)

 diff --git a/arch/powerpc/include/asm/uaccess.h 
 b/arch/powerpc/include/asm/uaccess.h
 index 3a01ce8..f878326 100644
 --- a/arch/powerpc/include/asm/uaccess.h
 +++ b/arch/powerpc/include/asm/uaccess.h
 @@ -321,6 +321,25 @@ do { 
 \
   __gu_err;   \
  })
  
 +static inline int set_bit_user_non_atomic(int nr, void __user *addr)
 +{
 + u8 __user *p;
 + u8 val;
 +
 + p = (u8 __user *)((unsigned long)addr + nr / BITS_PER_BYTE);
   

Does C do the + or the / first? Either way, I'd like to see brackets here :)


Alex

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC][PATCH 7/12 not tested yet] PPC: introduce __set_bit() like function for bitmaps in user space

2010-05-04 Thread Takuya Yoshikawa
During the work of KVM's dirty page logging optimization, we encountered
the need of manipulating bitmaps in user space efficiantly. To achive this,
we introduce a uaccess function for setting a bit in user space following
Avi's suggestion.

  KVM is now using dirty bitmaps for live-migration and VGA. Although we need
  to update them from kernel side, copying them every time for updating the
  dirty log is a big bottleneck. Especially, we tested that zero-copy bitmap
  manipulation improves responses of GUI manipulations a lot.

We also found one similar need in drivers/vhost/vhost.c in which the author
implemented set_bit_to_user() locally using inefficient functions: see TODO
at the top of that.

Probably, this kind of need would be common for virtualization area.

So we introduce a function set_bit_user_non_atomic().

Signed-off-by: Takuya Yoshikawa yoshikawa.tak...@oss.ntt.co.jp
Signed-off-by: Fernando Luis Vazquez Cao ferna...@oss.ntt.co.jp
CC: Alexander Graf ag...@suse.de
CC: Benjamin Herrenschmidt b...@kernel.crashing.org
CC: Paul Mackerras pau...@samba.org
---
 arch/powerpc/include/asm/uaccess.h |   19 +++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/include/asm/uaccess.h 
b/arch/powerpc/include/asm/uaccess.h
index 3a01ce8..f878326 100644
--- a/arch/powerpc/include/asm/uaccess.h
+++ b/arch/powerpc/include/asm/uaccess.h
@@ -321,6 +321,25 @@ do {   
\
__gu_err;   \
 })
 
+static inline int set_bit_user_non_atomic(int nr, void __user *addr)
+{
+   u8 __user *p;
+   u8 val;
+
+   p = (u8 __user *)((unsigned long)addr + nr / BITS_PER_BYTE);
+   if (!access_ok(VERIFY_WRITE, p, 1))
+   return -EFAULT;
+
+   if (__get_user(val, p))
+   return -EFAULT;
+
+   val |= 1U  (nr % BITS_PER_BYTE);
+   if (__put_user(val, p))
+   return -EFAULT;
+
+   return 0;
+}
+
 
 /* more complex routines */
 
-- 
1.7.0.4

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev