Memory windows support for rxe
Subsystems (2)
Bob
PATCH 1/20 Added ib_uverbs_wc_opcode to ib_user_verbs.h
This enum plays the same role as ib_uverbs_wr_opcode documenting the opcodes in the user space API. It plays a role for software drivers like rxe.
--- include/uapi/rdma/ib_user_verbs.h | 11 +++++++++++ 1 file changed, 11 insertions(+)
include/uapi/rdma/ib_user_verbs.h +11 -0
@@ -457,6 +457,17 @@ struct ib_uverbs_poll_cq {__u32 ne; }; +enum ib_uverbs_wc_opcode { +IB_UVERBS_WC_SEND =0 , +IB_UVERBS_WC_RDMA_WRITE =1 , +IB_UVERBS_WC_RDMA_READ =2 , +IB_UVERBS_WC_COMP_SWAP =3 , +IB_UVERBS_WC_FETCH_ADD =4 , +IB_UVERBS_WC_BIND_MW =5 , +IB_UVERBS_WC_LOCAL_INV =6 , +IB_UVERBS_WC_TSO =7 , +}; +struct ib_uverbs_wc {__aligned_u64 wr_id;__u32 status;
Signature · 1 line
2.25.1
PATCH 2/20 Added missing IB_WR_BIND_MW opcode
In reply to Bob PearsonAlso assigned the IB_WC_XXX to the IB_UVERBS_WC_XXX where they are defined. This follows the same pattern as the IB_WR_XXX opcodes. This fixes an incorrect value for LSO that had crept in but was not used.
--- include/rdma/ib_verbs.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
include/rdma/ib_verbs.h +9 -7
@@ -952,13 +952,14 @@ enum ib_wc_status { const char *__attribute_const__ ib_wc_status_msg(enum ib_wc_status status);enum ib_wc_opcode { -IB_WC_SEND , -IB_WC_RDMA_WRITE , -IB_WC_RDMA_READ , -IB_WC_COMP_SWAP , -IB_WC_FETCH_ADD , -IB_WC_LSO , -IB_WC_LOCAL_INV , +IB_WC_SEND =IB_UVERBS_WC_SEND , +IB_WC_RDMA_WRITE =IB_UVERBS_WC_RDMA_WRITE , +IB_WC_RDMA_READ =IB_UVERBS_WC_RDMA_READ , +IB_WC_COMP_SWAP =IB_UVERBS_WC_COMP_SWAP , +IB_WC_FETCH_ADD =IB_UVERBS_WC_FETCH_ADD , +IB_WC_BIND_MW =IB_UVERBS_WC_BIND_MW , +IB_WC_LOCAL_INV =IB_UVERBS_WC_LOCAL_INV , +IB_WC_LSO =IB_UVERBS_WC_TSO ,IB_WC_REG_MR ,IB_WC_MASKED_COMP_SWAP ,IB_WC_MASKED_FETCH_ADD ,
@@ -1291,6 +1292,7 @@ enum ib_wr_opcode {IB_WR_RDMA_READ =IB_UVERBS_WR_RDMA_READ ,IB_WR_ATOMIC_CMP_AND_SWP =IB_UVERBS_WR_ATOMIC_CMP_AND_SWP ,IB_WR_ATOMIC_FETCH_AND_ADD =IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD , +IB_WR_BIND_MW =IB_UVERBS_WR_BIND_MW ,IB_WR_LSO =IB_UVERBS_WR_TSO ,IB_WR_SEND_WITH_INV =IB_UVERBS_WR_SEND_WITH_INV , IB_WR_RDMA_READ_WITH_INV = IB_UVERBS_WR_RDMA_READ_WITH_INV,
Signature · 1 line
2.25.1
PATCH 3/20 Added bind_mw parameters to rxe_send_wr.
In reply to Bob PearsonThis is a first prototype version of the user/kernel ABI extension to add memory windows functionality to the rxe driver. It evolves later.
--- include/uapi/rdma/rdma_user_rxe.h | 8 ++++++++ 1 file changed, 8 insertions(+)
include/uapi/rdma/rdma_user_rxe.h +8 -0
@@ -93,6 +93,14 @@ struct rxe_send_wr {__u32 remote_qkey;__u16 pkey_index; } ud; +struct { +__aligned_u64 addr; +__aligned_u64 length; +__u32 mr_rkey; +__u32 mw_rkey; +__u32 rkey; +__u32 access; + } bind_mw;/* reg is only used by the kernel and is not part of the uapi */ struct { union {
Signature · 1 line
2.25.1
PATCH 4/20 Added stubs for alloc_mw and dealloc_mw verbs.
In reply to Bob PearsonAdded a new file focused on memory windows, rxe_mw.c and adds stubbed out kernel verbs API for alloc_mw and dealloc_mw. These functios are added to the context ops struct and bits added to the supported APIs mask.
These APIs allow progress on the rdma-core user space testing.
--- drivers/infiniband/sw/rxe/Makefile | 1 + drivers/infiniband/sw/rxe/rxe_loc.h | 5 +++ drivers/infiniband/sw/rxe/rxe_mw.c | 49 +++++++++++++++++++++++++++ drivers/infiniband/sw/rxe/rxe_verbs.c | 4 +++ 4 files changed, 59 insertions(+) create mode 100644 drivers/infiniband/sw/rxe/rxe_mw.c
drivers/infiniband/sw/rxe/Makefile +1 -0
@@ -15,6 +15,7 @@ rdma_rxe-y := \ rxe_qp.o \ rxe_cq.o \ rxe_mr.o \ + rxe_mw.o \ rxe_opcode.o \ rxe_mmap.o \ rxe_icrc.o \
drivers/infiniband/sw/rxe/rxe_loc.h +5 -0
@@ -136,6 +136,11 @@ void rxe_mem_cleanup(struct rxe_pool_entry *arg);int advance_dma_data (struct rxe_dma_info *dma,unsigned int length); +/* rxe_mw.c */ +struct ib_mw *rxe_alloc_mw (struct ib_pd *ibpd,enum ib_mw_type type, +struct ib_udata *udata); +int rxe_dealloc_mw (struct ib_mw *ibmw); +/* rxe_net.c */ void rxe_loopback (struct sk_buff *skb);int rxe_send (struct rxe_pkt_info *pkt,struct sk_buff *skb);
drivers/infiniband/sw/rxe/rxe_mw.c new file +49 -0
49 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_verbs.c +4 -0
@@ -1128,6 +1128,8 @@ static const struct ib_device_ops rxe_dev_ops = { .reg_user_mr = rxe_reg_user_mr, .req_notify_cq = rxe_req_notify_cq, .resize_cq = rxe_resize_cq, + .alloc_mw = rxe_alloc_mw, + .dealloc_mw = rxe_dealloc_mw,INIT_RDMA_OBJ_SIZE (ib_ah, rxe_ah, ibah), INIT_RDMA_OBJ_SIZE(ib_cq, rxe_cq, ibcq),
@@ -1189,6 +1191,8 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name) | BIT_ULL(IB_USER_VERBS_CMD_DESTROY_AH) |BIT_ULL (IB_USER_VERBS_CMD_ATTACH_MCAST ) |BIT_ULL (IB_USER_VERBS_CMD_DETACH_MCAST ) + |BIT_ULL (IB_USER_VERBS_CMD_ALLOC_MW ) + |BIT_ULL (IB_USER_VERBS_CMD_DEALLOC_MW ) ;ib_set_device_ops (dev, &rxe_dev_ops);
Signature · 1 line
2.25.1
PATCH 5/20 Separated MR and MW objects.
In reply to Bob PearsonIn the original rxe implementation it was intended to use a common object to represent MRs and MWs but it became clear that they are different enough to separate these into two objects.
This allows replacing the mem name with mr for MRs which is less likely to be confusing. This is a long patch that just changes mem to mr everywhere it made sense.
--- drivers/infiniband/sw/rxe/rxe_comp.c | 4 +- drivers/infiniband/sw/rxe/rxe_loc.h | 26 +-- drivers/infiniband/sw/rxe/rxe_mr.c | 258 +++++++++++++------------- drivers/infiniband/sw/rxe/rxe_pool.c | 6 +- drivers/infiniband/sw/rxe/rxe_req.c | 6 +- drivers/infiniband/sw/rxe/rxe_resp.c | 30 +-- drivers/infiniband/sw/rxe/rxe_verbs.c | 19 +- drivers/infiniband/sw/rxe/rxe_verbs.h | 31 ++-- 8 files changed, 189 insertions(+), 191 deletions(-)
drivers/infiniband/sw/rxe/rxe_comp.c +2 -2
@@ -372,7 +372,7 @@ static inline enum comp_state do_read(struct rxe_qp *qp, ret =copy_data (qp->pd,IB_ACCESS_LOCAL_WRITE , &wqe->dma,payload_addr (pkt), -payload_size (pkt), to_mem_obj,NULL ); +payload_size (pkt), to_mr_obj,NULL );if (ret)return COMPST_ERROR ;
@@ -392,7 +392,7 @@ static inline enum comp_state do_atomic(struct rxe_qp *qp, ret =copy_data (qp->pd,IB_ACCESS_LOCAL_WRITE , &wqe->dma, &atomic_orig, -sizeof (u64), to_mem_obj,NULL ); +sizeof (u64), to_mr_obj,NULL );if (ret)return COMPST_ERROR ;else
drivers/infiniband/sw/rxe/rxe_loc.h +13 -13
@@ -99,40 +99,40 @@ int rxe_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);/* rxe_mr.c */ enum copy_direction { - to_mem_obj, - from_mem_obj, + to_mr_obj, + from_mr_obj, }; -void rxe_mem_init_dma (struct rxe_pd *pd, -int access,struct rxe_mem *mem); +int rxe_mr_init_dma (struct rxe_pd *pd, +int access,struct rxe_mr *mr); -int rxe_mem_init_user (struct rxe_pd *pd,u64 start, +int rxe_mr_init_user (struct rxe_pd *pd,u64 start,u64 length,u64 iova,int access,struct ib_udata *udata, -struct rxe_mem *mr); +struct rxe_mr *mr); -int rxe_mem_init_fast (struct rxe_pd *pd, -int max_pages,struct rxe_mem *mem); +int rxe_mr_init_fast (struct rxe_pd *pd, +int max_pages,struct rxe_mr *mr); -int rxe_mem_copy (struct rxe_mem *mem,u64 iova,void *addr, +int rxe_mr_copy (struct rxe_mr *mr,u64 iova,void *addr,int length,enum copy_direction dir,u32 *crcp);int copy_data (struct rxe_pd *pd,int access,struct rxe_dma_info *dma,void *addr,int length,enum copy_direction dir,u32 *crcp); -void *iova_to_vaddr (struct rxe_mem *mem,u64 iova,int length); +void *iova_to_vaddr (struct rxe_mr *mr,u64 iova,int length);enum lookup_type { lookup_local, lookup_remote, }; -struct rxe_mem *lookup_mem (struct rxe_pd *pd,int access,u32 key, +struct rxe_mr *lookup_mr (struct rxe_pd *pd,int access,u32 key,enum lookup_type type); -int mem_check_range (struct rxe_mem *mem,u64 iova,size_t length); +int mr_check_range (struct rxe_mr *mr,u64 iova,size_t length); -void rxe_mem_cleanup (struct rxe_pool_entry *arg); +void rxe_mr_cleanup (struct rxe_pool_entry *arg);int advance_dma_data (struct rxe_dma_info *dma,unsigned int length);
drivers/infiniband/sw/rxe/rxe_mr.c +129 -129
515 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_pool.c +3 -3
@@ -77,15 +77,15 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = { }, [RXE_TYPE_MR] = { .name = "rxe-mr", - .size = sizeof(struct rxe_mem), - .cleanup = rxe_mem_cleanup, + .size = sizeof(struct rxe_mr), + .cleanup = rxe_mr_cleanup, .flags = RXE_POOL_INDEX, .max_index = RXE_MAX_MR_INDEX, .min_index = RXE_MIN_MR_INDEX, }, [RXE_TYPE_MW] = { .name = "rxe-mw", - .size = sizeof(struct rxe_mem), + .size = sizeof(struct rxe_mr), .flags = RXE_POOL_INDEX, .max_index = RXE_MAX_MW_INDEX, .min_index = RXE_MIN_MW_INDEX,
drivers/infiniband/sw/rxe/rxe_req.c +3 -3
@@ -492,7 +492,7 @@ static int fill_packet(struct rxe_qp *qp, struct rxe_send_wqe *wqe, }else { err =copy_data (qp->pd,0 , &wqe->dma,payload_addr (pkt), paylen, - from_mem_obj, + from_mr_obj, &crc);if (err)return err;
@@ -624,7 +624,7 @@ int rxe_requester(void *arg)if (wqe->mask &WR_REG_MASK ) {if (wqe->wr.opcode ==IB_WR_LOCAL_INV ) {struct rxe_dev *rxe =to_rdev (qp->ibqp.device); -struct rxe_mem *rmr; +struct rxe_mr *rmr; rmr =rxe_pool_get_index (&rxe->mr_pool, wqe->wr.ex.invalidate_rkey >>8 );
@@ -640,7 +640,7 @@ int rxe_requester(void *arg) wqe->state = wqe_state_done; wqe->status =IB_WC_SUCCESS ; }else if (wqe->wr.opcode ==IB_WR_REG_MR ) { -struct rxe_mem *rmr =to_rmr (wqe->wr.wr.reg.mr); +struct rxe_mr *rmr =to_rmr (wqe->wr.wr.reg.mr); rmr->state =RXE_MEM_STATE_VALID ; rmr->access = wqe->wr.wr.reg.access;
drivers/infiniband/sw/rxe/rxe_resp.c +15 -15
@@ -417,7 +417,7 @@ static enum resp_states check_length(struct rxe_qp *qp,static enum resp_states check_rkey (struct rxe_qp *qp,struct rxe_pkt_info *pkt) { -struct rxe_mem *mem =NULL ; +struct rxe_mr *mr =NULL ;u64 va;u32 rkey;u32 resid;
@@ -456,18 +456,18 @@ static enum resp_states check_rkey(struct rxe_qp *qp, resid = qp->resp.resid; pktlen =payload_size (pkt); - mem =lookup_mem (qp->pd, access, rkey, lookup_remote); -if (!mem) { + mr =lookup_mr (qp->pd, access, rkey, lookup_remote); +if (!mr) { state =RESPST_ERR_RKEY_VIOLATION ; goto err; } -if (unlikely (mem->state ==RXE_MEM_STATE_FREE )) { +if (unlikely (mr->state ==RXE_MEM_STATE_FREE )) { state =RESPST_ERR_RKEY_VIOLATION ; goto err; } -if (mem_check_range (mem, va, resid)) { +if (mr_check_range (mr, va, resid)) { state =RESPST_ERR_RKEY_VIOLATION ; goto err; }
@@ -495,12 +495,12 @@ static enum resp_states check_rkey(struct rxe_qp *qp,WARN_ON_ONCE (qp->resp.mr); - qp->resp.mr = mem; + qp->resp.mr = mr;return RESPST_EXECUTE ; err: -if (mem) -rxe_drop_ref (mem); +if (mr) +rxe_drop_ref (mr);return state; }
@@ -510,7 +510,7 @@ static enum resp_states send_data_in(struct rxe_qp *qp, void *data_addr,int err; err =copy_data (qp->pd,IB_ACCESS_LOCAL_WRITE , &qp->resp.wqe->dma, - data_addr, data_len, to_mem_obj,NULL ); + data_addr, data_len, to_mr_obj,NULL );if (unlikely (err))return (err == -ENOSPC ) ?RESPST_ERR_LENGTH :RESPST_ERR_MALFORMED_WQE ;
@@ -525,8 +525,8 @@ static enum resp_states write_data_in(struct rxe_qp *qp,int err;int data_len =payload_size (pkt); - err =rxe_mem_copy (qp->resp.mr, qp->resp.va,payload_addr (pkt), - data_len, to_mem_obj,NULL ); + err =rxe_mr_copy (qp->resp.mr, qp->resp.va,payload_addr (pkt), + data_len, to_mr_obj,NULL );if (err) { rc =RESPST_ERR_RKEY_VIOLATION ; goto out;
@@ -548,7 +548,7 @@ static enum resp_states process_atomic(struct rxe_qp *qp,u64 iova =atmeth_va (pkt);u64 *vaddr;enum resp_states ret; -struct rxe_mem *mr = qp->resp.mr; +struct rxe_mr *mr = qp->resp.mr;if (mr->state !=RXE_MEM_STATE_VALID ) { ret =RESPST_ERR_RKEY_VIOLATION ;
@@ -727,8 +727,8 @@ static enum resp_states read_reply(struct rxe_qp *qp,if (!skb)return RESPST_ERR_RNR ; - err =rxe_mem_copy (res->read.mr, res->read.va,payload_addr (&ack_pkt), - payload, from_mem_obj, &icrc); + err =rxe_mr_copy (res->read.mr, res->read.va,payload_addr (&ack_pkt), + payload, from_mr_obj, &icrc);if (err)pr_err ("Failed copying memory\n" );
@@ -910,7 +910,7 @@ static enum resp_states do_complete(struct rxe_qp *qp, }if (pkt->mask &RXE_IETH_MASK ) { -struct rxe_mem *rmr; +struct rxe_mr *rmr; wc->wc_flags |=IB_WC_WITH_INVALIDATE ; wc->ex.invalidate_rkey =ieth_rkey (pkt);
drivers/infiniband/sw/rxe/rxe_verbs.c +10 -9
@@ -890,7 +890,7 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access) {struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); -struct rxe_mem *mr; +struct rxe_mr *mr; mr =rxe_alloc (&rxe->mr_pool);if (!mr)
@@ -898,7 +898,8 @@ static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)rxe_add_index (mr);rxe_add_ref (pd); -rxe_mem_init_dma (pd, access, mr); + +rxe_mr_init_dma (pd, access, mr);return &mr->ibmr; }
@@ -912,7 +913,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,int err;struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); -struct rxe_mem *mr; +struct rxe_mr *mr; mr =rxe_alloc (&rxe->mr_pool);if (!mr) {
@@ -924,7 +925,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,rxe_add_ref (pd); - err =rxe_mem_init_user (pd, start, length, iova, + err =rxe_mr_init_user (pd, start, length, iova, access, udata, mr);if (err) goto err3;
@@ -941,7 +942,7 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,static int rxe_dereg_mr (struct ib_mr *ibmr,struct ib_udata *udata) { -struct rxe_mem *mr =to_rmr (ibmr); +struct rxe_mr *mr =to_rmr (ibmr); mr->state =RXE_MEM_STATE_ZOMBIE ;rxe_drop_ref (mr->pd);
@@ -955,7 +956,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type, {struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); -struct rxe_mem *mr; +struct rxe_mr *mr;int err;if (mr_type !=IB_MR_TYPE_MEM_REG )
@@ -971,7 +972,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,rxe_add_ref (pd); - err =rxe_mem_init_fast (pd, max_num_sg, mr); + err =rxe_mr_init_fast (pd, max_num_sg, mr);if (err) goto err2;
@@ -987,7 +988,7 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,static int rxe_set_page (struct ib_mr *ibmr,u64 addr) { -struct rxe_mem *mr =to_rmr (ibmr); +struct rxe_mr *mr =to_rmr (ibmr);struct rxe_map *map;struct rxe_phys_buf *buf;
@@ -1007,7 +1008,7 @@ static int rxe_set_page(struct ib_mr *ibmr, u64 addr)static int rxe_map_mr_sg (struct ib_mr *ibmr,struct scatterlist *sg,int sg_nents,unsigned int *sg_offset) { -struct rxe_mem *mr =to_rmr (ibmr); +struct rxe_mr *mr =to_rmr (ibmr);int n; mr->nbuf =0 ;
drivers/infiniband/sw/rxe/rxe_verbs.h +14 -17
@@ -183,7 +183,7 @@ struct resp_res {struct sk_buff *skb; } atomic;struct { -struct rxe_mem *mr; +struct rxe_mr *mr;u64 va_org;u32 rkey;u32 length;
@@ -210,7 +210,7 @@ struct rxe_resp_info {/* RDMA read / atomic only */ u64 va; -struct rxe_mem *mr; +struct rxe_mr *mr;u32 resid;u32 rkey;u32 length;
@@ -289,14 +289,14 @@ struct rxe_qp {struct execute_work cleanup_work; }; -enum rxe_mem_state { +enum rxe_mr_state {RXE_MEM_STATE_ZOMBIE ,RXE_MEM_STATE_INVALID ,RXE_MEM_STATE_FREE ,RXE_MEM_STATE_VALID , }; -enum rxe_mem_type { +enum rxe_mr_type {RXE_MEM_TYPE_NONE ,RXE_MEM_TYPE_DMA ,RXE_MEM_TYPE_MR ,
@@ -315,12 +315,9 @@ struct rxe_map {struct rxe_phys_buf buf[RXE_BUF_PER_MAP ]; }; -struct rxe_mem { +struct rxe_mr {struct rxe_pool_entry pelem; -union { -struct ib_mr ibmr; -struct ib_mw ibmw; - }; +struct ib_mr ibmr;struct rxe_pd *pd;struct ib_umem *umem;
@@ -328,8 +325,8 @@ struct rxe_mem {u32 lkey;u32 rkey; -enum rxe_mem_state state; -enum rxe_mem_type type; +enum rxe_mr_state state; +enum rxe_mr_type type;u64 va;u64 iova;size_t length;
@@ -455,15 +452,15 @@ static inline struct rxe_cq *to_rcq(struct ib_cq *cq) return cq ? container_of(cq, struct rxe_cq, ibcq) : NULL; } -static inline struct rxe_mem *to_rmr (struct ib_mr *mr) +static inline struct rxe_mr *to_rmr (struct ib_mr *mr) { - return mr ? container_of(mr, struct rxe_mem, ibmr) : NULL; + return mr ? container_of(mr, struct rxe_mr, ibmr) : NULL; } -static inline struct rxe_mem *to_rmw (struct ib_mw *mw) -{ - return mw ? container_of(mw, struct rxe_mem, ibmw) : NULL; -} +//static inline struct rxe_mw *to_rmw(struct ib_mw *mw) +//{ +//return mw ? container_of(mw, struct rxe_mw, ibmw) : NULL; +//} int rxe_register_device (struct rxe_dev *rxe,const char *ibdev_name);
Signature · 1 line
2.25.1
PATCH 6/20 Added a basic rxe_mw struct
In reply to Bob PearsonCreated the new basic rxe_mw structure.
--- drivers/infiniband/sw/rxe/rxe_verbs.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
drivers/infiniband/sw/rxe/rxe_verbs.h +18 -4
@@ -347,6 +347,20 @@ struct rxe_mr {struct rxe_map **map; }; +enum rxe_mw_state { +RXE_MW_STATE_INVALID , +RXE_MW_STATE_FREE , +RXE_MW_STATE_VALID , +}; + +struct rxe_mw { +struct rxe_pool_entry pelem; +struct ib_mw ibmw; +struct rxe_qp *qp;/* type 2B only */ +struct rxe_mem *mr; +enum rxe_mw_state state; +}; +struct rxe_mc_grp {struct rxe_pool_entry pelem;spinlock_t mcg_lock;/* guard group */
@@ -457,10 +471,10 @@ static inline struct rxe_mr *to_rmr(struct ib_mr *mr) return mr ? container_of(mr, struct rxe_mr, ibmr) : NULL; } -//static inline struct rxe_mw *to_rmw(struct ib_mw *mw) -//{ -//return mw ? container_of(mw, struct rxe_mw, ibmw) : NULL; -//} +static inline struct rxe_mw *to_rmw (struct ib_mw *mw) +{ + return mw ? container_of(mw, struct rxe_mw, ibmw) : NULL; +}int rxe_register_device (struct rxe_dev *rxe,const char *ibdev_name);
Signature · 1 line
2.25.1
PATCH 7/20 Implemented functional alloc_mw and dealloc_mw APIs
In reply to Bob PearsonCreated basic functional alloc_mw and dealloc_mw funnctions and changed the parameters in rxe_param.h so that MWs can actually be created. This change supported running user space test cases for these APIs.
--- drivers/infiniband/sw/rxe/rxe.c | 1 + drivers/infiniband/sw/rxe/rxe_mw.c | 57 +++++++++++++++++++++++++-- drivers/infiniband/sw/rxe/rxe_param.h | 10 +++-- drivers/infiniband/sw/rxe/rxe_pool.c | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.h | 4 ++ 5 files changed, 65 insertions(+), 9 deletions(-)
drivers/infiniband/sw/rxe/rxe.c +1 -0
@@ -79,6 +79,7 @@ static void rxe_init_device_param(struct rxe_dev *rxe) rxe->attr.max_cq =RXE_MAX_CQ ; rxe->attr.max_cqe = (1 <<RXE_MAX_LOG_CQE ) -1 ; rxe->attr.max_mr =RXE_MAX_MR ; + rxe->attr.max_mw =RXE_MAX_MW ; rxe->attr.max_pd =RXE_MAX_PD ; rxe->attr.max_qp_rd_atom =RXE_MAX_QP_RD_ATOM ; rxe->attr.max_res_rd_atom =RXE_MAX_RES_RD_ATOM ;
drivers/infiniband/sw/rxe/rxe_mw.c +53 -4
68 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_param.h +6 -4
@@ -85,7 +85,8 @@ enum rxe_device_param {RXE_MAX_SGE_RD =32 ,RXE_MAX_CQ =16384 ,RXE_MAX_LOG_CQE =15 , -RXE_MAX_MR =256 *1024 , +RXE_MAX_MR =0x40000 , +RXE_MAX_MW =0x40000 ,RXE_MAX_PD =0x7ffc ,RXE_MAX_QP_RD_ATOM =128 , RXE_MAX_RES_RD_ATOM = 0x3f000,
@@ -114,9 +115,10 @@ enum rxe_device_param {RXE_MAX_SRQ_INDEX =0x00040000 ,RXE_MIN_MR_INDEX =0x00000001 , -RXE_MAX_MR_INDEX =0x00040000 , -RXE_MIN_MW_INDEX =0x00040001 , -RXE_MAX_MW_INDEX =0x00060000 , +RXE_MAX_MR_INDEX =RXE_MIN_MR_INDEX +RXE_MAX_MR -1 , +RXE_MIN_MW_INDEX =RXE_MIN_MR_INDEX +RXE_MAX_MR , +RXE_MAX_MW_INDEX =RXE_MIN_MW_INDEX +RXE_MAX_MW -1 , +RXE_MAX_PKT_PER_ACK =64 , RXE_MAX_UNACKED_PSNS = 128,
drivers/infiniband/sw/rxe/rxe_pool.c +1 -1
@@ -85,7 +85,7 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = { }, [RXE_TYPE_MW] = { .name = "rxe-mw", - .size = sizeof(struct rxe_mr), + .size = sizeof(struct rxe_mw), .flags = RXE_POOL_INDEX, .max_index = RXE_MAX_MW_INDEX, .min_index = RXE_MIN_MW_INDEX,
drivers/infiniband/sw/rxe/rxe_verbs.h +4 -0
@@ -358,7 +358,11 @@ struct rxe_mw {struct ib_mw ibmw;struct rxe_qp *qp;/* type 2B only */ struct rxe_mem *mr; +spinlock_t lock;enum rxe_mw_state state; +u32 access; +u64 addr; +u64 length; };struct rxe_mc_grp {
Signature · 1 line
2.25.1
PATCH 8/20 Added a stubbed bind_mw API.
In reply to Bob PearsonAdded code to implement the path to rxe_bind_mw which is still a stub. Now the ibv_bind_mw verb can be called.
Added bind_mw work requests to the opcodes file and added the new local operation to rxe_req. Changed WR_REG_MASK to WR_LOCAL_MASK since it is used to identify local operations.
--- drivers/infiniband/sw/rxe/rxe_comp.c | 3 + drivers/infiniband/sw/rxe/rxe_loc.h | 1 + drivers/infiniband/sw/rxe/rxe_mw.c | 6 ++ drivers/infiniband/sw/rxe/rxe_opcode.c | 11 +++- drivers/infiniband/sw/rxe/rxe_req.c | 76 +++++++++++++++++++++----- drivers/infiniband/sw/rxe/rxe_task.h | 2 + 6 files changed, 84 insertions(+), 15 deletions(-)
drivers/infiniband/sw/rxe/rxe_comp.c +3 -0
@@ -130,6 +130,7 @@ static enum ib_wc_opcode wr_to_wc_opcode(enum ib_wr_opcode opcode)case IB_WR_RDMA_READ_WITH_INV :return IB_WC_RDMA_READ ;case IB_WR_LOCAL_INV :return IB_WC_LOCAL_INV ;case IB_WR_REG_MR :return IB_WC_REG_MR ; +case IB_WR_BIND_MW :return IB_WC_BIND_MW ;default :return 0xff ;
@@ -787,6 +788,8 @@ int rxe_completer(void *arg)*/ WARN_ON_ONCE (skb);rxe_drop_ref (qp); +// TODO this seems plain backwards +// EAGAIN normally means call me again return -EAGAIN ; done:
drivers/infiniband/sw/rxe/rxe_loc.h +1 -0
@@ -140,6 +140,7 @@ int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);struct ib_mw *rxe_alloc_mw (struct ib_pd *ibpd,enum ib_mw_type type,struct ib_udata *udata);int rxe_dealloc_mw (struct ib_mw *ibmw); +int rxe_bind_mw (struct rxe_qp *qp,struct rxe_send_wqe *wqe);/* rxe_net.c */ void rxe_loopback (struct sk_buff *skb);
drivers/infiniband/sw/rxe/rxe_mw.c +6 -0
@@ -96,3 +96,9 @@ int rxe_dealloc_mw(struct ib_mw *ibmw)return 0 ; } + +int rxe_bind_mw (struct rxe_qp *qp,struct rxe_send_wqe *wqe) +{ +pr_err ("rxe_bind_mw: not implemented\n" ); +return -ENOSYS ; +}
drivers/infiniband/sw/rxe/rxe_opcode.c +9 -2
@@ -114,13 +114,20 @@ struct rxe_wr_opcode_info rxe_wr_opcode_info[] = { [IB_WR_LOCAL_INV ] = { .name ="IB_WR_LOCAL_INV" , .mask = { - [IB_QPT_RC ] =WR_REG_MASK , + [IB_QPT_RC ] =WR_LOCAL_MASK , }, }, [IB_WR_REG_MR ] = { .name ="IB_WR_REG_MR" , .mask = { - [IB_QPT_RC ] =WR_REG_MASK , + [IB_QPT_RC ] =WR_LOCAL_MASK , + }, + }, + [IB_WR_BIND_MW ] = { + .name ="IB_WR_BIND_MW" , + .mask = { + [IB_QPT_RC ] =WR_LOCAL_MASK , + [IB_QPT_UC ] =WR_LOCAL_MASK , }, }, };
drivers/infiniband/sw/rxe/rxe_req.c +63 -13
132 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_task.h +2 -0
@@ -55,6 +55,8 @@ struct rxe_task {int ret;char name[16 ];bool destroyed; +// debug code, delete me when done +atomic_t entered; };/*
Signature · 1 line
2.25.1
PATCH 9/20 Fixed error logic in rxe_req.c
In reply to Bob PearsonFixed returned status so each error return can set
status. Now the bind_mw verb returns the correct (error) status in the wc.
--- drivers/infiniband/sw/rxe/rxe_req.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_req.c +6 -1
@@ -740,12 +740,14 @@ int rxe_requester(void *arg) skb =init_req_packet (qp, wqe, opcode, payload, &pkt);if (unlikely (!skb)) {pr_err ("qp#%d Failed allocating skb\n" ,qp_num (qp)); + wqe->status =IB_WC_LOC_PROT_ERR ; goto err; }if (fill_packet (qp, wqe, &pkt, skb, payload)) {pr_debug ("qp#%d Error during fill packet\n" ,qp_num (qp));kfree_skb (skb); + wqe->status =IB_WC_LOC_PROT_ERR ; goto err; }
@@ -769,6 +771,7 @@ int rxe_requester(void *arg) goto exit; } + wqe->status =IB_WC_LOC_PROT_ERR ;// ?? FIXME goto err; }
@@ -783,8 +786,10 @@ int rxe_requester(void *arg)* state and no more wqes will be processed unless * the qp is cleaned up and restarted. We do not want * to be called again */ - wqe->status =IB_WC_LOC_PROT_ERR ; wqe->state = wqe_state_error; +// ?? we want to force the qp into error state before +// anyone else has a chance to process another wqe but +// this could collide with an already running completer __rxe_do_task (&qp->comp.task); ret = -EAGAIN ; goto done;
Signature · 1 line
2.25.1
PATCH 10/20 Extended pools to support both keys and indices
In reply to Bob PearsonAllowed both indices and keys to exist for objects in the pools. Previously you were limited to one or the other. This will support allowing the keys on MWs to change.
--- drivers/infiniband/sw/rxe/rxe_pool.c | 73 ++++++++++++++-------------- drivers/infiniband/sw/rxe/rxe_pool.h | 32 +++++++----- 2 files changed, 58 insertions(+), 47 deletions(-)
drivers/infiniband/sw/rxe/rxe_pool.c +37 -36
@@ -177,18 +177,18 @@ static int rxe_pool_init_index(struct rxe_pool *pool, u32 max, u32 min) goto out; } - pool->max_index = max; - pool->min_index = min; + pool->index.max_index = max; + pool->index.min_index = min; size =BITS_TO_LONGS (max - min +1 ) *sizeof (long ); - pool->table =kmalloc (size,GFP_KERNEL ); -if (!pool->table) { + pool->index.table =kmalloc (size,GFP_KERNEL ); +if (!pool->index.table) { err = -ENOMEM ; goto out; } - pool->table_size = size; -bitmap_zero (pool->table, max - min +1 ); + pool->index.table_size = size; +bitmap_zero (pool->index.table, max - min +1 ); out:return err;
@@ -210,7 +210,8 @@ int rxe_pool_init( pool->max_elem = max_elem; pool->elem_size =ALIGN (size,RXE_POOL_ALIGN ); pool->flags = rxe_type_info[type].flags; - pool->tree =RB_ROOT ; + pool->index.tree =RB_ROOT ; + pool->key.tree =RB_ROOT ; pool->cleanup = rxe_type_info[type].cleanup;atomic_set (&pool->num_elem,0 );
@@ -228,8 +229,8 @@ int rxe_pool_init( }if (rxe_type_info[type].flags &RXE_POOL_KEY ) { - pool->key_offset = rxe_type_info[type].key_offset; - pool->key_size = rxe_type_info[type].key_size; + pool->key.key_offset = rxe_type_info[type].key_offset; + pool->key.key_size = rxe_type_info[type].key_size; } pool->state =RXE_POOL_STATE_VALID ;
@@ -243,7 +244,7 @@ static void rxe_pool_release(struct kref *kref) struct rxe_pool *pool = container_of(kref, struct rxe_pool, ref_cnt); pool->state =RXE_POOL_STATE_INVALID ; -kfree (pool->table); +kfree (pool->index.table); }static void rxe_pool_put (struct rxe_pool *pool)
@@ -268,27 +269,27 @@ void rxe_pool_cleanup(struct rxe_pool *pool)static u32 alloc_index (struct rxe_pool *pool) {u32 index; -u32 range = pool->max_index - pool->min_index +1 ; +u32 range = pool->index.max_index - pool->index.min_index +1 ; - index =find_next_zero_bit (pool->table, range, pool->last); + index =find_next_zero_bit (pool->index.table, range, pool->index.last);if (index >= range) - index =find_first_zero_bit (pool->table, range); + index =find_first_zero_bit (pool->index.table, range);WARN_ON_ONCE (index >= range); -set_bit (index, pool->table); - pool->last = index; -return index + pool->min_index; +set_bit (index, pool->index.table); + pool->index.last = index; +return index + pool->index.min_index; }static void insert_index (struct rxe_pool *pool,struct rxe_pool_entry *new) { -struct rb_node **link = &pool->tree.rb_node; +struct rb_node **link = &pool->index.tree.rb_node;struct rb_node *parent =NULL ;struct rxe_pool_entry *elem;while (*link) { parent = *link; - elem = rb_entry(parent, struct rxe_pool_entry, node); + elem = rb_entry(parent, struct rxe_pool_entry, index_node);if (elem->index == new->index) {pr_warn ("element already exists!\n" );
@@ -301,25 +302,25 @@ static void insert_index(struct rxe_pool *pool, struct rxe_pool_entry *new) link = &(*link)->rb_right; } -rb_link_node (&new->node, parent, link); -rb_insert_color (&new->node, &pool->tree); +rb_link_node (&new->index_node, parent, link); +rb_insert_color (&new->index_node, &pool->index.tree); out:return ; }static void insert_key (struct rxe_pool *pool,struct rxe_pool_entry *new) { -struct rb_node **link = &pool->tree.rb_node; +struct rb_node **link = &pool->key.tree.rb_node;struct rb_node *parent =NULL ;struct rxe_pool_entry *elem;int cmp;while (*link) { parent = *link; - elem = rb_entry(parent, struct rxe_pool_entry, node); + elem = rb_entry(parent, struct rxe_pool_entry, key_node); - cmp =memcmp ((u8 *)elem + pool->key_offset, - (u8 *)new + pool->key_offset, pool->key_size); + cmp =memcmp ((u8 *)elem + pool->key.key_offset, + (u8 *)new + pool->key.key_offset, pool->key.key_size);if (cmp ==0 ) {pr_warn ("key already exists!\n" );
@@ -332,8 +333,8 @@ static void insert_key(struct rxe_pool *pool, struct rxe_pool_entry *new) link = &(*link)->rb_right; } -rb_link_node (&new->node, parent, link); -rb_insert_color (&new->node, &pool->tree); +rb_link_node (&new->key_node, parent, link); +rb_insert_color (&new->key_node, &pool->key.tree); out:return ; }
@@ -345,7 +346,7 @@ void rxe_add_key(void *arg, void *key)unsigned long flags;write_lock_irqsave (&pool->pool_lock, flags); -memcpy ((u8 *)elem + pool->key_offset, key, pool->key_size); +memcpy ((u8 *)elem + pool->key.key_offset, key, pool->key.key_size);insert_key (pool, elem);write_unlock_irqrestore (&pool->pool_lock, flags); }
@@ -357,7 +358,7 @@ void rxe_drop_key(void *arg)unsigned long flags;write_lock_irqsave (&pool->pool_lock, flags); -rb_erase (&elem->node, &pool->tree); +rb_erase (&elem->key_node, &pool->key.tree);write_unlock_irqrestore (&pool->pool_lock, flags); }
@@ -380,8 +381,8 @@ void rxe_drop_index(void *arg)unsigned long flags;write_lock_irqsave (&pool->pool_lock, flags); -clear_bit (elem->index - pool->min_index, pool->table); -rb_erase (&elem->node, &pool->tree); +clear_bit (elem->index - pool->index.min_index, pool->index.table); +rb_erase (&elem->index_node, &pool->index.tree);write_unlock_irqrestore (&pool->pool_lock, flags); }
@@ -485,10 +486,10 @@ void *rxe_pool_get_index(struct rxe_pool *pool, u32 index)if (pool->state !=RXE_POOL_STATE_VALID ) goto out; - node = pool->tree.rb_node; + node = pool->index.tree.rb_node;while (node) { - elem = rb_entry(node, struct rxe_pool_entry, node); + elem = rb_entry(node, struct rxe_pool_entry, index_node);if (elem->index > index) node = node->rb_left;
@@ -517,13 +518,13 @@ void *rxe_pool_get_key(struct rxe_pool *pool, void *key)if (pool->state !=RXE_POOL_STATE_VALID ) goto out; - node = pool->tree.rb_node; + node = pool->key.tree.rb_node;while (node) { - elem = rb_entry(node, struct rxe_pool_entry, node); + elem = rb_entry(node, struct rxe_pool_entry, key_node); - cmp =memcmp ((u8 *)elem + pool->key_offset, - key, pool->key_size); + cmp =memcmp ((u8 *)elem + pool->key.key_offset, + key, pool->key.key_size);if (cmp >0 ) node = node->rb_left;
drivers/infiniband/sw/rxe/rxe_pool.h +21 -11
@@ -84,8 +84,11 @@ struct rxe_pool_entry {struct kref ref_cnt;struct list_head list; -/* only used if indexed or keyed */ -struct rb_node node; +/* only used if keyed */ +struct rb_node key_node; + +/* only used if indexed */ +struct rb_node index_node;u32 index; };
@@ -102,15 +105,22 @@ struct rxe_pool {unsigned int max_elem;atomic_t num_elem; -/* only used if indexed or keyed */ -struct rb_root tree; -unsigned long *table; -size_t table_size; -u32 max_index; -u32 min_index; -u32 last; -size_t key_offset; -size_t key_size; +/* only used if indexed */ +struct { +struct rb_root tree; +unsigned long *table; +size_t table_size; +u32 last; +u32 max_index; +u32 min_index; + } index; + +/* only used if keyed */ +struct { +struct rb_root tree; +size_t key_offset; +size_t key_size; + } key; };/* initialize slab caches for managed objects */
Signature · 1 line
2.25.1
PATCH 11/20 Gave MRs and MWs both keys and indices
In reply to Bob PearsonFinished decoupling indices and keys for MW and MR
objects. Now user space can refer to an object by index and kernel can lookup object with l/rkey.
Tweaked the user/kernel ABI for rxe WQEs to use indices instead of rkeys to identify MWs and MRs.
Type 1 MWs can now be bound with the ibv_bind_mw api.
--- drivers/infiniband/sw/rxe/rxe_loc.h | 3 + drivers/infiniband/sw/rxe/rxe_mr.c | 55 +++++++----- drivers/infiniband/sw/rxe/rxe_mw.c | 116 ++++++++++++++++++++++---- drivers/infiniband/sw/rxe/rxe_pool.c | 30 ++++--- drivers/infiniband/sw/rxe/rxe_pool.h | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 28 ++++++- include/uapi/rdma/rdma_user_rxe.h | 34 +++++++- 7 files changed, 212 insertions(+), 56 deletions(-)
drivers/infiniband/sw/rxe/rxe_loc.h +3 -0
@@ -98,6 +98,8 @@ struct rxe_mmap_info *rxe_create_mmap_info(struct rxe_dev *dev, u32 size,int rxe_mmap (struct ib_ucontext *context,struct vm_area_struct *vma);/* rxe_mr.c */ +void rxe_set_mr_lkey (struct rxe_mr *mr); +enum copy_direction { to_mr_obj, from_mr_obj,
@@ -137,6 +139,7 @@ void rxe_mr_cleanup(struct rxe_pool_entry *arg);int advance_dma_data (struct rxe_dma_info *dma,unsigned int length);/* rxe_mw.c */ +void rxe_set_mw_rkey (struct rxe_mw *mw);struct ib_mw *rxe_alloc_mw (struct ib_pd *ibpd,enum ib_mw_type type,struct ib_udata *udata);int rxe_dealloc_mw (struct ib_mw *ibmw);
drivers/infiniband/sw/rxe/rxe_mr.c +36 -19
106 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_mw.c +99 -17
162 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_pool.c +19 -11
@@ -34,10 +34,6 @@#include "rxe.h" #include "rxe_loc.h" -/* info about object pools -* note that mr and mw share a single index space -* so that one can map an lkey to the correct type of object -*/ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES ] = { [RXE_TYPE_UC ] = { .name ="rxe-uc" ,
@@ -79,16 +75,22 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = { .name = "rxe-mr", .size = sizeof(struct rxe_mr), .cleanup = rxe_mr_cleanup, - .flags = RXE_POOL_INDEX, + .flags =RXE_POOL_INDEX + | RXE_POOL_KEY, .max_index = RXE_MAX_MR_INDEX, .min_index = RXE_MIN_MR_INDEX, + .key_offset = offsetof(struct rxe_mr, ibmr.lkey), + .key_size = sizeof(u32), }, [RXE_TYPE_MW] = { .name = "rxe-mw", .size = sizeof(struct rxe_mw), - .flags = RXE_POOL_INDEX, + .flags =RXE_POOL_INDEX + | RXE_POOL_KEY, .max_index = RXE_MAX_MW_INDEX, .min_index = RXE_MIN_MW_INDEX, + .key_offset = offsetof(struct rxe_mw, ibmw.rkey), + .key_size = sizeof(u32), }, [RXE_TYPE_MC_GRP] = { .name = "rxe-mc_grp",
@@ -308,8 +310,9 @@ static void insert_index(struct rxe_pool *pool, struct rxe_pool_entry *new)return ; } -static void insert_key (struct rxe_pool *pool,struct rxe_pool_entry *new) +static int insert_key (struct rxe_pool *pool,struct rxe_pool_entry *new) { +int ret;struct rb_node **link = &pool->key.tree.rb_node;struct rb_node *parent =NULL ;struct rxe_pool_entry *elem;
@@ -323,7 +326,7 @@ static void insert_key(struct rxe_pool *pool, struct rxe_pool_entry *new) (u8 *)new + pool->key.key_offset, pool->key.key_size);if (cmp ==0 ) { -pr_warn ("key already exists!\n" ); + ret = -EAGAIN ; goto out; }
@@ -335,20 +338,25 @@ static void insert_key(struct rxe_pool *pool, struct rxe_pool_entry *new)rb_link_node (&new->key_node, parent, link);rb_insert_color (&new->key_node, &pool->key.tree); + + ret =0 ; out: -return ; +return ret; } -void rxe_add_key (void *arg,void *key) +int rxe_add_key (void *arg,void *key) { +int ret;struct rxe_pool_entry *elem = arg;struct rxe_pool *pool = elem->pool;unsigned long flags;write_lock_irqsave (&pool->pool_lock, flags);memcpy ((u8 *)elem + pool->key.key_offset, key, pool->key.key_size); -insert_key (pool, elem); + ret =insert_key (pool, elem);write_unlock_irqrestore (&pool->pool_lock, flags); + +return ret; }void rxe_drop_key (void *arg)
drivers/infiniband/sw/rxe/rxe_pool.h +1 -1
@@ -156,7 +156,7 @@ void rxe_drop_index(void *elem);/* assign a key to a keyed object and insert object into * pool's rb tree */ -void rxe_add_key (void *elem,void *key); +int rxe_add_key (void *elem,void *key);/* remove elem from rb tree */ void rxe_drop_key (void *elem);
drivers/infiniband/sw/rxe/rxe_verbs.c +24 -4
@@ -911,9 +911,20 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, int access, struct ib_udata *udata) { int err; +struct rxe_mr *mr;struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); -struct rxe_mr *mr; +struct rxe_reg_mr_resp __user *uresp =NULL ; + +if (udata) { +if (udata->outlen <sizeof (*uresp)) { + err = -EINVAL ; + goto err2; + } + uresp = udata->outbuf; + } + +rxe_add_ref (pd); mr =rxe_alloc (&rxe->mr_pool);if (!mr) {
@@ -923,19 +934,28 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,rxe_add_index (mr); -rxe_add_ref (pd); - err =rxe_mr_init_user (pd, start, length, iova, access, udata, mr);if (err) goto err3; +pr_info ("rxe_reg_user_mr: index = 0x%08x, rkey = 0x%08x\n" , + mr->pelem.index, mr->ibmr.rkey); + +if (uresp) { +if (copy_to_user (&uresp->index, &mr->pelem.index, +sizeof (uresp->index))) { + err = -EFAULT ; + goto err3; + } + } +return &mr->ibmr; err3: -rxe_drop_ref (pd);rxe_drop_index (mr);rxe_drop_ref (mr); +rxe_drop_ref (pd); err2:return ERR_PTR (err); }
include/uapi/rdma/rdma_user_rxe.h +30 -4
@@ -96,12 +96,28 @@ struct rxe_send_wr {struct {__aligned_u64 addr;__aligned_u64 length; -__u32 mr_rkey; -__u32 mw_rkey; +__u32 mr_index; +__u32 pad1; +__u32 mw_index; +__u32 pad2;__u32 rkey;__u32 access; - } bind_mw; -/* reg is only used by the kernel and is not part of the uapi */ + } umw; +/* below are only used by the kernel */ +struct { +__aligned_u64 addr; +__aligned_u64 length; +union { +struct ib_mr *ibmr; +__aligned_u64 reserved1; + }; +union { +struct ib_mw *ibmw; +__aligned_u64 reserved2; + }; +__u32 rkey; +__u32 access; + } kmw; struct { union { struct ib_mr *mr;
@@ -183,4 +199,14 @@ struct rxe_modify_srq_cmd { __aligned_u64 mmap_info_addr; }; +struct rxe_reg_mr_resp { +__u32 index; +__u32 reserved; +}; + +struct rxe_alloc_mw_resp { +__u32 index; +__u32 reserved; +}; +#endif /* RDMA_USER_RXE_H */
Signature · 1 line
2.25.1
PATCH 12/20 Cleanup after git pull
In reply to Bob PearsonAn experiment with rebase made a tiny mess which I cleaned up. This one slipped through.
--- drivers/infiniband/sw/rxe/rxe_loc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_loc.h +1 -1
@@ -105,7 +105,7 @@ enum copy_direction { from_mr_obj, }; -int rxe_mr_init_dma (struct rxe_pd *pd, +void rxe_mr_init_dma (struct rxe_pd *pd,int access,struct rxe_mr *mr); int rxe_mr_init_user(struct rxe_pd *pd, u64 start,
Signature · 1 line
2.25.1
PATCH 13/20 add debug print statements
In reply to Bob PearsonAdded some debug prints to help out. They will go away later.
--- drivers/infiniband/sw/rxe/rxe_verbs.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/infiniband/sw/rxe/rxe_verbs.c +22 -3
@@ -172,6 +172,8 @@ static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); +pr_info ("rxe_alloc_pd: called\n" ); +return rxe_add_to_pool (&rxe->pd_pool, &pd->pelem); }
@@ -179,6 +181,8 @@ static void rxe_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) {struct rxe_pd *pd =to_rpd (ibpd); +pr_info ("rxe_dealloc_pd: called\n" ); +rxe_drop_ref (pd); }
@@ -410,6 +414,8 @@ static struct ib_qp *rxe_create_qp(struct ib_pd *ibpd,struct rxe_qp *qp;struct rxe_create_qp_resp __user *uresp =NULL ; +pr_info ("rxe_create_qp: called\n" ); +if (udata) {if (udata->outlen <sizeof (*uresp))return ERR_PTR (-EINVAL );
@@ -457,6 +463,8 @@ static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,struct rxe_dev *rxe =to_rdev (ibqp->device);struct rxe_qp *qp =to_rqp (ibqp); +pr_info ("rxe_modify_qp: called\n" ); + err =rxe_qp_chk_attr (rxe, qp, attr, mask);if (err) goto err1;
@@ -476,6 +484,8 @@ static int rxe_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, {struct rxe_qp *qp =to_rqp (ibqp); +pr_info ("rxe_query_qp: called\n" ); +rxe_qp_to_init (qp, init);rxe_qp_to_attr (qp, attr, mask);
@@ -486,6 +496,8 @@ static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) {struct rxe_qp *qp =to_rqp (ibqp); +pr_info ("rxe_destroy_qp: called\n" ); +rxe_qp_destroy (qp);rxe_drop_index (qp);rxe_drop_ref (qp);
@@ -782,6 +794,8 @@ static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,struct rxe_cq *cq =to_rcq (ibcq);struct rxe_create_cq_resp __user *uresp =NULL ; +pr_info ("rxe_create_cq: called\n" ); +if (udata) {if (udata->outlen <sizeof (*uresp))return -EINVAL ;
@@ -807,6 +821,8 @@ static void rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) {struct rxe_cq *cq =to_rcq (ibcq); +pr_info ("rxe_destroy_cq: called\n" ); +rxe_cq_disable (cq);rxe_drop_ref (cq);
@@ -846,6 +862,8 @@ static int rxe_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)struct rxe_cqe *cqe;unsigned long flags; +pr_info ("rxe_poll_cq: called\n" ); +spin_lock_irqsave (&cq->cq_lock, flags);for (i =0 ; i < num_entries; i++) { cqe =queue_head (cq->queue);
@@ -916,6 +934,8 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,struct rxe_pd *pd =to_rpd (ibpd);struct rxe_reg_mr_resp __user *uresp =NULL ; +pr_info ("rxe_reg_user_mr: called\n" ); +if (udata) {if (udata->outlen <sizeof (*uresp)) { err = -EINVAL ;
@@ -939,9 +959,6 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,if (err) goto err3; -pr_info ("rxe_reg_user_mr: index = 0x%08x, rkey = 0x%08x\n" , - mr->pelem.index, mr->ibmr.rkey); -if (uresp) {if (copy_to_user (&uresp->index, &mr->pelem.index,sizeof (uresp->index))) {
@@ -964,6 +981,8 @@ static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) {struct rxe_mr *mr =to_rmr (ibmr); +pr_info ("rxe_dereg_user_mr: called\n" ); + mr->state =RXE_MEM_STATE_ZOMBIE ;rxe_drop_ref (mr->pd);rxe_drop_index (mr);
Signature · 1 line
2.25.1
PATCH 14/20 Addresses an issue with hardened user copy
In reply to Bob PearsonCopying to user space from the stack instead of slab cache cured a kernel oops that was toubling me.A
--- drivers/infiniband/core/uverbs_std_types_qp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/core/uverbs_std_types_qp.c +4 -2
@@ -98,6 +98,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(struct ib_device *device;u64 user_handle;int ret; +int qp_num; ret =uverbs_copy_from_or_zero (&cap, attrs,UVERBS_ATTR_CREATE_QP_CAP );
@@ -293,9 +294,10 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(if (ret)return ret; +/* copy from stack to avoid whitelisting issues */ + qp_num = qp->qp_num; ret =uverbs_copy_to (attrs,UVERBS_ATTR_CREATE_QP_RESP_QP_NUM , - &qp->qp_num, -sizeof (qp->qp_num)); + &qp_num,sizeof (qp_num));return ret; err_put:
Signature · 1 line
2.25.1
PATCH 15/20 Fixed a dumb bug
In reply to Bob Pearsonadded code to prevent infinite loops in get l/rkey added a drop_key in mr dereg (fixing the root cause of loops)
--- drivers/infiniband/sw/rxe/rxe_mr.c | 22 +++++++++++----------- drivers/infiniband/sw/rxe/rxe_mw.c | 24 +++++++++++++----------- drivers/infiniband/sw/rxe/rxe_verbs.c | 1 + 3 files changed, 25 insertions(+), 22 deletions(-)
drivers/infiniband/sw/rxe/rxe_mr.c +11 -11
@@ -34,20 +34,20 @@#include "rxe.h" #include "rxe_loc.h" -/* choose a unique non zero random number for lkey */ +/* choose a unique non zero random number for lkey +* use high order bit to indicate MR vs MW */ void rxe_set_mr_lkey (struct rxe_mr *mr) { -int ret;u32 lkey; - -next_lkey: -get_random_bytes (&lkey,sizeof (lkey)); - lkey &=0x7fffffff ; -if (unlikely (lkey ==0 )) - goto next_lkey; - ret =rxe_add_key (mr, &lkey); -if (unlikely (ret == -EAGAIN )) - goto next_lkey; +int tries =0 ; + +do { +get_random_bytes (&lkey,sizeof (lkey)); + lkey &=0x7fffffff ; +if (likely (lkey && (rxe_add_key (mr, &lkey) ==0 ))) +return ; + }while (tries++ <10 ); +pr_err ("rxe_set_mr_lkey: unable to get random lkey\n" ); }#if 0
drivers/infiniband/sw/rxe/rxe_mw.c +13 -11
@@ -35,22 +35,24 @@#include "rxe.h" #include "rxe_loc.h" -/* choose a unique non zero random number for rkey */ +/* choose a unique non zero random number for rkey +* use high order bit to indicate MR vs MW */ void rxe_set_mw_rkey (struct rxe_mw *mw) { -int ret;u32 rkey; - -next_rkey: -get_random_bytes (&rkey,sizeof (rkey)); -if (unlikely (rkey ==0 )) - goto next_rkey; - rkey |=0x80000000 ; - ret =rxe_add_key (mw, &rkey); -if (unlikely (ret == -EAGAIN )) - goto next_rkey; +int tries =0 ; + +do { +get_random_bytes (&rkey,sizeof (rkey)); + rkey |=0x80000000 ; +if (likely ((rkey &0x7fffffff ) && + (rxe_add_key (mw, &rkey) ==0 ))) +return ; + }while (tries++ <10 ); +pr_err ("rxe_set_mw_rkey: unable to get random rkey\n" ); } +/* place holder alloc and dealloc routines * TODO add cross references between qp and mr with mw * and cleanup when one side is deleted. Enough to make
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -0
@@ -986,6 +986,7 @@ static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) mr->state =RXE_MEM_STATE_ZOMBIE ;rxe_drop_ref (mr->pd);rxe_drop_index (mr); +rxe_drop_key (mr);rxe_drop_ref (mr);return 0 ; }
Signature · 1 line
2.25.1
PATCH 16/20 Implemented stubbed invalidate APIs
In reply to Bob PearsonFixed a bug in rxe_req that killed the last WC in error. Added a teardown/completion routine for MWs. Invalidate routines are still stubs. Still need to clean up some error path code for both MR and MW. Added atomics to detect reentrancy in the tasklets for now. Will go away later.
--- drivers/infiniband/sw/rxe/rxe_comp.c | 18 ++++-- drivers/infiniband/sw/rxe/rxe_loc.h | 3 + drivers/infiniband/sw/rxe/rxe_mr.c | 17 ++++- drivers/infiniband/sw/rxe/rxe_mw.c | 33 +++++++--- drivers/infiniband/sw/rxe/rxe_pool.c | 11 ++++ drivers/infiniband/sw/rxe/rxe_req.c | 91 +++++++++++++++------------ drivers/infiniband/sw/rxe/rxe_resp.c | 57 +++++++++++++---- drivers/infiniband/sw/rxe/rxe_verbs.c | 4 -- 8 files changed, 162 insertions(+), 72 deletions(-)
drivers/infiniband/sw/rxe/rxe_comp.c +14 -4
@@ -563,12 +563,20 @@ int rxe_completer(void *arg)struct sk_buff *skb =NULL ;struct rxe_pkt_info *pkt =NULL ;enum comp_state state; +int entered;rxe_add_ref (qp); +// this code is 'guaranteed' to never be entered more +// than once. Check to make sure that this is the case + entered =atomic_inc_return (&qp->comp.task.entered); +if (entered >1 ) { +pr_err ("rxe_completer: entered %d times\n" , entered); + } +if (!qp->valid || qp->req.state ==QP_STATE_ERROR || qp->req.state ==QP_STATE_RESET ) { -rxe_drain_resp_pkts (qp, qp->valid && +rxe_drain_resp_pkts (qp, qp->valid && qp->req.state ==QP_STATE_ERROR ); goto exit; }
@@ -782,14 +790,14 @@ int rxe_completer(void *arg) } } +/* these are the same. need to merge them TODO */ exit:/* we come here if we are done with processing and want the task to -* exit from the loop calling us +* exit from the loop calling us -- to call us again later */ WARN_ON_ONCE (skb); +atomic_dec (&qp->comp.task.entered);rxe_drop_ref (qp); -// TODO this seems plain backwards -// EAGAIN normally means call me again return -EAGAIN ; done:
@@ -797,6 +805,8 @@ int rxe_completer(void *arg)* us again to see if there is anything else to do */ WARN_ON_ONCE (skb); +atomic_dec (&qp->comp.task.entered);rxe_drop_ref (qp);return 0 ; + }
drivers/infiniband/sw/rxe/rxe_loc.h +3 -0
@@ -137,6 +137,7 @@ int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);void rxe_mr_cleanup (struct rxe_pool_entry *arg);int advance_dma_data (struct rxe_dma_info *dma,unsigned int length); +int rxe_invalidate_mr (struct rxe_mr *mr,int remote);/* rxe_mw.c */ void rxe_set_mw_rkey (struct rxe_mw *mw);
@@ -144,6 +145,8 @@ struct ib_mw *rxe_alloc_mw(struct ib_pd *ibpd, enum ib_mw_type type, struct ib_udata *udata);int rxe_dealloc_mw (struct ib_mw *ibmw);int rxe_bind_mw (struct rxe_qp *qp,struct rxe_send_wqe *wqe); +void rxe_mw_cleanup (struct rxe_pool_entry *arg); +int rxe_invalidate_mw (struct rxe_mw *mw,int remote);/* rxe_net.c */ void rxe_loopback (struct sk_buff *skb);
drivers/infiniband/sw/rxe/rxe_mr.c +15 -2
@@ -47,7 +47,7 @@ void rxe_set_mr_lkey(struct rxe_mr *mr)if (likely (lkey && (rxe_add_key (mr, &lkey) ==0 )))return ; }while (tries++ <10 ); -pr_err ("rxe_set_mr_lkey: unable to get random lkey\n" ); +pr_err ("unable to get random key for mr\n" ); }#if 0
@@ -114,7 +114,8 @@ void rxe_mr_cleanup(struct rxe_pool_entry *arg)struct rxe_mr *mr =container_of (arg,typeof (*mr), pelem);int i; -ib_umem_release (mr->umem); +if (mr->umem) +ib_umem_release (mr->umem);if (mr->map) {for (i =0 ; i < mr->num_map; i++)
@@ -122,6 +123,9 @@ void rxe_mr_cleanup(struct rxe_pool_entry *arg)kfree (mr->map); } + +rxe_drop_index (mr); +rxe_drop_key (mr); }static int rxe_mr_alloc (struct rxe_mr *mr,int num_buf)
@@ -602,3 +606,12 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,return mr; } + +int rxe_invalidate_mr (struct rxe_mr *mr,int remote) +{ +// more TODO here, can fail + + mr->state =RXE_MEM_STATE_FREE ; + +return 0 ; +}
drivers/infiniband/sw/rxe/rxe_mw.c +23 -10
@@ -49,7 +49,7 @@ void rxe_set_mw_rkey(struct rxe_mw *mw) (rxe_add_key(mw, &rkey) == 0)))return ; }while (tries++ <10 ); -pr_err ("rxe_set_mw_rkey: unable to get random rkey\n" ); +pr_err ("unable to get random rkey for mw\n" ); }
@@ -91,9 +91,6 @@ struct ib_mw *rxe_alloc_mw(struct ib_pd *ibpd, enum ib_mw_type type,rxe_add_index (mw);rxe_set_mw_rkey (mw); -pr_info ("rxe_alloc_mw: index = 0x%08x, rkey = 0x%08x\n" , - mw->pelem.index, mw->ibmw.rkey); -spin_lock_init (&mw->lock);if (type ==IB_MW_TYPE_2 ) {
@@ -120,8 +117,6 @@ struct ib_mw *rxe_alloc_mw(struct ib_pd *ibpd, enum ib_mw_type type,return &mw->ibmw; err2: -rxe_drop_key (mw); -rxe_drop_index (mw);rxe_drop_ref (mw);rxe_drop_ref (pd); err1:
@@ -138,8 +133,6 @@ int rxe_dealloc_mw(struct ib_mw *ibmw) mw->state =RXE_MW_STATE_INVALID ;spin_unlock_irqrestore (&mw->lock, flags); -rxe_drop_key (mw); -rxe_drop_index (mw);rxe_drop_ref (pd);rxe_drop_ref (mw);
@@ -151,8 +144,6 @@ int rxe_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe)struct rxe_mw *mw;struct rxe_mr *mr; -pr_info ("rxe_bind_mw: called\n" ); -if (qp->is_user) { }else { mw =to_rmw (wqe->wr.wr.kmw.ibmw);
@@ -186,3 +177,25 @@ int rxe_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe)#endif return 0 ; } + +void rxe_mw_cleanup (struct rxe_pool_entry *arg) +{ +struct rxe_mw *mw =container_of (arg,typeof (*mw), pelem); + +rxe_drop_index (mw); +rxe_drop_key (mw); +} + +int rxe_invalidate_mw (struct rxe_mw *mw,int remote) +{ +/* type 1 MWs don't support invalidate */ +if (mw->ibmw.type ==IB_MW_TYPE_1 ) { +pr_err ("attempt to %s-invalidate a type 1 mw\n" , + remote ?"send" :"local" ); +return -EINVAL ; + } + + mw->state =RXE_MEM_STATE_FREE ; + +return 0 ; +}
drivers/infiniband/sw/rxe/rxe_pool.c +11 -0
@@ -85,6 +85,7 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = { [RXE_TYPE_MW] = { .name = "rxe-mw", .size = sizeof(struct rxe_mw), + .cleanup = rxe_mw_cleanup, .flags =RXE_POOL_INDEX | RXE_POOL_KEY, .max_index = RXE_MAX_MW_INDEX,
@@ -365,6 +366,11 @@ void rxe_drop_key(void *arg)struct rxe_pool *pool = elem->pool;unsigned long flags; +if (elem ==NULL ) { +pr_warn ("rxe_drop_key: called with null pointer\n" ); +return ; + } +write_lock_irqsave (&pool->pool_lock, flags);rb_erase (&elem->key_node, &pool->key.tree);write_unlock_irqrestore (&pool->pool_lock, flags);
@@ -388,6 +394,11 @@ void rxe_drop_index(void *arg)struct rxe_pool *pool = elem->pool;unsigned long flags; +if (elem ==NULL ) { +pr_warn ("rxe_drop_index: called with null pointer\n" ); +return ; + } +write_lock_irqsave (&pool->pool_lock, flags);clear_bit (elem->index - pool->index.min_index, pool->index.table);rb_erase (&elem->index_node, &pool->index.tree);
drivers/infiniband/sw/rxe/rxe_req.c +52 -39
126 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_resp.c +44 -13
112 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_verbs.c +0 -4
@@ -970,7 +970,6 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,return &mr->ibmr; err3: -rxe_drop_index (mr);rxe_drop_ref (mr);rxe_drop_ref (pd); err2:
@@ -985,8 +984,6 @@ static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) mr->state =RXE_MEM_STATE_ZOMBIE ;rxe_drop_ref (mr->pd); -rxe_drop_index (mr); -rxe_drop_key (mr);rxe_drop_ref (mr);return 0 ; }
@@ -1020,7 +1017,6 @@ static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type, err2:rxe_drop_ref (pd); -rxe_drop_index (mr);rxe_drop_ref (mr); err1:return ERR_PTR (err);
Signature · 1 line
2.25.1
PATCH 17/20 Implemented functional invalidate APIs
In reply to Bob PearsonMade progress on details of mw alloc, bind, invalidate
and dealloc. added a private flags field in rxe_send_wqe to allow ibv_bind_mw to safely tell the kernel that bind has come through ibv_bind_mw. The IBA requires that type 1 MWs can only be bound by the ibv_bind_mw API and type 2 MWs by send WRs. But we implement the bind_mw call with WRs too since rdma-core does not implement the verbs call. Need to cleanly separate the two cases.
After implementing the checking core for MWs it is clear that MRs require more effort to comply with the standard.
--- drivers/infiniband/sw/rxe/rxe_loc.h | 4 +- drivers/infiniband/sw/rxe/rxe_mr.c | 44 +-- drivers/infiniband/sw/rxe/rxe_mw.c | 383 ++++++++++++++++++++------ drivers/infiniband/sw/rxe/rxe_param.h | 2 + drivers/infiniband/sw/rxe/rxe_req.c | 23 +- drivers/infiniband/sw/rxe/rxe_resp.c | 12 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 25 +- drivers/infiniband/sw/rxe/rxe_verbs.h | 9 +- include/uapi/rdma/rdma_user_rxe.h | 2 + 9 files changed, 366 insertions(+), 138 deletions(-)
drivers/infiniband/sw/rxe/rxe_loc.h +2 -2
@@ -137,7 +137,7 @@ int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);void rxe_mr_cleanup (struct rxe_pool_entry *arg);int advance_dma_data (struct rxe_dma_info *dma,unsigned int length); -int rxe_invalidate_mr (struct rxe_mr *mr,int remote); +int rxe_invalidate_mr (struct rxe_qp *qp,struct rxe_mr *mr);/* rxe_mw.c */ void rxe_set_mw_rkey (struct rxe_mw *mw);
@@ -146,7 +146,7 @@ struct ib_mw *rxe_alloc_mw(struct ib_pd *ibpd, enum ib_mw_type type,int rxe_dealloc_mw (struct ib_mw *ibmw);int rxe_bind_mw (struct rxe_qp *qp,struct rxe_send_wqe *wqe);void rxe_mw_cleanup (struct rxe_pool_entry *arg); -int rxe_invalidate_mw (struct rxe_mw *mw,int remote); +int rxe_invalidate_mw (struct rxe_qp *qp,struct rxe_mw *mw);/* rxe_net.c */ void rxe_loopback (struct sk_buff *skb);
drivers/infiniband/sw/rxe/rxe_mr.c +23 -21
59 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_mw.c +306 -77
453 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_param.h +2 -0
@@ -75,7 +75,9 @@ enum rxe_device_param { | IB_DEVICE_SYS_IMAGE_GUID |IB_DEVICE_RC_RNR_NAK_GEN |IB_DEVICE_SRQ_RESIZE + |IB_DEVICE_MEM_WINDOW |IB_DEVICE_MEM_MGT_EXTENSIONS + |IB_DEVICE_MEM_WINDOW_TYPE_2B |IB_DEVICE_ALLOW_USER_UNREG ,RXE_MAX_SGE =32 , RXE_MAX_WQE_SIZE = sizeof(struct rxe_send_wqe) +
drivers/infiniband/sw/rxe/rxe_req.c +14 -9
@@ -583,18 +583,19 @@ static void update_state(struct rxe_qp *qp, struct rxe_send_wqe *wqe, jiffies + qp->qp_timeout_jiffies); } -static int local_invalidate (struct rxe_dev *rxe,struct rxe_send_wqe *wqe) +static int local_invalidate (struct rxe_qp *qp,struct rxe_send_wqe *wqe) {int ret;struct rxe_mr *mr;struct rxe_mw *mw; +struct rxe_dev *rxe =to_rdev (qp->ibqp.device);u32 key = wqe->wr.ex.invalidate_rkey;if ((mr =rxe_pool_get_key (&rxe->mr_pool, &key))) { - ret =rxe_invalidate_mr (mr,0 ); + ret =rxe_invalidate_mr (qp, mr);rxe_drop_ref (mr); }else if ((mw =rxe_pool_get_key (&rxe->mw_pool, &key))) { - ret =rxe_invalidate_mw (mw,0 ); + ret =rxe_invalidate_mw (qp, mw);rxe_drop_ref (mw); }else { ret = -EINVAL ;
@@ -607,7 +608,6 @@ static int local_invalidate(struct rxe_dev *rxe, struct rxe_send_wqe *wqe)int rxe_requester (void *arg) {struct rxe_qp *qp = (struct rxe_qp *)arg; -struct rxe_dev *rxe =to_rdev (qp->ibqp.device);struct rxe_mr *mr;struct rxe_pkt_info pkt;struct sk_buff *skb;
@@ -621,8 +621,6 @@ int rxe_requester(void *arg)u32 rollback_psn;int entered; -pr_info ("rxe_requester: called\n" ); -rxe_add_ref (qp);// this code is 'guaranteed' to never be entered more
@@ -655,13 +653,18 @@ int rxe_requester(void *arg) goto exit;/* process local operations */ +/* current behavior if an error occurs +* for any of these local operations +* is to generate an error work completion +* then error the QP and flush any +* remaining WRs */ if (wqe->mask &WR_LOCAL_MASK ) { wqe->state = wqe_state_done; wqe->status =IB_WC_SUCCESS ;switch (wqe->wr.opcode) {case IB_WR_LOCAL_INV : -if ((ret =local_invalidate (rxe, wqe))) +if ((ret =local_invalidate (qp, wqe))) wqe->status =IB_WC_LOC_QP_OP_ERR ;break ;case IB_WR_REG_MR :
@@ -677,8 +680,10 @@ int rxe_requester(void *arg) wqe->status =IB_WC_MW_BIND_ERR ;break ;default : -pr_err ("rxe_requester: unexpected local WR opcode = %d\n" , - wqe->wr.opcode); +pr_err ("rxe_requester: unexpected local" +" WR opcode = %d\n" , wqe->wr.opcode); +/* these should be memory operation errors +* but there isn't one available */ wqe->status =IB_WC_LOC_QP_OP_ERR ; }
drivers/infiniband/sw/rxe/rxe_resp.c +5 -7
@@ -834,19 +834,17 @@ static enum resp_states execute(struct rxe_qp *qp, struct rxe_pkt_info *pkt)return RESPST_CLEANUP ; } -static int send_invalidate (struct rxe_dev *rxe,u32 rkey) +static int send_invalidate (struct rxe_qp *qp,struct rxe_dev *rxe,u32 rkey) {int ret;struct rxe_mr *mr;struct rxe_mw *mw; -pr_info ("send_invalidate: called\n" ); -if ((mr =rxe_pool_get_key (&rxe->mr_pool, &rkey))) { - ret =rxe_invalidate_mr (mr,1 ); + ret =rxe_invalidate_mr (qp, mr);rxe_drop_ref (mr); }else if ((mw =rxe_pool_get_key (&rxe->mw_pool, &rkey))) { - ret =rxe_invalidate_mw (mw,1 ); + ret =rxe_invalidate_mw (qp, mw);rxe_drop_ref (mw); }else {pr_err ("send invalidate failed for rkey = 0x%x\n" , rkey);
@@ -883,9 +881,9 @@ static enum resp_states do_complete(struct rxe_qp *qp, }if (pkt->mask &RXE_IETH_MASK ) { - ret =send_invalidate (rxe, rkey); + ret =send_invalidate (qp, rxe, rkey);if (ret) { -pr_err ("do_complete: send invalidate failed\n" ); +pr_err ("send with invalidate failed\n" );// TODO } }
drivers/infiniband/sw/rxe/rxe_verbs.c +4 -21
@@ -172,8 +172,6 @@ static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)struct rxe_dev *rxe =to_rdev (ibpd->device);struct rxe_pd *pd =to_rpd (ibpd); -pr_info ("rxe_alloc_pd: called\n" ); -return rxe_add_to_pool (&rxe->pd_pool, &pd->pelem); }
@@ -181,8 +179,6 @@ static void rxe_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) {struct rxe_pd *pd =to_rpd (ibpd); -pr_info ("rxe_dealloc_pd: called\n" ); -rxe_drop_ref (pd); }
@@ -414,8 +410,6 @@ static struct ib_qp *rxe_create_qp(struct ib_pd *ibpd,struct rxe_qp *qp;struct rxe_create_qp_resp __user *uresp =NULL ; -pr_info ("rxe_create_qp: called\n" ); -if (udata) {if (udata->outlen <sizeof (*uresp))return ERR_PTR (-EINVAL );
@@ -463,8 +457,6 @@ static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,struct rxe_dev *rxe =to_rdev (ibqp->device);struct rxe_qp *qp =to_rqp (ibqp); -pr_info ("rxe_modify_qp: called\n" ); - err =rxe_qp_chk_attr (rxe, qp, attr, mask);if (err) goto err1;
@@ -484,8 +476,6 @@ static int rxe_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, {struct rxe_qp *qp =to_rqp (ibqp); -pr_info ("rxe_query_qp: called\n" ); -rxe_qp_to_init (qp, init);rxe_qp_to_attr (qp, attr, mask);
@@ -496,8 +486,6 @@ static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) {struct rxe_qp *qp =to_rqp (ibqp); -pr_info ("rxe_destroy_qp: called\n" ); -rxe_qp_destroy (qp);rxe_drop_index (qp);rxe_drop_ref (qp);
@@ -794,8 +782,6 @@ static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,struct rxe_cq *cq =to_rcq (ibcq);struct rxe_create_cq_resp __user *uresp =NULL ; -pr_info ("rxe_create_cq: called\n" ); -if (udata) {if (udata->outlen <sizeof (*uresp))return -EINVAL ;
@@ -821,8 +807,6 @@ static void rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) {struct rxe_cq *cq =to_rcq (ibcq); -pr_info ("rxe_destroy_cq: called\n" ); -rxe_cq_disable (cq);rxe_drop_ref (cq);
@@ -862,8 +846,6 @@ static int rxe_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)struct rxe_cqe *cqe;unsigned long flags; -pr_info ("rxe_poll_cq: called\n" ); -spin_lock_irqsave (&cq->cq_lock, flags);for (i =0 ; i < num_entries; i++) { cqe =queue_head (cq->queue);
@@ -934,8 +916,6 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,struct rxe_pd *pd =to_rpd (ibpd);struct rxe_reg_mr_resp __user *uresp =NULL ; -pr_info ("rxe_reg_user_mr: called\n" ); -if (udata) {if (udata->outlen <sizeof (*uresp)) { err = -EINVAL ;
@@ -980,7 +960,10 @@ static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) {struct rxe_mr *mr =to_rmr (ibmr); -pr_info ("rxe_dereg_user_mr: called\n" ); +if (atomic_read (&mr->num_mw)) { +pr_err ("attempt to dereg MR with bound MWs\n" ); +return -EBUSY ; + } mr->state =RXE_MEM_STATE_ZOMBIE ;rxe_drop_ref (mr->pd);
drivers/infiniband/sw/rxe/rxe_verbs.h +8 -1
@@ -344,6 +344,8 @@ struct rxe_mr {u32 max_buf;u32 num_map; +atomic_t num_mw; +struct rxe_map **map; };
@@ -353,11 +355,16 @@ enum rxe_mw_state { RXE_MW_STATE_VALID, }; +enum rxe_send_flags { +/* flag indicaes bind call came through verbs API */ +RXE_BIND_MW = (1 <<0 ), +}; +struct rxe_mw {struct rxe_pool_entry pelem;struct ib_mw ibmw; +struct rxe_mr *mr;struct rxe_qp *qp;/* type 2B only */ -struct rxe_mem *mr;spinlock_t lock;enum rxe_mw_state state;u32 access;
include/uapi/rdma/rdma_user_rxe.h +2 -0
@@ -102,6 +102,7 @@ struct rxe_send_wr {__u32 pad2;__u32 rkey;__u32 access; +__u32 flags; } umw;/* below are only used by the kernel */ struct {
@@ -117,6 +118,7 @@ struct rxe_send_wr { };__u32 rkey;__u32 access; +__u32 flags; } kmw; struct { union {
Signature · 1 line
2.25.1
PATCH 18/20 cleanup
In reply to Bob PearsonThis patch culls some left over comments and made things a little neater.
--- drivers/infiniband/sw/rxe/rxe_comp.c | 10 +-- drivers/infiniband/sw/rxe/rxe_loc.h | 37 +++------ drivers/infiniband/sw/rxe/rxe_mr.c | 106 ++++++++++++------------ drivers/infiniband/sw/rxe/rxe_mw.c | 115 +++++++++++++++++++------- drivers/infiniband/sw/rxe/rxe_req.c | 33 +++----- drivers/infiniband/sw/rxe/rxe_resp.c | 57 ++++++++----- drivers/infiniband/sw/rxe/rxe_verbs.h | 17 ++-- 7 files changed, 208 insertions(+), 167 deletions(-)
drivers/infiniband/sw/rxe/rxe_comp.c +3 -7
@@ -790,23 +790,19 @@ int rxe_completer(void *arg) } } -/* these are the same. need to merge them TODO */ exit:/* we come here if we are done with processing and want the task to -* exit from the loop calling us -- to call us again later -*/ +* exit from the loop calling us */ WARN_ON_ONCE (skb);atomic_dec (&qp->comp.task.entered);rxe_drop_ref (qp);return -EAGAIN ; done: -/* we come here if we have processed a packet we want the task to call -* us again to see if there is anything else to do -*/ +/* we come here if we have processed a packet and we want +* to be called again to see if there is anything else to do */ WARN_ON_ONCE (skb);atomic_dec (&qp->comp.task.entered);rxe_drop_ref (qp);return 0 ; - }
drivers/infiniband/sw/rxe/rxe_loc.h +10 -27
@@ -99,45 +99,26 @@ int rxe_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);/* rxe_mr.c */ void rxe_set_mr_lkey (struct rxe_mr *mr); -enum copy_direction { to_mr_obj, from_mr_obj, }; - -void rxe_mr_init_dma (struct rxe_pd *pd, -int access,struct rxe_mr *mr); - -int rxe_mr_init_user (struct rxe_pd *pd,u64 start, -u64 length,u64 iova,int access,struct ib_udata *udata, -struct rxe_mr *mr); - -int rxe_mr_init_fast (struct rxe_pd *pd, -int max_pages,struct rxe_mr *mr); - +void rxe_mr_init_dma (struct rxe_pd *pd,int access,struct rxe_mr *mr); +int rxe_mr_init_user (struct rxe_pd *pd,u64 start,u64 length, +u64 iova,int access,struct ib_udata *udata, +struct rxe_mr *mr); +int rxe_mr_init_fast (struct rxe_pd *pd,int max_pages,struct rxe_mr *mr);int rxe_mr_copy (struct rxe_mr *mr,u64 iova,void *addr, -int length,enum copy_direction dir,u32 *crcp); - +int length,enum copy_direction dir,u32 *crcp);int copy_data (struct rxe_pd *pd,int access,struct rxe_dma_info *dma,void *addr,int length,enum copy_direction dir,u32 *crcp); -void *iova_to_vaddr (struct rxe_mr *mr,u64 iova,int length); - -enum lookup_type { - lookup_local, - lookup_remote, -}; - -struct rxe_mr *lookup_mr (struct rxe_pd *pd,int access,u32 key, -enum lookup_type type); - -int mr_check_range (struct rxe_mr *mr,u64 iova,size_t length); -void rxe_mr_cleanup (struct rxe_pool_entry *arg); -int advance_dma_data (struct rxe_dma_info *dma,unsigned int length);int rxe_invalidate_mr (struct rxe_qp *qp,struct rxe_mr *mr); +int rxe_mr_check_access (struct rxe_qp *qp,struct rxe_mr *mr, +int access,u64 va,u32 resid);/* rxe_mw.c */ void rxe_set_mw_rkey (struct rxe_mw *mw);
@@ -147,6 +128,8 @@ int rxe_dealloc_mw(struct ib_mw *ibmw);int rxe_bind_mw (struct rxe_qp *qp,struct rxe_send_wqe *wqe);void rxe_mw_cleanup (struct rxe_pool_entry *arg);int rxe_invalidate_mw (struct rxe_qp *qp,struct rxe_mw *mw); +int rxe_mw_check_access (struct rxe_qp *qp,struct rxe_mw *mw, +int access,u64 va,u32 resid);/* rxe_net.c */ void rxe_loopback (struct sk_buff *skb);
drivers/infiniband/sw/rxe/rxe_mr.c +54 -52
148 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_mw.c +85 -30
212 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_req.c +13 -20
@@ -591,7 +591,7 @@ static int local_invalidate(struct rxe_qp *qp, struct rxe_send_wqe *wqe)struct rxe_dev *rxe =to_rdev (qp->ibqp.device);u32 key = wqe->wr.ex.invalidate_rkey; -if ((mr =rxe_pool_get_key (&rxe->mr_pool, &key))) { +if (!(key &IS_MW ) && (mr =rxe_pool_get_key (&rxe->mr_pool, &key))) { ret =rxe_invalidate_mr (qp, mr);rxe_drop_ref (mr); }else if ((mw =rxe_pool_get_key (&rxe->mw_pool, &key))) {
@@ -732,12 +732,7 @@ int rxe_requester(void *arg) payload = (mask &RXE_WRITE_OR_SEND ) ? wqe->dma.resid :0 ;if (payload > mtu) {if (qp_type (qp) ==IB_QPT_UD ) { -/* C10-93.1.1: If the total sum of all the buffer lengths specified for a -* UD message exceeds the MTU of the port as returned by QueryHCA, the CI -* shall not emit any packets for this message. Further, the CI shall not -* generate an error due to this condition. -*/ - +/* C10-93.1.1 */ /* fake a successful UD send */ wqe->first_psn = qp->req.psn; wqe->last_psn = qp->req.psn;
@@ -747,8 +742,13 @@ int rxe_requester(void *arg) qp->req.wqe_index); wqe->state = wqe_state_done; wqe->status =IB_WC_SUCCESS ; -// TODO why?? why not just treat the same as a -// successful wqe and go to next wqe? + +/* TODO why?? why not just treat the same as a +* successful wqe and go to next wqe? +* __rxe_do_task probably shouldn't be used +* it reenters the completion task which may +* already be running +*/ __rxe_do_task (&qp->comp.task); goto again; }
@@ -789,7 +789,7 @@ int rxe_requester(void *arg) goto exit; } - wqe->status =IB_WC_LOC_PROT_ERR ;// ?? FIXME + wqe->status =IB_WC_LOC_PROT_ERR ; goto err; }
@@ -797,17 +797,12 @@ int rxe_requester(void *arg) goto next_wqe; -// TODO this can be cleaned up err:/* we come here if an error occured while processing * a send wqe. The completer will put the qp in error * state and no more wqes will be processed unless -* the qp is cleaned up and restarted. We do not want -* to be called again */ +* the qp is cleaned up and restarted. */ wqe->state = wqe_state_error; -// ?? we want to force the qp into error state before -// anyone else has a chance to process another wqe but -// this could collide with an already running completer __rxe_do_task (&qp->comp.task); ret = -EAGAIN ; goto done;
@@ -816,14 +811,12 @@ int rxe_requester(void *arg)/* we come here if either there are no more wqes in the send * queue or we are blocked waiting for some resource or event. * The current wqe will be restarted or new wqe started when -* there is work to do. */ +* there is something to do. */ ret = -EAGAIN ; goto done; again: -/* we come here if we are done with the current wqe but want to -* get called again. Mostly we loop back to next wqe so should -* be all one way or the other */ +/* we come here if we need to exit and reenter the task */ ret =0 ; goto done;
drivers/infiniband/sw/rxe/rxe_resp.c +35 -22
104 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_verbs.h +8 -9
@@ -210,6 +210,7 @@ struct rxe_resp_info {/* RDMA read / atomic only */ u64 va; +u64 offset;struct rxe_mr *mr;u32 resid;u32 rkey;
@@ -289,7 +290,8 @@ struct rxe_qp {struct execute_work cleanup_work; }; -enum rxe_mr_state { +/* common state for rxe_mr and rxe_mw */ +enum rxe_mem_state {RXE_MEM_STATE_ZOMBIE ,RXE_MEM_STATE_INVALID ,RXE_MEM_STATE_FREE ,
@@ -325,7 +327,7 @@ struct rxe_mr {u32 lkey;u32 rkey; -enum rxe_mr_state state; +enum rxe_mem_state state;enum rxe_mr_type type;u64 va;u64 iova;
@@ -349,24 +351,21 @@ struct rxe_mr {struct rxe_map **map; }; -enum rxe_mw_state { -RXE_MW_STATE_INVALID , -RXE_MW_STATE_FREE , -RXE_MW_STATE_VALID , -}; -enum rxe_send_flags {/* flag indicaes bind call came through verbs API */ RXE_BIND_MW = (1 <<0 ), }; +/* use high order bit to separate MW and MR rkeys */ +#define IS_MW (1 << 31) +struct rxe_mw {struct rxe_pool_entry pelem;struct ib_mw ibmw;struct rxe_mr *mr;struct rxe_qp *qp;/* type 2B only */ spinlock_t lock; -enum rxe_mw_state state; +enum rxe_mem_state state;u32 access;u64 addr;u64 length;
Signature · 1 line
2.25.1
PATCH 19/20 fixed white space issues
In reply to Bob PearsonCheckpatch reported some trailing whitespace. Trying to fix that here.
--- drivers/infiniband/sw/rxe/rxe_mw.c | 4 ++-- drivers/infiniband/sw/rxe/rxe_verbs.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/infiniband/sw/rxe/rxe_mw.c +2 -2
@@ -370,7 +370,7 @@ static void do_invalidate_mw(struct rxe_mw *mw) mw->mr =NULL ; mw->access =0 ; - mw->addr =0 ; + mw->addr =0 ; mw->length =0 ; mw->state =RXE_MEM_STATE_FREE ; }
@@ -405,7 +405,7 @@ static void do_dealloc_mw(struct rxe_mw *mw) mw->ibmw.pd =NULL ; mw->access =0 ; - mw->addr =0 ; + mw->addr =0 ; mw->length =0 ; mw->state =RXE_MEM_STATE_INVALID ; }
drivers/infiniband/sw/rxe/rxe_verbs.h +3 -3
@@ -66,7 +66,7 @@ struct rxe_ucontext { };struct rxe_pd { -struct ib_pd ibpd; +struct ib_pd ibpd;struct rxe_pool_entry pelem; };
@@ -309,8 +309,8 @@ enum rxe_mr_type {#define RXE_BUF_PER_MAP (PAGE_SIZE / sizeof(struct rxe_phys_buf))struct rxe_phys_buf { -u64 addr; -u64 size; +u64 addr; +u64 size; };struct rxe_map {
Signature · 1 line
2.25.1
PATCH 20/20 fixed checkpatch issues for all files in rxe
In reply to Bob PearsonWent through all the files in the rxe dirextory and fixed all issues reported by checkpatch. Removed remaining debugging code. Added SPDX headers.
--- drivers/infiniband/sw/rxe/rxe.c | 31 +--- drivers/infiniband/sw/rxe/rxe.h | 31 +--- drivers/infiniband/sw/rxe/rxe_av.c | 31 +--- drivers/infiniband/sw/rxe/rxe_comp.c | 54 ++---- drivers/infiniband/sw/rxe/rxe_cq.c | 31 +--- drivers/infiniband/sw/rxe/rxe_hdr.h | 67 +++----- drivers/infiniband/sw/rxe/rxe_hw_counters.c | 61 ++----- drivers/infiniband/sw/rxe/rxe_hw_counters.h | 31 +--- drivers/infiniband/sw/rxe/rxe_icrc.c | 31 +--- drivers/infiniband/sw/rxe/rxe_loc.h | 38 +---- drivers/infiniband/sw/rxe/rxe_mcast.c | 31 +--- drivers/infiniband/sw/rxe/rxe_mmap.c | 31 +--- drivers/infiniband/sw/rxe/rxe_mr.c | 59 ++----- drivers/infiniband/sw/rxe/rxe_mw.c | 176 ++++++++------------ drivers/infiniband/sw/rxe/rxe_net.c | 37 +--- drivers/infiniband/sw/rxe/rxe_net.h | 31 +--- drivers/infiniband/sw/rxe/rxe_opcode.c | 33 +--- drivers/infiniband/sw/rxe/rxe_opcode.h | 31 +--- drivers/infiniband/sw/rxe/rxe_param.h | 31 +--- drivers/infiniband/sw/rxe/rxe_pool.c | 43 +---- drivers/infiniband/sw/rxe/rxe_pool.h | 31 +--- drivers/infiniband/sw/rxe/rxe_qp.c | 53 ++---- drivers/infiniband/sw/rxe/rxe_queue.c | 31 +--- drivers/infiniband/sw/rxe/rxe_queue.h | 31 +--- drivers/infiniband/sw/rxe/rxe_recv.c | 31 +--- drivers/infiniband/sw/rxe/rxe_req.c | 122 ++++++-------- drivers/infiniband/sw/rxe/rxe_resp.c | 170 +++++++++---------- drivers/infiniband/sw/rxe/rxe_srq.c | 31 +--- drivers/infiniband/sw/rxe/rxe_sysfs.c | 34 +--- drivers/infiniband/sw/rxe/rxe_task.c | 31 +--- drivers/infiniband/sw/rxe/rxe_task.h | 33 +--- drivers/infiniband/sw/rxe/rxe_verbs.c | 51 ++---- drivers/infiniband/sw/rxe/rxe_verbs.h | 34 +--- 33 files changed, 384 insertions(+), 1208 deletions(-)
drivers/infiniband/sw/rxe/rxe.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <rdma/rdma_netlink.h>
drivers/infiniband/sw/rxe/rxe.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_H
drivers/infiniband/sw/rxe/rxe_av.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_av.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include "rxe.h"
drivers/infiniband/sw/rxe/rxe_comp.c +10 -44
91 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_cq.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_cq.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/vmalloc.h> #include "rxe.h"
drivers/infiniband/sw/rxe/rxe_hdr.h +21 -46
136 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_hw_counters.c +18 -43
72 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_hw_counters.h +3 -28
@@ -1,33 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* -* Copyright (c) 2017 Mellanox Technologies Ltd. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: +* drivers/infiniband/sw/rxe/rxe_hw_counters.h * -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. +* Copyright (c) 2017 Mellanox Technologies Ltd. All rights reserved. */ #ifndef RXE_HW_COUNTERS_H
drivers/infiniband/sw/rxe/rxe_icrc.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_icrc.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include "rxe.h"
drivers/infiniband/sw/rxe/rxe_loc.h +7 -31
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_loc.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_LOC_H
@@ -145,8 +120,8 @@ int rxe_mcast_delete(struct rxe_dev *rxe, union ib_gid *mgid);/* rxe_qp.c */ int rxe_qp_chk_init (struct rxe_dev *rxe,struct ib_qp_init_attr *init); -int rxe_qp_from_init (struct rxe_dev *rxe,struct rxe_qp *qp,struct rxe_pd *pd, -struct ib_qp_init_attr *init, +int rxe_qp_from_init (struct rxe_dev *rxe,struct rxe_qp *qp, +struct rxe_pd *pd,struct ib_qp_init_attr *init,struct rxe_create_qp_resp __user *uresp,struct ib_pd *ibpd,struct ib_udata *udata);
@@ -219,7 +194,8 @@ int rxe_srq_from_init(struct rxe_dev *rxe, struct rxe_srq *srq,int rxe_srq_from_attr (struct rxe_dev *rxe,struct rxe_srq *srq,struct ib_srq_attr *attr,enum ib_srq_attr_mask mask, -struct rxe_modify_srq_cmd *ucmd,struct ib_udata *udata); +struct rxe_modify_srq_cmd *ucmd, +struct ib_udata *udata);void rxe_dealloc (struct ib_device *ib_dev);
drivers/infiniband/sw/rxe/rxe_mcast.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_mcast.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include "rxe.h"
drivers/infiniband/sw/rxe/rxe_mmap.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_mmap.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/module.h>
drivers/infiniband/sw/rxe/rxe_mr.c +16 -43
112 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_mw.c +69 -107
382 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_net.c +6 -31
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_net.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/skbuff.h>
@@ -120,7 +95,7 @@ static struct dst_entry *rxe_find_route6(struct net_device *ndev, ndst = ipv6_stub->ipv6_dst_lookup_flow (sock_net (recv_sockets.sk6->sk), recv_sockets.sk6->sk, &fl6,NULL ); -if (unlikely (IS_ERR (ndst))) { +if (IS_ERR (ndst)) {pr_err_ratelimited ("no route to %pI6\n" , daddr);return NULL ; }
@@ -333,8 +308,8 @@ static void prepare_ipv6_hdr(struct dst_entry *dst, struct sk_buff *skb, ip6h =ipv6_hdr (skb);ip6_flow_hdr (ip6h, prio,htonl (0 )); ip6h->payload_len =htons (skb->len); - ip6h->nexthdr = proto; - ip6h->hop_limit = ttl; + ip6h->nexthdr = proto; + ip6h->hop_limit = ttl; ip6h->daddr = *daddr; ip6h->saddr = *saddr; ip6h->payload_len =htons (skb->len -sizeof (*ip6h));
drivers/infiniband/sw/rxe/rxe_net.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_net.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_NET_H
drivers/infiniband/sw/rxe/rxe_opcode.c +4 -29
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_opcode.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <rdma/ib_pack.h>
@@ -397,7 +372,7 @@ struct rxe_opcode_info rxe_opcode[RXE_NUM_OPCODE] = { .name = "IB_OPCODE_RC_SEND_ONLY_INV", .mask =RXE_IETH_MASK |RXE_PAYLOAD_MASK |RXE_REQ_MASK |RXE_COMP_MASK |RXE_RWR_MASK |RXE_SEND_MASK - | RXE_END_MASK | RXE_START_MASK, + | RXE_END_MASK | RXE_START_MASK, .length = RXE_BTH_BYTES + RXE_IETH_BYTES, .offset = { [RXE_BTH] = 0,
drivers/infiniband/sw/rxe/rxe_opcode.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_opcode.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_OPCODE_H
drivers/infiniband/sw/rxe/rxe_param.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_param.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_PARAM_H
drivers/infiniband/sw/rxe/rxe_pool.c +7 -36
75 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_pool.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_pool.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_POOL_H
drivers/infiniband/sw/rxe/rxe_qp.c +17 -36
102 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_queue.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_queue.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must retailuce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/vmalloc.h>
drivers/infiniband/sw/rxe/rxe_queue.h +3 -28
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_queue.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_QUEUE_H
drivers/infiniband/sw/rxe/rxe_recv.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_recv.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/skbuff.h>
drivers/infiniband/sw/rxe/rxe_req.c +50 -72
231 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_resp.c +79 -91
259 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_srq.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_srq.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/vmalloc.h>
drivers/infiniband/sw/rxe/rxe_sysfs.c +5 -29
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_sysfs.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include "rxe.h"
@@ -92,7 +67,8 @@ static int rxe_param_set_add(const char *val, const struct kernel_param *kp)return err; } -static int rxe_param_set_remove (const char *val,const struct kernel_param *kp) +static int rxe_param_set_remove (const char *val, +const struct kernel_param *kp) {int len;char intf[32 ];
drivers/infiniband/sw/rxe/rxe_task.c +3 -28
@@ -1,34 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* +* drivers/infiniband/sw/rxe/rxe_task.c +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #include <linux/kernel.h>
drivers/infiniband/sw/rxe/rxe_task.h +3 -30
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_task.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_TASK_H
@@ -55,8 +30,6 @@ struct rxe_task {int ret;char name[16 ];bool destroyed; -// debug code, delete me when done -atomic_t entered; };/*
drivers/infiniband/sw/rxe/rxe_verbs.c +16 -35
93 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_verbs.h +5 -29
@@ -1,34 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* +* drivers/infiniband/sw/rxe/rxe_verbs.h +* * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. -* -* This software is available to you under a choice of one of two -* licenses. You may choose to be licensed under the terms of the GNU -* General Public License (GPL) Version 2, available from the file -* COPYING in the main directory of this source tree, or the -* OpenIB.org BSD license below: -* -* Redistribution and use in source and binary forms, with or -* without modification, are permitted provided that the following -* conditions are met: -* -* - Redistributions of source code must retain the above -* copyright notice, this list of conditions and the following -* disclaimer. -* -* - Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following -* disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. */ #ifndef RXE_VERBS_H
@@ -436,7 +411,8 @@ struct rxe_dev {struct crypto_shash *tfm; }; -static inline void rxe_counter_inc (struct rxe_dev *rxe,enum rxe_counters index) +static inline void rxe_counter_inc (struct rxe_dev *rxe, +enum rxe_counters index) {atomic64_inc (&rxe->stats_counters[index]); }
Signature · 1 line
2.25.1
kernel test robot
build botRe: [PATCH 20/20] fixed checkpatch issues for all files in rxe
Thank you for the patch! Yet something to improve:
Hi Bob,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on rdma/for-next]
[also build test ERROR on next-20200814]
[cannot apply to v5.8]
[If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Bob-Pearson/Added-ib_uverbs_wc_opcode-to-ib_user_verbs-h/20200816-090418 base: https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git for-next config: xtensa-allyesconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
In file included from include/linux/kernel.h:11,
from include/linux/list.h:9,
from include/linux/module.h:12,
from drivers/infiniband/sw/rxe/rxe.h:17,
from drivers/infiniband/sw/rxe/rxe_mw.c:10:
include/linux/scatterlist.h: In function 'sg_set_buf':
arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
193 | ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
| ^~
include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
include/linux/scatterlist.h:143:2: note: in expansion of macro 'BUG_ON'
143 | BUG_ON(!virt_addr_valid(buf));
| ^~~~~~
arch/xtensa/include/asm/page.h:201:32: note: in expansion of macro 'pfn_valid'
201 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
| ^~~~~~~~~
include/linux/scatterlist.h:143:10: note: in expansion of macro 'virt_addr_valid'
143 | BUG_ON(!virt_addr_valid(buf));
| ^~~~~~~~~~~~~~~
In file included from ./arch/xtensa/include/generated/asm/bug.h:1,
from include/linux/bug.h:5,
from include/linux/thread_info.h:12,
from include/asm-generic/preempt.h:5,
from ./arch/xtensa/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:51,
from include/linux/seqlock.h:36,
from include/linux/time.h:6,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/infiniband/sw/rxe/rxe.h:17,
from drivers/infiniband/sw/rxe/rxe_mw.c:10:
include/linux/dma-mapping.h: In function 'dma_map_resource':
arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
193 | ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
| ^~
include/asm-generic/bug.h:144:27: note: in definition of macro 'WARN_ON_ONCE'
144 | int __ret_warn_once = !!(condition); \
| ^~~~~~~~~
include/linux/dma-mapping.h:352:19: note: in expansion of macro 'pfn_valid'
352 | if (WARN_ON_ONCE(pfn_valid(PHYS_PFN(phys_addr))))
| ^~~~~~~~~
drivers/infiniband/sw/rxe/rxe_mw.c: In function 'do_bind_mw':
>> drivers/infiniband/sw/rxe/rxe_mw.c:227:17: error: implicit declaration of function 'rxe_get_key'; did you mean 'rxe_get_av'? [-Werror=implicit-function-declaration]
227 | duplicate_mw = rxe_get_key(rxe, &new_key);
| ^~~~~~~~~~~
| rxe_get_av
>> drivers/infiniband/sw/rxe/rxe_mw.c:227:35: error: 'new_key' undeclared (first use in this function); did you mean 'new_rkey'?
227 | duplicate_mw = rxe_get_key(rxe, &new_key);
| ^~~~~~~
| new_rkey
drivers/infiniband/sw/rxe/rxe_mw.c:227:35: note: each undeclared identifier is reported only once for each function it appears in
drivers/infiniband/sw/rxe/rxe_mw.c:211:6: warning: unused variable 'ret' [-Wunused-variable]
211 | int ret;
| ^~~cc1: some warnings being treated as errors
vim +227 drivers/infiniband/sw/rxe/rxe_mw.c
207
208 static int do_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
209 struct rxe_mw *mw, struct rxe_mr *mr)
210 {
211 int ret;
212 u32 rkey;
213 u32 new_rkey;
214 struct rxe_mw *duplicate_mw;
215 struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
216
217 /*
218 * key part of new rkey is provided by user for type 2
219 * and ibv_bind_mw() for type 1 MWs
220 * there is a very rare chance that the new rkey will
221 * collide with an existing MW. Return an error if this
222 * occurs
223 */
224 rkey = mw->ibmw.rkey;
225 new_rkey = (rkey & 0xffffff00) | (wqe->wr.wr.umw.rkey & 0x000000ff);
226
> 227 duplicate_mw = rxe_get_key(rxe, &new_key);
228 if (duplicate_mw) {
229 pr_err_once("new MW key is a duplicate, try another\n");
230 rxe_drop_ref(duplicate_mw);
231 return -EINVAL;
232 }
233
234 rxe_drop_key(mw);
235 rxe_add_key(mw, &new_rkey);
236
237 mw->access = wqe->wr.wr.umw.access;
238 mw->state = RXE_MEM_STATE_VALID;
239 mw->addr = wqe->wr.wr.umw.addr;
240 mw->length = wqe->wr.wr.umw.length;
241
242 if (mw->mr) {
243 rxe_drop_ref(mw->mr);
244 atomic_dec(&mw->mr->num_mw);
245 mw->mr = NULL;
246 }
247
248 if (mw->length) {
249 mw->mr = mr;
250 atomic_inc(&mr->num_mw);
251 rxe_add_ref(mr);
252 }
253
254 if (mw->ibmw.type == IB_MW_TYPE_2)
255 mw->qp = qp;
256
257 return 0;
258 }
259
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org