]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ib_umem: Add a new, more generic ib_umem_get_attrs
authorKnut Omang <knut.omang@oracle.com>
Tue, 21 Apr 2015 10:20:03 +0000 (12:20 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 8 Jul 2015 01:10:56 +0000 (18:10 -0700)
This call allows a full range of DMA attributes and also
DMA direction to be supplied and is just a refactor of the old ib_umem_get.
Reimplement ib_umem_get using the new generic call,
now a trivial implementation.

Orabug: 20930262

Signed-off-by: Knut Omang <knut.omang@oracle.com>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
drivers/infiniband/core/umem.c
include/rdma/ib_umem.h

index 38acb3cfc545f91658f0d465b69914de99f281b2..062a51e5094fc30e7d903400c6d1f8571a571bf5 100644 (file)
@@ -53,7 +53,7 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d
        if (umem->nmap > 0)
                ib_dma_unmap_sg(dev, umem->sg_head.sgl,
                                umem->nmap,
-                               DMA_BIDIRECTIONAL);
+                               umem->dir);
 
        for_each_sg(umem->sg_head.sgl, sg, umem->npages, i) {
 
@@ -82,6 +82,17 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d
  */
 struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
                            size_t size, int access, int dmasync)
+{
+       DEFINE_DMA_ATTRS(attrs);
+       if (dmasync)
+               dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs);
+       return ib_umem_get_attrs(context, addr, size, access, DMA_BIDIRECTIONAL, &attrs);
+}
+EXPORT_SYMBOL(ib_umem_get);
+
+struct ib_umem *ib_umem_get_attrs(struct ib_ucontext *context, unsigned long addr,
+                                 size_t size, int access, enum dma_data_direction dir,
+                                 struct dma_attrs *attrs)
 {
        struct ib_umem *umem;
        struct page **page_list;
@@ -92,13 +103,9 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
        unsigned long npages;
        int ret;
        int i;
-       DEFINE_DMA_ATTRS(attrs);
        struct scatterlist *sg, *sg_list_start;
        int need_release = 0;
 
-       if (dmasync)
-               dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs);
-
        if (!size)
                return ERR_PTR(-EINVAL);
 
@@ -122,6 +129,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
        umem->address   = addr;
        umem->page_size = PAGE_SIZE;
        umem->pid       = get_task_pid(current, PIDTYPE_PID);
+       umem->dir       = dir;
        /*
         * We ask for writable memory if any of the following
         * access flags are set.  "Local write" and "remote write"
@@ -214,8 +222,8 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
        umem->nmap = ib_dma_map_sg_attrs(context->device,
                                  umem->sg_head.sgl,
                                  umem->npages,
-                                 DMA_BIDIRECTIONAL,
-                                 &attrs);
+                                 dir,
+                                 attrs);
 
        if (umem->nmap <= 0) {
                ret = -ENOMEM;
@@ -240,7 +248,7 @@ out:
 
        return ret < 0 ? ERR_PTR(ret) : umem;
 }
-EXPORT_SYMBOL(ib_umem_get);
+EXPORT_SYMBOL(ib_umem_get_attrs);
 
 static void ib_umem_account(struct work_struct *work)
 {
index 2d83cfd7e6ce20da3b1606cfe4335fada792fb51..a9b27878a9f16413acb950fc3c99702abf9d60cb 100644 (file)
 #include <linux/list.h>
 #include <linux/scatterlist.h>
 #include <linux/workqueue.h>
+#include <linux/dma-direction.h>
 
 struct ib_ucontext;
 struct ib_umem_odp;
+struct dma_attrs;
 
 struct ib_umem {
        struct ib_ucontext     *context;
@@ -47,6 +49,7 @@ struct ib_umem {
        int                     page_size;
        int                     writable;
        int                     hugetlb;
+       enum dma_data_direction dir;
        struct work_struct      work;
        struct pid             *pid;
        struct mm_struct       *mm;
@@ -81,9 +84,12 @@ static inline size_t ib_umem_num_pages(struct ib_umem *umem)
 }
 
 #ifdef CONFIG_INFINIBAND_USER_MEM
-
 struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
                            size_t size, int access, int dmasync);
+struct ib_umem *ib_umem_get_attrs(struct ib_ucontext *context, unsigned long addr,
+                                 size_t size, int access,
+                                 enum dma_data_direction dir,
+                                 struct dma_attrs *attrs);
 void ib_umem_release(struct ib_umem *umem);
 int ib_umem_page_count(struct ib_umem *umem);
 int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,
@@ -98,6 +104,14 @@ static inline struct ib_umem *ib_umem_get(struct ib_ucontext *context,
                                          int access, int dmasync) {
        return ERR_PTR(-EINVAL);
 }
+static inline struct ib_umem *ib_umem_get_attrs(struct ib_ucontext *context,
+                                               unsigned long addr,
+                                               size_t size, int access,
+                                               enum dma_data_direction dir,
+                                               struct dma_attrs *attrs)
+{
+       return ERR_PTR(-EINVAL);
+}
 static inline void ib_umem_release(struct ib_umem *umem) { }
 static inline int ib_umem_page_count(struct ib_umem *umem) { return 0; }
 static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,