Implement write combining on x86
authorKanoj Sarcar <kanoj@google.com>
Thu, 10 Mar 2016 19:28:26 +0000 (11:28 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 11 Mar 2016 21:41:00 +0000 (16:41 -0500)
MLX uses WC to write data payload into HCA buffers. The performance boost
over UC/UC- is significant.

Signed-off-by: Kanoj Sarcar <kanoj@google.com>
[ removed pat_init() and used the new PTE_ flags ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/net/udrvr/compat.c
kern/drivers/net/udrvr/compat.h

index 75b286d..1d3a015 100644 (file)
 #include <linux/rdma/ib_user_verbs.h>
 #include "uverbs.h"
 
+static unsigned long pgprot_val(int vmprot)
+{
+       unsigned long   prot = PTE_P | PTE_U | PTE_A;
+
+       if (vmprot & PROT_WRITE)
+               prot |= PTE_W | PTE_D;
+       return prot;
+}
+
+unsigned long pgprot_noncached(int vmprot)
+{
+       return pgprot_val(vmprot) | PTE_NOCACHE;
+}
+
+unsigned long pgprot_writecombine(int vmprot)
+{
+       return pgprot_val(vmprot) | PTE_WRITECOMB;
+}
+
 /*
  * Our version knocked off from kern/src/mm.c version + uncaching logic from
  * vmap_pmem_nocache(). This routine is expected to be invoked as part of mmap()
index d62897e..796e310 100644 (file)
@@ -61,23 +61,8 @@ typedef atomic_t                     atomic64_t;
 #define        spin_unlock_bh(E)               spin_unlock(E)
 #define        DEFINE_SPINLOCK(x)              spinlock_t x = SPINLOCK_INITIALIZER
 
-/*
- * Linux pgprot_noncached() adds _PAGE_PCD ie bit 4, which is akaros __PTE_PCD.
- * Akaros PTE_NOCACHE also sets bit 3 ie _PAGE_PWT (which is overkill?).
- * Linux pgprot_writecombine() defaults to pgprot_noncached() when PAT is
- * not enabled, otherwise just sets bit 3 ie _PAGE_PWT.
- */
-static unsigned long pgprot_noncached(int vmprot)
-{
-       unsigned long   prot = PTE_P | PTE_U | PTE_A | PTE_NOCACHE;
-
-       if (vmprot & PROT_WRITE)
-               prot |= PTE_W | PTE_D;
-       return prot;
-}
-
-/* TODO: Factor in PAT usage */
-#define        pgprot_writecombine(vmprot)     pgprot_noncached(vmprot)
+extern unsigned long pgprot_noncached(int vmprot);
+extern unsigned long pgprot_writecombine(int vmprot);
 
 #define is_vm_hugetlb_page(vma)        0