lkml.org 
[lkml]   [2005]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH][RFC][1/4] IB: core changes for userspace verbs
    Date
    From
    Add new structs and struct members required by userspace verbs to IB core.

    Signed-off-by: Roland Dreier <roland@topspin.com>

    --- linux-export.orig/drivers/infiniband/core/verbs.c 2005-01-11 09:35:27.046388000 -0800
    +++ linux-export/drivers/infiniband/core/verbs.c 2005-04-04 14:50:59.579791210 -0700
    @@ -47,10 +47,11 @@
    {
    struct ib_pd *pd;

    - pd = device->alloc_pd(device);
    + pd = device->alloc_pd(device, NULL, NULL, 0);

    if (!IS_ERR(pd)) {
    - pd->device = device;
    + pd->device = device;
    + pd->uobject = NULL;
    atomic_set(&pd->usecnt, 0);
    }

    @@ -76,8 +77,9 @@
    ah = pd->device->create_ah(pd, ah_attr);

    if (!IS_ERR(ah)) {
    - ah->device = pd->device;
    - ah->pd = pd;
    + ah->device = pd->device;
    + ah->pd = pd;
    + ah->uobject = NULL;
    atomic_inc(&pd->usecnt);
    }

    @@ -122,7 +124,7 @@
    {
    struct ib_qp *qp;

    - qp = pd->device->create_qp(pd, qp_init_attr);
    + qp = pd->device->create_qp(pd, qp_init_attr, NULL, 0);

    if (!IS_ERR(qp)) {
    qp->device = pd->device;
    @@ -130,6 +132,7 @@
    qp->send_cq = qp_init_attr->send_cq;
    qp->recv_cq = qp_init_attr->recv_cq;
    qp->srq = qp_init_attr->srq;
    + qp->uobject = NULL;
    qp->event_handler = qp_init_attr->event_handler;
    qp->qp_context = qp_init_attr->qp_context;
    qp->qp_type = qp_init_attr->qp_type;
    @@ -197,10 +200,11 @@
    {
    struct ib_cq *cq;

    - cq = device->create_cq(device, cqe);
    + cq = device->create_cq(device, cqe, NULL, NULL, 0);

    if (!IS_ERR(cq)) {
    cq->device = device;
    + cq->uobject = NULL;
    cq->comp_handler = comp_handler;
    cq->event_handler = event_handler;
    cq->cq_context = cq_context;
    @@ -245,8 +249,9 @@
    mr = pd->device->get_dma_mr(pd, mr_access_flags);

    if (!IS_ERR(mr)) {
    - mr->device = pd->device;
    - mr->pd = pd;
    + mr->device = pd->device;
    + mr->pd = pd;
    + mr->uobject = NULL;
    atomic_inc(&pd->usecnt);
    atomic_set(&mr->usecnt, 0);
    }
    @@ -267,8 +272,9 @@
    mr_access_flags, iova_start);

    if (!IS_ERR(mr)) {
    - mr->device = pd->device;
    - mr->pd = pd;
    + mr->device = pd->device;
    + mr->pd = pd;
    + mr->uobject = NULL;
    atomic_inc(&pd->usecnt);
    atomic_set(&mr->usecnt, 0);
    }
    @@ -344,8 +350,9 @@

    mw = pd->device->alloc_mw(pd);
    if (!IS_ERR(mw)) {
    - mw->device = pd->device;
    - mw->pd = pd;
    + mw->device = pd->device;
    + mw->pd = pd;
    + mw->uobject = NULL;
    atomic_inc(&pd->usecnt);
    }

    --- linux-export.orig/drivers/infiniband/include/ib_verbs.h 2005-02-22 10:14:06.623746000 -0800
    +++ linux-export/drivers/infiniband/include/ib_verbs.h 2005-04-04 14:50:42.054602327 -0700
    @@ -41,7 +41,9 @@

    #include <linux/types.h>
    #include <linux/device.h>
    +
    #include <asm/atomic.h>
    +#include <asm/scatterlist.h>

    union ib_gid {
    u8 raw[16];
    @@ -618,29 +620,78 @@
    u8 page_size;
    };

    +struct ib_ucontext {
    + struct ib_device *device;
    + struct list_head pd_list;
    + struct list_head mr_list;
    + struct list_head mw_list;
    + struct list_head cq_list;
    + struct list_head qp_list;
    + struct list_head srq_list;
    + struct list_head ah_list;
    + spinlock_t lock;
    +};
    +
    +struct ib_uobject {
    + u64 user_handle; /* handle given to us by userspace */
    + struct ib_ucontext *context; /* associated user context */
    + struct list_head list; /* link to context's list */
    + u32 id; /* index into kernel idr */
    +};
    +
    +struct ib_umem {
    + unsigned long user_base;
    + unsigned long virt_base;
    + size_t length;
    + int offset;
    + int page_size;
    + struct list_head chunk_list;
    +};
    +
    +struct ib_umem_chunk {
    + struct list_head list;
    + int nents;
    + int nmap;
    + struct scatterlist page_list[0];
    +};
    +
    +#define IB_UMEM_MAX_PAGE_CHUNK \
    + ((PAGE_SIZE - offsetof(struct ib_umem_chunk, page_list)) / \
    + ((void *) &((struct ib_umem_chunk *) 0)->page_list[1] - \
    + (void *) &((struct ib_umem_chunk *) 0)->page_list[0]))
    +
    +struct ib_umem_object {
    + struct ib_uobject uobject;
    + struct ib_umem umem;
    +};
    +
    struct ib_pd {
    - struct ib_device *device;
    - atomic_t usecnt; /* count all resources */
    + struct ib_device *device;
    + struct ib_uobject *uobject;
    + atomic_t usecnt; /* count all resources */
    };

    struct ib_ah {
    struct ib_device *device;
    struct ib_pd *pd;
    + struct ib_uobject *uobject;
    };

    typedef void (*ib_comp_handler)(struct ib_cq *cq, void *cq_context);

    struct ib_cq {
    - struct ib_device *device;
    - ib_comp_handler comp_handler;
    - void (*event_handler)(struct ib_event *, void *);
    - void * cq_context;
    - int cqe;
    - atomic_t usecnt; /* count number of work queues */
    + struct ib_device *device;
    + struct ib_uobject *uobject;
    + ib_comp_handler comp_handler;
    + void (*event_handler)(struct ib_event *, void *);
    + void * cq_context;
    + int cqe;
    + atomic_t usecnt; /* count number of work queues */
    };

    struct ib_srq {
    struct ib_device *device;
    + struct ib_uobject *uobject;
    struct ib_pd *pd;
    void *srq_context;
    atomic_t usecnt;
    @@ -652,6 +703,7 @@
    struct ib_cq *send_cq;
    struct ib_cq *recv_cq;
    struct ib_srq *srq;
    + struct ib_uobject *uobject;
    void (*event_handler)(struct ib_event *, void *);
    void *qp_context;
    u32 qp_num;
    @@ -659,16 +711,18 @@
    };

    struct ib_mr {
    - struct ib_device *device;
    - struct ib_pd *pd;
    - u32 lkey;
    - u32 rkey;
    - atomic_t usecnt; /* count number of MWs */
    + struct ib_device *device;
    + struct ib_pd *pd;
    + struct ib_uobject *uobject;
    + u32 lkey;
    + u32 rkey;
    + atomic_t usecnt; /* count number of MWs */
    };

    struct ib_mw {
    struct ib_device *device;
    struct ib_pd *pd;
    + struct ib_uobject *uobject;
    u32 rkey;
    };

    @@ -737,7 +791,12 @@
    int (*modify_port)(struct ib_device *device,
    u8 port_num, int port_modify_mask,
    struct ib_port_modify *port_modify);
    - struct ib_pd * (*alloc_pd)(struct ib_device *device);
    + struct ib_ucontext * (*alloc_ucontext)(struct ib_device *device,
    + const void __user *udata, int udatalen);
    + int (*dealloc_ucontext)(struct ib_ucontext *context);
    + struct ib_pd * (*alloc_pd)(struct ib_device *device,
    + struct ib_ucontext *context,
    + const void __user *udata, int udatalen);
    int (*dealloc_pd)(struct ib_pd *pd);
    struct ib_ah * (*create_ah)(struct ib_pd *pd,
    struct ib_ah_attr *ah_attr);
    @@ -747,7 +806,8 @@
    struct ib_ah_attr *ah_attr);
    int (*destroy_ah)(struct ib_ah *ah);
    struct ib_qp * (*create_qp)(struct ib_pd *pd,
    - struct ib_qp_init_attr *qp_init_attr);
    + struct ib_qp_init_attr *qp_init_attr,
    + const void __user *udata, int udatalen);
    int (*modify_qp)(struct ib_qp *qp,
    struct ib_qp_attr *qp_attr,
    int qp_attr_mask);
    @@ -762,8 +822,9 @@
    int (*post_recv)(struct ib_qp *qp,
    struct ib_recv_wr *recv_wr,
    struct ib_recv_wr **bad_recv_wr);
    - struct ib_cq * (*create_cq)(struct ib_device *device,
    - int cqe);
    + struct ib_cq * (*create_cq)(struct ib_device *device, int cqe,
    + struct ib_ucontext *context,
    + const void __user *udata, int udatalen);
    int (*destroy_cq)(struct ib_cq *cq);
    int (*resize_cq)(struct ib_cq *cq, int *cqe);
    int (*poll_cq)(struct ib_cq *cq, int num_entries,
    @@ -780,6 +841,11 @@
    int num_phys_buf,
    int mr_access_flags,
    u64 *iova_start);
    + struct ib_mr * (*reg_user_mr)(struct ib_pd *pd,
    + struct ib_umem *region,
    + int mr_access_flags,
    + const void __user *udata,
    + int udatalen);
    int (*query_mr)(struct ib_mr *mr,
    struct ib_mr_attr *mr_attr);
    int (*dereg_mr)(struct ib_mr *mr);
    @@ -816,7 +882,10 @@
    struct ib_grh *in_grh,
    struct ib_mad *in_mad,
    struct ib_mad *out_mad);
    + int (*mmap)(struct ib_ucontext *context,
    + struct vm_area_struct *vma);

    + struct module *owner;
    struct class_device class_dev;
    struct kobject ports_parent;
    struct list_head port_list;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-04-06 13:31    [W:3.187 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site