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

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to