Hi Benoit, since a user process should never crash the kernel there is something wrong in softiwarp. Can you please send me the stack trace from the crash in privae email to work that out. I'll come back to the list with a fix.
Thanks, Bernard. [email protected] wrote on 06/30/2011 04:19:01 PM: > Hi, > > We are working to create a RDMA client within the kernel which will > connect to a working RDMA userspace server. > We are using the userspace code for testing purpose , in the final > version all the communication will be done within the kernel space. > > We rely on softiwarp so far for dev purpose. > > We have achieved a connection but are now having trouble prior to the > communication stage. > > We are trying to register a user space created buffer using the > device->reg_user_mr . However the kernel crash and the crash dump > shows a page fault after siw_reg_user_mr. > > > What we would like to know: > > If this is the correct approach to register memory for RDMA > communication ? If yes what are we doing wrong ? > Is there a possibility to use kernel allocated memory rather than > using userspace created and then passing the address back to the > kernel through IOCTL ? ( if yes if there is any code example floating > around?) > basically the question boils down to how to allcoate and registr > buffer for RDMA communication from inside a kernel module? > > > This is the code. > > ###################################################################################### > > > struct rdma_cm_id *id = rdma_create_id(my_rdma_cm_event_handler > event_handler, NULL, RDMA_PS_TCP, IB_QPT_RC); > struct ib_pd *pd = ib_alloc_pd(id->device); > struct ib_cq *cq = ib_create_cq(id->device, NULL, NULL, NULL, 2, 0); > > // Userspace buffer addresses passed via IOCTl > unsigned long user_buffer_send; > unsigned long user_buffer_recv; > > > int my_rdma_cm_event_handler event_handler(struct rdma_cm_id *id, > struct rdma_cm_event *event) > { > > switch (event) > { > case RDMA_CM_EVENT_ADDR_RESOLVED: > > rdma_resolve_route(id, 2000); > > break; > > case RDMA_CM_EVENT_ROUTE_RESOLVED: > { > > struct ib_qp_init_attr attr; > > memset(&attr, 0, sizeof attr); > > attr.send_cq = cq; > attr.recv_cq = cq; > attr.sq_sig_type = IB_SIGNAL_ALL_WR; > attr.cap.max_send_wr = 2; > attr.cap.max_recv_wr = 2; > attr.cap.max_send_sge = 1; > attr.cap.max_recv_sge = 1; > attr.qp_type = IB_QPT_RC; > attr.port_num = id->port_num; > attr.event_handler = my_qp_event_handler; > > rdma_create_qp(id, pd, &attr) > > rdma_connect(id, &conn_param); > > break; > } > case RDMA_CM_EVENT_ESTABLISHED: > { > > struct ib_mr *send_mr = id->device->reg_user_mr(pd, (u64) > user_buffer_send, sizeof *user_buffer_send, NULL, > IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_READ | > IB_ACCESS_REMOTE_WRITE, NULL); > > struct ib_mr *recv_mr = id->device->reg_user_mr(pd, (u64) > user_buffer_recv, sizeof *user_buffer_recv, NULL, > IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_READ | > IB_ACCESS_REMOTE_WRITE, NULL); > > break; > } > > } > > ... > } > > ###################################################################################### > > -- > " The production of too many useful things results in too many useless people" > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to [email protected] > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
