Message ID | 20200427141020.655-14-danil.kipnis@cloud.ionos.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | RTRS (former IBTRS) RDMA Transport Library and RNBD (former IBNBD) RDMA Network Block Device | expand |
Hi Danil, I love your patch! Perhaps something to improve: [auto build test WARNING on block/for-next] [also build test WARNING on driver-core/driver-core-testing rdma/for-next linus/master v5.7-rc3 next-20200428] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Danil-Kipnis/RTRS-former-IBTRS-RDMA-Transport-Library-and-RNBD-former-IBNBD-RDMA-Network-Block-Device/20200428-080733 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next If you fix the issue, kindly add following tag as appropriate Reported-by: kbuild test robot <lkp@intel.com> cppcheck warnings: (new ones prefixed by >>) >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:508:29: warning: Either the condition '!id' is redundant or there is possible null pointer dereference: id. [nullPointerRedundantCheck] struct rtrs_srv_con *con = id->con; ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:513:14: note: Assuming that condition '!id' is not redundant if (WARN_ON(!id)) ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:508:29: note: Null pointer dereference struct rtrs_srv_con *con = id->con; ^ >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:1448:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] fallthrough; ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:1454:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] fallthrough; ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:1460:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] fallthrough; ^ >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:309:17: warning: Local variable 'list' shadows outer variable [shadowVariable] struct ib_sge list; ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:240:17: note: Shadowed declaration struct ib_sge *list; ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:309:17: note: Shadow variable struct ib_sge list; ^ >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:296:65: warning: Clarify calculation precedence for '%' and '?'. [clarifyCalculation] flags = atomic_inc_return(&id->con->wr_cnt) % srv->queue_depth ? ^ drivers/infiniband/ulp/rtrs/rtrs-srv.c:420:61: warning: Clarify calculation precedence for '%' and '?'. [clarifyCalculation] flags = atomic_inc_return(&con->wr_cnt) % srv->queue_depth ? ^ >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:620:29: warning: Variable 'rsp' is not assigned a value. [unassignedVariable] struct rtrs_msg_rkey_rsp *rsp; ^ vim +508 drivers/infiniband/ulp/rtrs/rtrs-srv.c 34a928cf49a7ef Jack Wang 2020-04-27 224 34a928cf49a7ef Jack Wang 2020-04-27 225 static int rdma_write_sg(struct rtrs_srv_op *id) 34a928cf49a7ef Jack Wang 2020-04-27 226 { 34a928cf49a7ef Jack Wang 2020-04-27 227 struct rtrs_sess *s = id->con->c.sess; 34a928cf49a7ef Jack Wang 2020-04-27 228 struct rtrs_srv_sess *sess = to_srv_sess(s); 34a928cf49a7ef Jack Wang 2020-04-27 229 dma_addr_t dma_addr = sess->dma_addr[id->msg_id]; 34a928cf49a7ef Jack Wang 2020-04-27 230 struct rtrs_srv_mr *srv_mr; 34a928cf49a7ef Jack Wang 2020-04-27 231 struct rtrs_srv *srv = sess->srv; 34a928cf49a7ef Jack Wang 2020-04-27 232 struct ib_send_wr inv_wr, imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 233 struct ib_rdma_wr *wr = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 234 enum ib_send_flags flags; 34a928cf49a7ef Jack Wang 2020-04-27 235 size_t sg_cnt; 34a928cf49a7ef Jack Wang 2020-04-27 236 int err, offset; 34a928cf49a7ef Jack Wang 2020-04-27 237 bool need_inval; 34a928cf49a7ef Jack Wang 2020-04-27 238 u32 rkey = 0; 34a928cf49a7ef Jack Wang 2020-04-27 239 struct ib_reg_wr rwr; 34a928cf49a7ef Jack Wang 2020-04-27 240 struct ib_sge *list; 34a928cf49a7ef Jack Wang 2020-04-27 241 34a928cf49a7ef Jack Wang 2020-04-27 242 sg_cnt = le16_to_cpu(id->rd_msg->sg_cnt); 34a928cf49a7ef Jack Wang 2020-04-27 243 need_inval = le16_to_cpu(id->rd_msg->flags) & RTRS_MSG_NEED_INVAL_F; 34a928cf49a7ef Jack Wang 2020-04-27 244 if (unlikely(sg_cnt != 1)) 34a928cf49a7ef Jack Wang 2020-04-27 245 return -EINVAL; 34a928cf49a7ef Jack Wang 2020-04-27 246 34a928cf49a7ef Jack Wang 2020-04-27 247 offset = 0; 34a928cf49a7ef Jack Wang 2020-04-27 248 34a928cf49a7ef Jack Wang 2020-04-27 249 wr = &id->tx_wr; 34a928cf49a7ef Jack Wang 2020-04-27 250 list = &id->tx_sg; 34a928cf49a7ef Jack Wang 2020-04-27 251 list->addr = dma_addr + offset; 34a928cf49a7ef Jack Wang 2020-04-27 252 list->length = le32_to_cpu(id->rd_msg->desc[0].len); 34a928cf49a7ef Jack Wang 2020-04-27 253 34a928cf49a7ef Jack Wang 2020-04-27 254 /* WR will fail with length error 34a928cf49a7ef Jack Wang 2020-04-27 255 * if this is 0 34a928cf49a7ef Jack Wang 2020-04-27 256 */ 34a928cf49a7ef Jack Wang 2020-04-27 257 if (unlikely(list->length == 0)) { 34a928cf49a7ef Jack Wang 2020-04-27 258 rtrs_err(s, "Invalid RDMA-Write sg list length 0\n"); 34a928cf49a7ef Jack Wang 2020-04-27 259 return -EINVAL; 34a928cf49a7ef Jack Wang 2020-04-27 260 } 34a928cf49a7ef Jack Wang 2020-04-27 261 34a928cf49a7ef Jack Wang 2020-04-27 262 list->lkey = sess->s.dev->ib_pd->local_dma_lkey; 34a928cf49a7ef Jack Wang 2020-04-27 263 offset += list->length; 34a928cf49a7ef Jack Wang 2020-04-27 264 34a928cf49a7ef Jack Wang 2020-04-27 265 wr->wr.sg_list = list; 34a928cf49a7ef Jack Wang 2020-04-27 266 wr->wr.num_sge = 1; 34a928cf49a7ef Jack Wang 2020-04-27 267 wr->remote_addr = le64_to_cpu(id->rd_msg->desc[0].addr); 34a928cf49a7ef Jack Wang 2020-04-27 268 wr->rkey = le32_to_cpu(id->rd_msg->desc[0].key); 34a928cf49a7ef Jack Wang 2020-04-27 269 if (rkey == 0) 34a928cf49a7ef Jack Wang 2020-04-27 270 rkey = wr->rkey; 34a928cf49a7ef Jack Wang 2020-04-27 271 else 34a928cf49a7ef Jack Wang 2020-04-27 272 /* Only one key is actually used */ 34a928cf49a7ef Jack Wang 2020-04-27 273 WARN_ON_ONCE(rkey != wr->rkey); 34a928cf49a7ef Jack Wang 2020-04-27 274 34a928cf49a7ef Jack Wang 2020-04-27 275 wr->wr.opcode = IB_WR_RDMA_WRITE; 34a928cf49a7ef Jack Wang 2020-04-27 276 wr->wr.ex.imm_data = 0; 34a928cf49a7ef Jack Wang 2020-04-27 277 wr->wr.send_flags = 0; 34a928cf49a7ef Jack Wang 2020-04-27 278 34a928cf49a7ef Jack Wang 2020-04-27 279 if (need_inval && always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 280 wr->wr.next = &rwr.wr; 34a928cf49a7ef Jack Wang 2020-04-27 281 rwr.wr.next = &inv_wr; 34a928cf49a7ef Jack Wang 2020-04-27 282 inv_wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 283 } else if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 284 wr->wr.next = &rwr.wr; 34a928cf49a7ef Jack Wang 2020-04-27 285 rwr.wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 286 } else if (need_inval) { 34a928cf49a7ef Jack Wang 2020-04-27 287 wr->wr.next = &inv_wr; 34a928cf49a7ef Jack Wang 2020-04-27 288 inv_wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 289 } else { 34a928cf49a7ef Jack Wang 2020-04-27 290 wr->wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 291 } 34a928cf49a7ef Jack Wang 2020-04-27 292 /* 34a928cf49a7ef Jack Wang 2020-04-27 293 * From time to time we have to post signaled sends, 34a928cf49a7ef Jack Wang 2020-04-27 294 * or send queue will fill up and only QP reset can help. 34a928cf49a7ef Jack Wang 2020-04-27 295 */ 34a928cf49a7ef Jack Wang 2020-04-27 296 flags = atomic_inc_return(&id->con->wr_cnt) % srv->queue_depth ? 34a928cf49a7ef Jack Wang 2020-04-27 297 0 : IB_SEND_SIGNALED; 34a928cf49a7ef Jack Wang 2020-04-27 298 34a928cf49a7ef Jack Wang 2020-04-27 299 if (need_inval) { 34a928cf49a7ef Jack Wang 2020-04-27 300 inv_wr.sg_list = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 301 inv_wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 302 inv_wr.opcode = IB_WR_SEND_WITH_INV; 34a928cf49a7ef Jack Wang 2020-04-27 303 inv_wr.send_flags = 0; 34a928cf49a7ef Jack Wang 2020-04-27 304 inv_wr.ex.invalidate_rkey = rkey; 34a928cf49a7ef Jack Wang 2020-04-27 305 } 34a928cf49a7ef Jack Wang 2020-04-27 306 34a928cf49a7ef Jack Wang 2020-04-27 307 imm_wr.next = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 308 if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 @309 struct ib_sge list; 34a928cf49a7ef Jack Wang 2020-04-27 310 struct rtrs_msg_rkey_rsp *msg; 34a928cf49a7ef Jack Wang 2020-04-27 311 34a928cf49a7ef Jack Wang 2020-04-27 312 srv_mr = &sess->mrs[id->msg_id]; 34a928cf49a7ef Jack Wang 2020-04-27 313 rwr.wr.opcode = IB_WR_REG_MR; 34a928cf49a7ef Jack Wang 2020-04-27 314 rwr.wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 315 rwr.mr = srv_mr->mr; 34a928cf49a7ef Jack Wang 2020-04-27 316 rwr.wr.send_flags = 0; 34a928cf49a7ef Jack Wang 2020-04-27 317 rwr.key = srv_mr->mr->rkey; 34a928cf49a7ef Jack Wang 2020-04-27 318 rwr.access = (IB_ACCESS_LOCAL_WRITE | 34a928cf49a7ef Jack Wang 2020-04-27 319 IB_ACCESS_REMOTE_WRITE); 34a928cf49a7ef Jack Wang 2020-04-27 320 msg = srv_mr->iu->buf; 34a928cf49a7ef Jack Wang 2020-04-27 321 msg->buf_id = cpu_to_le16(id->msg_id); 34a928cf49a7ef Jack Wang 2020-04-27 322 msg->type = cpu_to_le16(RTRS_MSG_RKEY_RSP); 34a928cf49a7ef Jack Wang 2020-04-27 323 msg->rkey = cpu_to_le32(srv_mr->mr->rkey); 34a928cf49a7ef Jack Wang 2020-04-27 324 34a928cf49a7ef Jack Wang 2020-04-27 325 list.addr = srv_mr->iu->dma_addr; 34a928cf49a7ef Jack Wang 2020-04-27 326 list.length = sizeof(*msg); 34a928cf49a7ef Jack Wang 2020-04-27 327 list.lkey = sess->s.dev->ib_pd->local_dma_lkey; 34a928cf49a7ef Jack Wang 2020-04-27 328 imm_wr.sg_list = &list; 34a928cf49a7ef Jack Wang 2020-04-27 329 imm_wr.num_sge = 1; 34a928cf49a7ef Jack Wang 2020-04-27 330 imm_wr.opcode = IB_WR_SEND_WITH_IMM; 34a928cf49a7ef Jack Wang 2020-04-27 331 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, 34a928cf49a7ef Jack Wang 2020-04-27 332 srv_mr->iu->dma_addr, 34a928cf49a7ef Jack Wang 2020-04-27 333 srv_mr->iu->size, DMA_TO_DEVICE); 34a928cf49a7ef Jack Wang 2020-04-27 334 } else { 34a928cf49a7ef Jack Wang 2020-04-27 335 imm_wr.sg_list = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 336 imm_wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 337 imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; 34a928cf49a7ef Jack Wang 2020-04-27 338 } 34a928cf49a7ef Jack Wang 2020-04-27 339 imm_wr.send_flags = flags; 34a928cf49a7ef Jack Wang 2020-04-27 340 imm_wr.ex.imm_data = cpu_to_be32(rtrs_to_io_rsp_imm(id->msg_id, 34a928cf49a7ef Jack Wang 2020-04-27 341 0, need_inval)); 34a928cf49a7ef Jack Wang 2020-04-27 342 34a928cf49a7ef Jack Wang 2020-04-27 343 imm_wr.wr_cqe = &io_comp_cqe; 34a928cf49a7ef Jack Wang 2020-04-27 344 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, dma_addr, 34a928cf49a7ef Jack Wang 2020-04-27 345 offset, DMA_BIDIRECTIONAL); 34a928cf49a7ef Jack Wang 2020-04-27 346 34a928cf49a7ef Jack Wang 2020-04-27 347 err = ib_post_send(id->con->c.qp, &id->tx_wr.wr, NULL); 34a928cf49a7ef Jack Wang 2020-04-27 348 if (unlikely(err)) 34a928cf49a7ef Jack Wang 2020-04-27 349 rtrs_err(s, 34a928cf49a7ef Jack Wang 2020-04-27 350 "Posting RDMA-Write-Request to QP failed, err: %d\n", 34a928cf49a7ef Jack Wang 2020-04-27 351 err); 34a928cf49a7ef Jack Wang 2020-04-27 352 34a928cf49a7ef Jack Wang 2020-04-27 353 return err; 34a928cf49a7ef Jack Wang 2020-04-27 354 } 34a928cf49a7ef Jack Wang 2020-04-27 355 34a928cf49a7ef Jack Wang 2020-04-27 356 /** 34a928cf49a7ef Jack Wang 2020-04-27 357 * send_io_resp_imm() - respond to client with empty IMM on failed READ/WRITE 34a928cf49a7ef Jack Wang 2020-04-27 358 * requests or on successful WRITE request. 34a928cf49a7ef Jack Wang 2020-04-27 359 * @con: the connection to send back result 34a928cf49a7ef Jack Wang 2020-04-27 360 * @id: the id associated with the IO 34a928cf49a7ef Jack Wang 2020-04-27 361 * @errno: the error number of the IO. 34a928cf49a7ef Jack Wang 2020-04-27 362 * 34a928cf49a7ef Jack Wang 2020-04-27 363 * Return 0 on success, errno otherwise. 34a928cf49a7ef Jack Wang 2020-04-27 364 */ 34a928cf49a7ef Jack Wang 2020-04-27 365 static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, 34a928cf49a7ef Jack Wang 2020-04-27 366 int errno) 34a928cf49a7ef Jack Wang 2020-04-27 367 { 34a928cf49a7ef Jack Wang 2020-04-27 368 struct rtrs_sess *s = con->c.sess; 34a928cf49a7ef Jack Wang 2020-04-27 369 struct rtrs_srv_sess *sess = to_srv_sess(s); 34a928cf49a7ef Jack Wang 2020-04-27 370 struct ib_send_wr inv_wr, imm_wr, *wr = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 371 struct ib_reg_wr rwr; 34a928cf49a7ef Jack Wang 2020-04-27 372 struct rtrs_srv *srv = sess->srv; 34a928cf49a7ef Jack Wang 2020-04-27 373 struct rtrs_srv_mr *srv_mr; 34a928cf49a7ef Jack Wang 2020-04-27 374 bool need_inval = false; 34a928cf49a7ef Jack Wang 2020-04-27 375 enum ib_send_flags flags; 34a928cf49a7ef Jack Wang 2020-04-27 376 u32 imm; 34a928cf49a7ef Jack Wang 2020-04-27 377 int err; 34a928cf49a7ef Jack Wang 2020-04-27 378 34a928cf49a7ef Jack Wang 2020-04-27 379 if (id->dir == READ) { 34a928cf49a7ef Jack Wang 2020-04-27 380 struct rtrs_msg_rdma_read *rd_msg = id->rd_msg; 34a928cf49a7ef Jack Wang 2020-04-27 381 size_t sg_cnt; 34a928cf49a7ef Jack Wang 2020-04-27 382 34a928cf49a7ef Jack Wang 2020-04-27 383 need_inval = le16_to_cpu(rd_msg->flags) & 34a928cf49a7ef Jack Wang 2020-04-27 384 RTRS_MSG_NEED_INVAL_F; 34a928cf49a7ef Jack Wang 2020-04-27 385 sg_cnt = le16_to_cpu(rd_msg->sg_cnt); 34a928cf49a7ef Jack Wang 2020-04-27 386 34a928cf49a7ef Jack Wang 2020-04-27 387 if (need_inval) { 34a928cf49a7ef Jack Wang 2020-04-27 388 if (likely(sg_cnt)) { 34a928cf49a7ef Jack Wang 2020-04-27 389 inv_wr.sg_list = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 390 inv_wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 391 inv_wr.opcode = IB_WR_SEND_WITH_INV; 34a928cf49a7ef Jack Wang 2020-04-27 392 inv_wr.send_flags = 0; 34a928cf49a7ef Jack Wang 2020-04-27 393 /* Only one key is actually used */ 34a928cf49a7ef Jack Wang 2020-04-27 394 inv_wr.ex.invalidate_rkey = 34a928cf49a7ef Jack Wang 2020-04-27 395 le32_to_cpu(rd_msg->desc[0].key); 34a928cf49a7ef Jack Wang 2020-04-27 396 } else { 34a928cf49a7ef Jack Wang 2020-04-27 397 WARN_ON_ONCE(1); 34a928cf49a7ef Jack Wang 2020-04-27 398 need_inval = false; 34a928cf49a7ef Jack Wang 2020-04-27 399 } 34a928cf49a7ef Jack Wang 2020-04-27 400 } 34a928cf49a7ef Jack Wang 2020-04-27 401 } 34a928cf49a7ef Jack Wang 2020-04-27 402 34a928cf49a7ef Jack Wang 2020-04-27 403 if (need_inval && always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 404 wr = &inv_wr; 34a928cf49a7ef Jack Wang 2020-04-27 405 inv_wr.next = &rwr.wr; 34a928cf49a7ef Jack Wang 2020-04-27 406 rwr.wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 407 } else if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 408 wr = &rwr.wr; 34a928cf49a7ef Jack Wang 2020-04-27 409 rwr.wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 410 } else if (need_inval) { 34a928cf49a7ef Jack Wang 2020-04-27 411 wr = &inv_wr; 34a928cf49a7ef Jack Wang 2020-04-27 412 inv_wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 413 } else { 34a928cf49a7ef Jack Wang 2020-04-27 414 wr = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 415 } 34a928cf49a7ef Jack Wang 2020-04-27 416 /* 34a928cf49a7ef Jack Wang 2020-04-27 417 * From time to time we have to post signalled sends, 34a928cf49a7ef Jack Wang 2020-04-27 418 * or send queue will fill up and only QP reset can help. 34a928cf49a7ef Jack Wang 2020-04-27 419 */ 34a928cf49a7ef Jack Wang 2020-04-27 420 flags = atomic_inc_return(&con->wr_cnt) % srv->queue_depth ? 34a928cf49a7ef Jack Wang 2020-04-27 421 0 : IB_SEND_SIGNALED; 34a928cf49a7ef Jack Wang 2020-04-27 422 imm = rtrs_to_io_rsp_imm(id->msg_id, errno, need_inval); 34a928cf49a7ef Jack Wang 2020-04-27 423 imm_wr.next = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 424 if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 425 struct ib_sge list; 34a928cf49a7ef Jack Wang 2020-04-27 426 struct rtrs_msg_rkey_rsp *msg; 34a928cf49a7ef Jack Wang 2020-04-27 427 34a928cf49a7ef Jack Wang 2020-04-27 428 srv_mr = &sess->mrs[id->msg_id]; 34a928cf49a7ef Jack Wang 2020-04-27 429 rwr.wr.next = &imm_wr; 34a928cf49a7ef Jack Wang 2020-04-27 430 rwr.wr.opcode = IB_WR_REG_MR; 34a928cf49a7ef Jack Wang 2020-04-27 431 rwr.wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 432 rwr.wr.send_flags = 0; 34a928cf49a7ef Jack Wang 2020-04-27 433 rwr.mr = srv_mr->mr; 34a928cf49a7ef Jack Wang 2020-04-27 434 rwr.key = srv_mr->mr->rkey; 34a928cf49a7ef Jack Wang 2020-04-27 435 rwr.access = (IB_ACCESS_LOCAL_WRITE | 34a928cf49a7ef Jack Wang 2020-04-27 436 IB_ACCESS_REMOTE_WRITE); 34a928cf49a7ef Jack Wang 2020-04-27 437 msg = srv_mr->iu->buf; 34a928cf49a7ef Jack Wang 2020-04-27 438 msg->buf_id = cpu_to_le16(id->msg_id); 34a928cf49a7ef Jack Wang 2020-04-27 439 msg->type = cpu_to_le16(RTRS_MSG_RKEY_RSP); 34a928cf49a7ef Jack Wang 2020-04-27 440 msg->rkey = cpu_to_le32(srv_mr->mr->rkey); 34a928cf49a7ef Jack Wang 2020-04-27 441 34a928cf49a7ef Jack Wang 2020-04-27 442 list.addr = srv_mr->iu->dma_addr; 34a928cf49a7ef Jack Wang 2020-04-27 443 list.length = sizeof(*msg); 34a928cf49a7ef Jack Wang 2020-04-27 444 list.lkey = sess->s.dev->ib_pd->local_dma_lkey; 34a928cf49a7ef Jack Wang 2020-04-27 445 imm_wr.sg_list = &list; 34a928cf49a7ef Jack Wang 2020-04-27 446 imm_wr.num_sge = 1; 34a928cf49a7ef Jack Wang 2020-04-27 447 imm_wr.opcode = IB_WR_SEND_WITH_IMM; 34a928cf49a7ef Jack Wang 2020-04-27 448 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, 34a928cf49a7ef Jack Wang 2020-04-27 449 srv_mr->iu->dma_addr, 34a928cf49a7ef Jack Wang 2020-04-27 450 srv_mr->iu->size, DMA_TO_DEVICE); 34a928cf49a7ef Jack Wang 2020-04-27 451 } else { 34a928cf49a7ef Jack Wang 2020-04-27 452 imm_wr.sg_list = NULL; 34a928cf49a7ef Jack Wang 2020-04-27 453 imm_wr.num_sge = 0; 34a928cf49a7ef Jack Wang 2020-04-27 454 imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; 34a928cf49a7ef Jack Wang 2020-04-27 455 } 34a928cf49a7ef Jack Wang 2020-04-27 456 imm_wr.send_flags = flags; 34a928cf49a7ef Jack Wang 2020-04-27 457 imm_wr.wr_cqe = &io_comp_cqe; 34a928cf49a7ef Jack Wang 2020-04-27 458 34a928cf49a7ef Jack Wang 2020-04-27 459 imm_wr.ex.imm_data = cpu_to_be32(imm); 34a928cf49a7ef Jack Wang 2020-04-27 460 34a928cf49a7ef Jack Wang 2020-04-27 461 err = ib_post_send(id->con->c.qp, wr, NULL); 34a928cf49a7ef Jack Wang 2020-04-27 462 if (unlikely(err)) 34a928cf49a7ef Jack Wang 2020-04-27 463 rtrs_err_rl(s, "Posting RDMA-Reply to QP failed, err: %d\n", 34a928cf49a7ef Jack Wang 2020-04-27 464 err); 34a928cf49a7ef Jack Wang 2020-04-27 465 34a928cf49a7ef Jack Wang 2020-04-27 466 return err; 34a928cf49a7ef Jack Wang 2020-04-27 467 } 34a928cf49a7ef Jack Wang 2020-04-27 468 34a928cf49a7ef Jack Wang 2020-04-27 469 void close_sess(struct rtrs_srv_sess *sess) 34a928cf49a7ef Jack Wang 2020-04-27 470 { 34a928cf49a7ef Jack Wang 2020-04-27 471 enum rtrs_srv_state old_state; 34a928cf49a7ef Jack Wang 2020-04-27 472 34a928cf49a7ef Jack Wang 2020-04-27 473 if (rtrs_srv_change_state_get_old(sess, RTRS_SRV_CLOSING, 34a928cf49a7ef Jack Wang 2020-04-27 474 &old_state)) 34a928cf49a7ef Jack Wang 2020-04-27 475 queue_work(rtrs_wq, &sess->close_work); 34a928cf49a7ef Jack Wang 2020-04-27 476 WARN_ON(sess->state != RTRS_SRV_CLOSING); 34a928cf49a7ef Jack Wang 2020-04-27 477 } 34a928cf49a7ef Jack Wang 2020-04-27 478 34a928cf49a7ef Jack Wang 2020-04-27 479 static inline const char *rtrs_srv_state_str(enum rtrs_srv_state state) 34a928cf49a7ef Jack Wang 2020-04-27 480 { 34a928cf49a7ef Jack Wang 2020-04-27 481 switch (state) { 34a928cf49a7ef Jack Wang 2020-04-27 482 case RTRS_SRV_CONNECTING: 34a928cf49a7ef Jack Wang 2020-04-27 483 return "RTRS_SRV_CONNECTING"; 34a928cf49a7ef Jack Wang 2020-04-27 484 case RTRS_SRV_CONNECTED: 34a928cf49a7ef Jack Wang 2020-04-27 485 return "RTRS_SRV_CONNECTED"; 34a928cf49a7ef Jack Wang 2020-04-27 486 case RTRS_SRV_CLOSING: 34a928cf49a7ef Jack Wang 2020-04-27 487 return "RTRS_SRV_CLOSING"; 34a928cf49a7ef Jack Wang 2020-04-27 488 case RTRS_SRV_CLOSED: 34a928cf49a7ef Jack Wang 2020-04-27 489 return "RTRS_SRV_CLOSED"; 34a928cf49a7ef Jack Wang 2020-04-27 490 default: 34a928cf49a7ef Jack Wang 2020-04-27 491 return "UNKNOWN"; 34a928cf49a7ef Jack Wang 2020-04-27 492 } 34a928cf49a7ef Jack Wang 2020-04-27 493 } 34a928cf49a7ef Jack Wang 2020-04-27 494 34a928cf49a7ef Jack Wang 2020-04-27 495 /** 34a928cf49a7ef Jack Wang 2020-04-27 496 * rtrs_srv_resp_rdma() - Finish an RDMA request 34a928cf49a7ef Jack Wang 2020-04-27 497 * 34a928cf49a7ef Jack Wang 2020-04-27 498 * @id: Internal RTRS operation identifier 34a928cf49a7ef Jack Wang 2020-04-27 499 * @status: Response Code sent to the other side for this operation. 34a928cf49a7ef Jack Wang 2020-04-27 500 * 0 = success, <=0 error 34a928cf49a7ef Jack Wang 2020-04-27 501 * Context: any 34a928cf49a7ef Jack Wang 2020-04-27 502 * 34a928cf49a7ef Jack Wang 2020-04-27 503 * Finish a RDMA operation. A message is sent to the client and the 34a928cf49a7ef Jack Wang 2020-04-27 504 * corresponding memory areas will be released. 34a928cf49a7ef Jack Wang 2020-04-27 505 */ 34a928cf49a7ef Jack Wang 2020-04-27 506 bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status) 34a928cf49a7ef Jack Wang 2020-04-27 507 { 34a928cf49a7ef Jack Wang 2020-04-27 @508 struct rtrs_srv_con *con = id->con; 34a928cf49a7ef Jack Wang 2020-04-27 509 struct rtrs_sess *s = con->c.sess; 34a928cf49a7ef Jack Wang 2020-04-27 510 struct rtrs_srv_sess *sess = to_srv_sess(s); 34a928cf49a7ef Jack Wang 2020-04-27 511 int err; 34a928cf49a7ef Jack Wang 2020-04-27 512 34a928cf49a7ef Jack Wang 2020-04-27 513 if (WARN_ON(!id)) 34a928cf49a7ef Jack Wang 2020-04-27 514 return true; 34a928cf49a7ef Jack Wang 2020-04-27 515 34a928cf49a7ef Jack Wang 2020-04-27 516 id->status = status; 34a928cf49a7ef Jack Wang 2020-04-27 517 34a928cf49a7ef Jack Wang 2020-04-27 518 if (unlikely(sess->state != RTRS_SRV_CONNECTED)) { 34a928cf49a7ef Jack Wang 2020-04-27 519 rtrs_err_rl(s, 34a928cf49a7ef Jack Wang 2020-04-27 520 "Sending I/O response failed, session is disconnected, sess state %s\n", 34a928cf49a7ef Jack Wang 2020-04-27 521 rtrs_srv_state_str(sess->state)); 34a928cf49a7ef Jack Wang 2020-04-27 522 goto out; 34a928cf49a7ef Jack Wang 2020-04-27 523 } 34a928cf49a7ef Jack Wang 2020-04-27 524 if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 525 struct rtrs_srv_mr *mr = &sess->mrs[id->msg_id]; 34a928cf49a7ef Jack Wang 2020-04-27 526 34a928cf49a7ef Jack Wang 2020-04-27 527 ib_update_fast_reg_key(mr->mr, ib_inc_rkey(mr->mr->rkey)); 34a928cf49a7ef Jack Wang 2020-04-27 528 } 34a928cf49a7ef Jack Wang 2020-04-27 529 if (unlikely(atomic_sub_return(1, 34a928cf49a7ef Jack Wang 2020-04-27 530 &con->sq_wr_avail) < 0)) { 34a928cf49a7ef Jack Wang 2020-04-27 531 pr_err("IB send queue full\n"); 34a928cf49a7ef Jack Wang 2020-04-27 532 atomic_add(1, &con->sq_wr_avail); 34a928cf49a7ef Jack Wang 2020-04-27 533 spin_lock(&con->rsp_wr_wait_lock); 34a928cf49a7ef Jack Wang 2020-04-27 534 list_add_tail(&id->wait_list, &con->rsp_wr_wait_list); 34a928cf49a7ef Jack Wang 2020-04-27 535 spin_unlock(&con->rsp_wr_wait_lock); 34a928cf49a7ef Jack Wang 2020-04-27 536 return false; 34a928cf49a7ef Jack Wang 2020-04-27 537 } 34a928cf49a7ef Jack Wang 2020-04-27 538 34a928cf49a7ef Jack Wang 2020-04-27 539 if (status || id->dir == WRITE || !id->rd_msg->sg_cnt) 34a928cf49a7ef Jack Wang 2020-04-27 540 err = send_io_resp_imm(con, id, status); 34a928cf49a7ef Jack Wang 2020-04-27 541 else 34a928cf49a7ef Jack Wang 2020-04-27 542 err = rdma_write_sg(id); 34a928cf49a7ef Jack Wang 2020-04-27 543 34a928cf49a7ef Jack Wang 2020-04-27 544 if (unlikely(err)) { 34a928cf49a7ef Jack Wang 2020-04-27 545 rtrs_err_rl(s, "IO response failed: %d\n", err); 34a928cf49a7ef Jack Wang 2020-04-27 546 close_sess(sess); 34a928cf49a7ef Jack Wang 2020-04-27 547 } 34a928cf49a7ef Jack Wang 2020-04-27 548 out: 34a928cf49a7ef Jack Wang 2020-04-27 549 rtrs_srv_put_ops_ids(sess); 34a928cf49a7ef Jack Wang 2020-04-27 550 return true; 34a928cf49a7ef Jack Wang 2020-04-27 551 } 34a928cf49a7ef Jack Wang 2020-04-27 552 EXPORT_SYMBOL(rtrs_srv_resp_rdma); 34a928cf49a7ef Jack Wang 2020-04-27 553 34a928cf49a7ef Jack Wang 2020-04-27 554 /** 34a928cf49a7ef Jack Wang 2020-04-27 555 * rtrs_srv_set_sess_priv() - Set private pointer in rtrs_srv. 34a928cf49a7ef Jack Wang 2020-04-27 556 * @srv: Session pointer 34a928cf49a7ef Jack Wang 2020-04-27 557 * @priv: The private pointer that is associated with the session. 34a928cf49a7ef Jack Wang 2020-04-27 558 */ 34a928cf49a7ef Jack Wang 2020-04-27 559 void rtrs_srv_set_sess_priv(struct rtrs_srv *srv, void *priv) 34a928cf49a7ef Jack Wang 2020-04-27 560 { 34a928cf49a7ef Jack Wang 2020-04-27 561 srv->priv = priv; 34a928cf49a7ef Jack Wang 2020-04-27 562 } 34a928cf49a7ef Jack Wang 2020-04-27 563 EXPORT_SYMBOL(rtrs_srv_set_sess_priv); 34a928cf49a7ef Jack Wang 2020-04-27 564 34a928cf49a7ef Jack Wang 2020-04-27 565 static void unmap_cont_bufs(struct rtrs_srv_sess *sess) 34a928cf49a7ef Jack Wang 2020-04-27 566 { 34a928cf49a7ef Jack Wang 2020-04-27 567 int i; 34a928cf49a7ef Jack Wang 2020-04-27 568 34a928cf49a7ef Jack Wang 2020-04-27 569 for (i = 0; i < sess->mrs_num; i++) { 34a928cf49a7ef Jack Wang 2020-04-27 570 struct rtrs_srv_mr *srv_mr; 34a928cf49a7ef Jack Wang 2020-04-27 571 34a928cf49a7ef Jack Wang 2020-04-27 572 srv_mr = &sess->mrs[i]; 34a928cf49a7ef Jack Wang 2020-04-27 573 rtrs_iu_free(srv_mr->iu, DMA_TO_DEVICE, 34a928cf49a7ef Jack Wang 2020-04-27 574 sess->s.dev->ib_dev, 1); 34a928cf49a7ef Jack Wang 2020-04-27 575 ib_dereg_mr(srv_mr->mr); 34a928cf49a7ef Jack Wang 2020-04-27 576 ib_dma_unmap_sg(sess->s.dev->ib_dev, srv_mr->sgt.sgl, 34a928cf49a7ef Jack Wang 2020-04-27 577 srv_mr->sgt.nents, DMA_BIDIRECTIONAL); 34a928cf49a7ef Jack Wang 2020-04-27 578 sg_free_table(&srv_mr->sgt); 34a928cf49a7ef Jack Wang 2020-04-27 579 } 34a928cf49a7ef Jack Wang 2020-04-27 580 kfree(sess->mrs); 34a928cf49a7ef Jack Wang 2020-04-27 581 } 34a928cf49a7ef Jack Wang 2020-04-27 582 34a928cf49a7ef Jack Wang 2020-04-27 583 static int map_cont_bufs(struct rtrs_srv_sess *sess) 34a928cf49a7ef Jack Wang 2020-04-27 584 { 34a928cf49a7ef Jack Wang 2020-04-27 585 struct rtrs_srv *srv = sess->srv; 34a928cf49a7ef Jack Wang 2020-04-27 586 struct rtrs_sess *ss = &sess->s; 34a928cf49a7ef Jack Wang 2020-04-27 587 int i, mri, err, mrs_num; 34a928cf49a7ef Jack Wang 2020-04-27 588 unsigned int chunk_bits; 34a928cf49a7ef Jack Wang 2020-04-27 589 int chunks_per_mr = 1; 34a928cf49a7ef Jack Wang 2020-04-27 590 34a928cf49a7ef Jack Wang 2020-04-27 591 /* 34a928cf49a7ef Jack Wang 2020-04-27 592 * Here we map queue_depth chunks to MR. Firstly we have to 34a928cf49a7ef Jack Wang 2020-04-27 593 * figure out how many chunks can we map per MR. 34a928cf49a7ef Jack Wang 2020-04-27 594 */ 34a928cf49a7ef Jack Wang 2020-04-27 595 if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 596 /* 34a928cf49a7ef Jack Wang 2020-04-27 597 * in order to do invalidate for each chunks of memory, we needs 34a928cf49a7ef Jack Wang 2020-04-27 598 * more memory regions. 34a928cf49a7ef Jack Wang 2020-04-27 599 */ 34a928cf49a7ef Jack Wang 2020-04-27 600 mrs_num = srv->queue_depth; 34a928cf49a7ef Jack Wang 2020-04-27 601 } else { 34a928cf49a7ef Jack Wang 2020-04-27 602 chunks_per_mr = 34a928cf49a7ef Jack Wang 2020-04-27 603 sess->s.dev->ib_dev->attrs.max_fast_reg_page_list_len; 34a928cf49a7ef Jack Wang 2020-04-27 604 mrs_num = DIV_ROUND_UP(srv->queue_depth, chunks_per_mr); 34a928cf49a7ef Jack Wang 2020-04-27 605 chunks_per_mr = DIV_ROUND_UP(srv->queue_depth, mrs_num); 34a928cf49a7ef Jack Wang 2020-04-27 606 } 34a928cf49a7ef Jack Wang 2020-04-27 607 34a928cf49a7ef Jack Wang 2020-04-27 608 sess->mrs = kcalloc(mrs_num, sizeof(*sess->mrs), GFP_KERNEL); 34a928cf49a7ef Jack Wang 2020-04-27 609 if (!sess->mrs) 34a928cf49a7ef Jack Wang 2020-04-27 610 return -ENOMEM; 34a928cf49a7ef Jack Wang 2020-04-27 611 34a928cf49a7ef Jack Wang 2020-04-27 612 sess->mrs_num = mrs_num; 34a928cf49a7ef Jack Wang 2020-04-27 613 34a928cf49a7ef Jack Wang 2020-04-27 614 for (mri = 0; mri < mrs_num; mri++) { 34a928cf49a7ef Jack Wang 2020-04-27 615 struct rtrs_srv_mr *srv_mr = &sess->mrs[mri]; 34a928cf49a7ef Jack Wang 2020-04-27 616 struct sg_table *sgt = &srv_mr->sgt; 34a928cf49a7ef Jack Wang 2020-04-27 617 struct scatterlist *s; 34a928cf49a7ef Jack Wang 2020-04-27 618 struct ib_mr *mr; 34a928cf49a7ef Jack Wang 2020-04-27 619 int nr, chunks; 34a928cf49a7ef Jack Wang 2020-04-27 @620 struct rtrs_msg_rkey_rsp *rsp; 34a928cf49a7ef Jack Wang 2020-04-27 621 34a928cf49a7ef Jack Wang 2020-04-27 622 chunks = chunks_per_mr * mri; 34a928cf49a7ef Jack Wang 2020-04-27 623 if (!always_invalidate) 34a928cf49a7ef Jack Wang 2020-04-27 624 chunks_per_mr = min_t(int, chunks_per_mr, 34a928cf49a7ef Jack Wang 2020-04-27 625 srv->queue_depth - chunks); 34a928cf49a7ef Jack Wang 2020-04-27 626 34a928cf49a7ef Jack Wang 2020-04-27 627 err = sg_alloc_table(sgt, chunks_per_mr, GFP_KERNEL); 34a928cf49a7ef Jack Wang 2020-04-27 628 if (err) 34a928cf49a7ef Jack Wang 2020-04-27 629 goto err; 34a928cf49a7ef Jack Wang 2020-04-27 630 34a928cf49a7ef Jack Wang 2020-04-27 631 for_each_sg(sgt->sgl, s, chunks_per_mr, i) 34a928cf49a7ef Jack Wang 2020-04-27 632 sg_set_page(s, srv->chunks[chunks + i], 34a928cf49a7ef Jack Wang 2020-04-27 633 max_chunk_size, 0); 34a928cf49a7ef Jack Wang 2020-04-27 634 34a928cf49a7ef Jack Wang 2020-04-27 635 nr = ib_dma_map_sg(sess->s.dev->ib_dev, sgt->sgl, 34a928cf49a7ef Jack Wang 2020-04-27 636 sgt->nents, DMA_BIDIRECTIONAL); 34a928cf49a7ef Jack Wang 2020-04-27 637 if (nr < sgt->nents) { 34a928cf49a7ef Jack Wang 2020-04-27 638 err = nr < 0 ? nr : -EINVAL; 34a928cf49a7ef Jack Wang 2020-04-27 639 goto free_sg; 34a928cf49a7ef Jack Wang 2020-04-27 640 } 34a928cf49a7ef Jack Wang 2020-04-27 641 mr = ib_alloc_mr(sess->s.dev->ib_pd, IB_MR_TYPE_MEM_REG, 34a928cf49a7ef Jack Wang 2020-04-27 642 sgt->nents); 34a928cf49a7ef Jack Wang 2020-04-27 643 if (IS_ERR(mr)) { 34a928cf49a7ef Jack Wang 2020-04-27 644 err = PTR_ERR(mr); 34a928cf49a7ef Jack Wang 2020-04-27 645 goto unmap_sg; 34a928cf49a7ef Jack Wang 2020-04-27 646 } 34a928cf49a7ef Jack Wang 2020-04-27 647 nr = ib_map_mr_sg(mr, sgt->sgl, sgt->nents, 34a928cf49a7ef Jack Wang 2020-04-27 648 NULL, max_chunk_size); 34a928cf49a7ef Jack Wang 2020-04-27 649 if (nr < sgt->nents) { 34a928cf49a7ef Jack Wang 2020-04-27 650 err = nr < 0 ? nr : -EINVAL; 34a928cf49a7ef Jack Wang 2020-04-27 651 goto dereg_mr; 34a928cf49a7ef Jack Wang 2020-04-27 652 } 34a928cf49a7ef Jack Wang 2020-04-27 653 34a928cf49a7ef Jack Wang 2020-04-27 654 if (always_invalidate) { 34a928cf49a7ef Jack Wang 2020-04-27 655 srv_mr->iu = rtrs_iu_alloc(1, sizeof(*rsp), GFP_KERNEL, 34a928cf49a7ef Jack Wang 2020-04-27 656 sess->s.dev->ib_dev, 34a928cf49a7ef Jack Wang 2020-04-27 657 DMA_TO_DEVICE, 34a928cf49a7ef Jack Wang 2020-04-27 658 rtrs_srv_rdma_done); 34a928cf49a7ef Jack Wang 2020-04-27 659 if (!srv_mr->iu) { 34a928cf49a7ef Jack Wang 2020-04-27 660 rtrs_err(ss, "rtrs_iu_alloc(), err: %d\n", 34a928cf49a7ef Jack Wang 2020-04-27 661 -ENOMEM); 34a928cf49a7ef Jack Wang 2020-04-27 662 goto free_iu; 34a928cf49a7ef Jack Wang 2020-04-27 663 } 34a928cf49a7ef Jack Wang 2020-04-27 664 } 34a928cf49a7ef Jack Wang 2020-04-27 665 /* Eventually dma addr for each chunk can be cached */ 34a928cf49a7ef Jack Wang 2020-04-27 666 for_each_sg(sgt->sgl, s, sgt->orig_nents, i) 34a928cf49a7ef Jack Wang 2020-04-27 667 sess->dma_addr[chunks + i] = sg_dma_address(s); 34a928cf49a7ef Jack Wang 2020-04-27 668 34a928cf49a7ef Jack Wang 2020-04-27 669 ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); 34a928cf49a7ef Jack Wang 2020-04-27 670 srv_mr->mr = mr; 34a928cf49a7ef Jack Wang 2020-04-27 671 34a928cf49a7ef Jack Wang 2020-04-27 672 continue; 34a928cf49a7ef Jack Wang 2020-04-27 673 err: 34a928cf49a7ef Jack Wang 2020-04-27 674 while (mri--) { 34a928cf49a7ef Jack Wang 2020-04-27 675 srv_mr = &sess->mrs[mri]; 34a928cf49a7ef Jack Wang 2020-04-27 676 sgt = &srv_mr->sgt; 34a928cf49a7ef Jack Wang 2020-04-27 677 mr = srv_mr->mr; 34a928cf49a7ef Jack Wang 2020-04-27 678 free_iu: 34a928cf49a7ef Jack Wang 2020-04-27 679 rtrs_iu_free(srv_mr->iu, DMA_TO_DEVICE, 34a928cf49a7ef Jack Wang 2020-04-27 680 sess->s.dev->ib_dev, 1); 34a928cf49a7ef Jack Wang 2020-04-27 681 dereg_mr: 34a928cf49a7ef Jack Wang 2020-04-27 682 ib_dereg_mr(mr); 34a928cf49a7ef Jack Wang 2020-04-27 683 unmap_sg: 34a928cf49a7ef Jack Wang 2020-04-27 684 ib_dma_unmap_sg(sess->s.dev->ib_dev, sgt->sgl, 34a928cf49a7ef Jack Wang 2020-04-27 685 sgt->nents, DMA_BIDIRECTIONAL); 34a928cf49a7ef Jack Wang 2020-04-27 686 free_sg: 34a928cf49a7ef Jack Wang 2020-04-27 687 sg_free_table(sgt); 34a928cf49a7ef Jack Wang 2020-04-27 688 } 34a928cf49a7ef Jack Wang 2020-04-27 689 kfree(sess->mrs); 34a928cf49a7ef Jack Wang 2020-04-27 690 34a928cf49a7ef Jack Wang 2020-04-27 691 return err; 34a928cf49a7ef Jack Wang 2020-04-27 692 } 34a928cf49a7ef Jack Wang 2020-04-27 693 34a928cf49a7ef Jack Wang 2020-04-27 694 chunk_bits = ilog2(srv->queue_depth - 1) + 1; 34a928cf49a7ef Jack Wang 2020-04-27 695 sess->mem_bits = (MAX_IMM_PAYL_BITS - chunk_bits); 34a928cf49a7ef Jack Wang 2020-04-27 696 34a928cf49a7ef Jack Wang 2020-04-27 697 return 0; 34a928cf49a7ef Jack Wang 2020-04-27 698 } 34a928cf49a7ef Jack Wang 2020-04-27 699 :::::: The code at line 508 was first introduced by commit :::::: 34a928cf49a7ef7ae5027dfa9c2570ef9c5dd97e RDMA/rtrs: server: main functionality :::::: TO: Jack Wang <jinpu.wang@cloud.ionos.com> :::::: CC: 0day robot <lkp@intel.com> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On Tue, Apr 28, 2020 at 8:01 PM kbuild test robot <lkp@intel.com> wrote: > > Hi Danil, > > I love your patch! Perhaps something to improve: > > [auto build test WARNING on block/for-next] > [also build test WARNING on driver-core/driver-core-testing rdma/for-next linus/master v5.7-rc3 next-20200428] > [if your patch is applied to the wrong git tree, please drop us a note to help > improve the system. BTW, we also suggest to use '--base' option to specify the > base tree in git format-patch, please see https://stackoverflow.com/a/37406982] > > url: https://github.com/0day-ci/linux/commits/Danil-Kipnis/RTRS-former-IBTRS-RDMA-Transport-Library-and-RNBD-former-IBNBD-RDMA-Network-Block-Device/20200428-080733 > base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kbuild test robot <lkp@intel.com> > > > cppcheck warnings: (new ones prefixed by >>) > > >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:508:29: warning: Either the condition '!id' is redundant or there is possible null pointer dereference: id. [nullPointerRedundantCheck] > struct rtrs_srv_con *con = id->con; > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:513:14: note: Assuming that condition '!id' is not redundant > if (WARN_ON(!id)) > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:508:29: note: Null pointer dereference > struct rtrs_srv_con *con = id->con; > ^ > >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:1448:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] > fallthrough; > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:1454:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] > fallthrough; > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:1460:3: warning: Statements following return, break, continue, goto or throw will never be executed. [unreachableCode] > fallthrough; > ^ > >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:309:17: warning: Local variable 'list' shadows outer variable [shadowVariable] > struct ib_sge list; > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:240:17: note: Shadowed declaration > struct ib_sge *list; > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:309:17: note: Shadow variable > struct ib_sge list; > ^ > >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:296:65: warning: Clarify calculation precedence for '%' and '?'. [clarifyCalculation] > flags = atomic_inc_return(&id->con->wr_cnt) % srv->queue_depth ? > ^ > drivers/infiniband/ulp/rtrs/rtrs-srv.c:420:61: warning: Clarify calculation precedence for '%' and '?'. [clarifyCalculation] > flags = atomic_inc_return(&con->wr_cnt) % srv->queue_depth ? > ^ > >> drivers/infiniband/ulp/rtrs/rtrs-srv.c:620:29: warning: Variable 'rsp' is not assigned a value. [unassignedVariable] > struct rtrs_msg_rkey_rsp *rsp; > ^ > > vim +508 drivers/infiniband/ulp/rtrs/rtrs-srv.c > > 34a928cf49a7ef Jack Wang 2020-04-27 224 > 34a928cf49a7ef Jack Wang 2020-04-27 225 static int rdma_write_sg(struct rtrs_srv_op *id) > 34a928cf49a7ef Jack Wang 2020-04-27 226 { > 34a928cf49a7ef Jack Wang 2020-04-27 227 struct rtrs_sess *s = id->con->c.sess; > 34a928cf49a7ef Jack Wang 2020-04-27 228 struct rtrs_srv_sess *sess = to_srv_sess(s); > 34a928cf49a7ef Jack Wang 2020-04-27 229 dma_addr_t dma_addr = sess->dma_addr[id->msg_id]; > 34a928cf49a7ef Jack Wang 2020-04-27 230 struct rtrs_srv_mr *srv_mr; > 34a928cf49a7ef Jack Wang 2020-04-27 231 struct rtrs_srv *srv = sess->srv; > 34a928cf49a7ef Jack Wang 2020-04-27 232 struct ib_send_wr inv_wr, imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 233 struct ib_rdma_wr *wr = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 234 enum ib_send_flags flags; > 34a928cf49a7ef Jack Wang 2020-04-27 235 size_t sg_cnt; > 34a928cf49a7ef Jack Wang 2020-04-27 236 int err, offset; > 34a928cf49a7ef Jack Wang 2020-04-27 237 bool need_inval; > 34a928cf49a7ef Jack Wang 2020-04-27 238 u32 rkey = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 239 struct ib_reg_wr rwr; > 34a928cf49a7ef Jack Wang 2020-04-27 240 struct ib_sge *list; > 34a928cf49a7ef Jack Wang 2020-04-27 241 > 34a928cf49a7ef Jack Wang 2020-04-27 242 sg_cnt = le16_to_cpu(id->rd_msg->sg_cnt); > 34a928cf49a7ef Jack Wang 2020-04-27 243 need_inval = le16_to_cpu(id->rd_msg->flags) & RTRS_MSG_NEED_INVAL_F; > 34a928cf49a7ef Jack Wang 2020-04-27 244 if (unlikely(sg_cnt != 1)) > 34a928cf49a7ef Jack Wang 2020-04-27 245 return -EINVAL; > 34a928cf49a7ef Jack Wang 2020-04-27 246 > 34a928cf49a7ef Jack Wang 2020-04-27 247 offset = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 248 > 34a928cf49a7ef Jack Wang 2020-04-27 249 wr = &id->tx_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 250 list = &id->tx_sg; > 34a928cf49a7ef Jack Wang 2020-04-27 251 list->addr = dma_addr + offset; > 34a928cf49a7ef Jack Wang 2020-04-27 252 list->length = le32_to_cpu(id->rd_msg->desc[0].len); > 34a928cf49a7ef Jack Wang 2020-04-27 253 > 34a928cf49a7ef Jack Wang 2020-04-27 254 /* WR will fail with length error > 34a928cf49a7ef Jack Wang 2020-04-27 255 * if this is 0 > 34a928cf49a7ef Jack Wang 2020-04-27 256 */ > 34a928cf49a7ef Jack Wang 2020-04-27 257 if (unlikely(list->length == 0)) { > 34a928cf49a7ef Jack Wang 2020-04-27 258 rtrs_err(s, "Invalid RDMA-Write sg list length 0\n"); > 34a928cf49a7ef Jack Wang 2020-04-27 259 return -EINVAL; > 34a928cf49a7ef Jack Wang 2020-04-27 260 } > 34a928cf49a7ef Jack Wang 2020-04-27 261 > 34a928cf49a7ef Jack Wang 2020-04-27 262 list->lkey = sess->s.dev->ib_pd->local_dma_lkey; > 34a928cf49a7ef Jack Wang 2020-04-27 263 offset += list->length; > 34a928cf49a7ef Jack Wang 2020-04-27 264 > 34a928cf49a7ef Jack Wang 2020-04-27 265 wr->wr.sg_list = list; > 34a928cf49a7ef Jack Wang 2020-04-27 266 wr->wr.num_sge = 1; > 34a928cf49a7ef Jack Wang 2020-04-27 267 wr->remote_addr = le64_to_cpu(id->rd_msg->desc[0].addr); > 34a928cf49a7ef Jack Wang 2020-04-27 268 wr->rkey = le32_to_cpu(id->rd_msg->desc[0].key); > 34a928cf49a7ef Jack Wang 2020-04-27 269 if (rkey == 0) > 34a928cf49a7ef Jack Wang 2020-04-27 270 rkey = wr->rkey; > 34a928cf49a7ef Jack Wang 2020-04-27 271 else > 34a928cf49a7ef Jack Wang 2020-04-27 272 /* Only one key is actually used */ > 34a928cf49a7ef Jack Wang 2020-04-27 273 WARN_ON_ONCE(rkey != wr->rkey); > 34a928cf49a7ef Jack Wang 2020-04-27 274 > 34a928cf49a7ef Jack Wang 2020-04-27 275 wr->wr.opcode = IB_WR_RDMA_WRITE; > 34a928cf49a7ef Jack Wang 2020-04-27 276 wr->wr.ex.imm_data = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 277 wr->wr.send_flags = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 278 > 34a928cf49a7ef Jack Wang 2020-04-27 279 if (need_inval && always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 280 wr->wr.next = &rwr.wr; > 34a928cf49a7ef Jack Wang 2020-04-27 281 rwr.wr.next = &inv_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 282 inv_wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 283 } else if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 284 wr->wr.next = &rwr.wr; > 34a928cf49a7ef Jack Wang 2020-04-27 285 rwr.wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 286 } else if (need_inval) { > 34a928cf49a7ef Jack Wang 2020-04-27 287 wr->wr.next = &inv_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 288 inv_wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 289 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 290 wr->wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 291 } > 34a928cf49a7ef Jack Wang 2020-04-27 292 /* > 34a928cf49a7ef Jack Wang 2020-04-27 293 * From time to time we have to post signaled sends, > 34a928cf49a7ef Jack Wang 2020-04-27 294 * or send queue will fill up and only QP reset can help. > 34a928cf49a7ef Jack Wang 2020-04-27 295 */ > 34a928cf49a7ef Jack Wang 2020-04-27 296 flags = atomic_inc_return(&id->con->wr_cnt) % srv->queue_depth ? > 34a928cf49a7ef Jack Wang 2020-04-27 297 0 : IB_SEND_SIGNALED; > 34a928cf49a7ef Jack Wang 2020-04-27 298 > 34a928cf49a7ef Jack Wang 2020-04-27 299 if (need_inval) { > 34a928cf49a7ef Jack Wang 2020-04-27 300 inv_wr.sg_list = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 301 inv_wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 302 inv_wr.opcode = IB_WR_SEND_WITH_INV; > 34a928cf49a7ef Jack Wang 2020-04-27 303 inv_wr.send_flags = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 304 inv_wr.ex.invalidate_rkey = rkey; > 34a928cf49a7ef Jack Wang 2020-04-27 305 } > 34a928cf49a7ef Jack Wang 2020-04-27 306 > 34a928cf49a7ef Jack Wang 2020-04-27 307 imm_wr.next = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 308 if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 @309 struct ib_sge list; > 34a928cf49a7ef Jack Wang 2020-04-27 310 struct rtrs_msg_rkey_rsp *msg; > 34a928cf49a7ef Jack Wang 2020-04-27 311 > 34a928cf49a7ef Jack Wang 2020-04-27 312 srv_mr = &sess->mrs[id->msg_id]; > 34a928cf49a7ef Jack Wang 2020-04-27 313 rwr.wr.opcode = IB_WR_REG_MR; > 34a928cf49a7ef Jack Wang 2020-04-27 314 rwr.wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 315 rwr.mr = srv_mr->mr; > 34a928cf49a7ef Jack Wang 2020-04-27 316 rwr.wr.send_flags = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 317 rwr.key = srv_mr->mr->rkey; > 34a928cf49a7ef Jack Wang 2020-04-27 318 rwr.access = (IB_ACCESS_LOCAL_WRITE | > 34a928cf49a7ef Jack Wang 2020-04-27 319 IB_ACCESS_REMOTE_WRITE); > 34a928cf49a7ef Jack Wang 2020-04-27 320 msg = srv_mr->iu->buf; > 34a928cf49a7ef Jack Wang 2020-04-27 321 msg->buf_id = cpu_to_le16(id->msg_id); > 34a928cf49a7ef Jack Wang 2020-04-27 322 msg->type = cpu_to_le16(RTRS_MSG_RKEY_RSP); > 34a928cf49a7ef Jack Wang 2020-04-27 323 msg->rkey = cpu_to_le32(srv_mr->mr->rkey); > 34a928cf49a7ef Jack Wang 2020-04-27 324 > 34a928cf49a7ef Jack Wang 2020-04-27 325 list.addr = srv_mr->iu->dma_addr; > 34a928cf49a7ef Jack Wang 2020-04-27 326 list.length = sizeof(*msg); > 34a928cf49a7ef Jack Wang 2020-04-27 327 list.lkey = sess->s.dev->ib_pd->local_dma_lkey; > 34a928cf49a7ef Jack Wang 2020-04-27 328 imm_wr.sg_list = &list; > 34a928cf49a7ef Jack Wang 2020-04-27 329 imm_wr.num_sge = 1; > 34a928cf49a7ef Jack Wang 2020-04-27 330 imm_wr.opcode = IB_WR_SEND_WITH_IMM; > 34a928cf49a7ef Jack Wang 2020-04-27 331 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, > 34a928cf49a7ef Jack Wang 2020-04-27 332 srv_mr->iu->dma_addr, > 34a928cf49a7ef Jack Wang 2020-04-27 333 srv_mr->iu->size, DMA_TO_DEVICE); > 34a928cf49a7ef Jack Wang 2020-04-27 334 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 335 imm_wr.sg_list = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 336 imm_wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 337 imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; > 34a928cf49a7ef Jack Wang 2020-04-27 338 } > 34a928cf49a7ef Jack Wang 2020-04-27 339 imm_wr.send_flags = flags; > 34a928cf49a7ef Jack Wang 2020-04-27 340 imm_wr.ex.imm_data = cpu_to_be32(rtrs_to_io_rsp_imm(id->msg_id, > 34a928cf49a7ef Jack Wang 2020-04-27 341 0, need_inval)); > 34a928cf49a7ef Jack Wang 2020-04-27 342 > 34a928cf49a7ef Jack Wang 2020-04-27 343 imm_wr.wr_cqe = &io_comp_cqe; > 34a928cf49a7ef Jack Wang 2020-04-27 344 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, dma_addr, > 34a928cf49a7ef Jack Wang 2020-04-27 345 offset, DMA_BIDIRECTIONAL); > 34a928cf49a7ef Jack Wang 2020-04-27 346 > 34a928cf49a7ef Jack Wang 2020-04-27 347 err = ib_post_send(id->con->c.qp, &id->tx_wr.wr, NULL); > 34a928cf49a7ef Jack Wang 2020-04-27 348 if (unlikely(err)) > 34a928cf49a7ef Jack Wang 2020-04-27 349 rtrs_err(s, > 34a928cf49a7ef Jack Wang 2020-04-27 350 "Posting RDMA-Write-Request to QP failed, err: %d\n", > 34a928cf49a7ef Jack Wang 2020-04-27 351 err); > 34a928cf49a7ef Jack Wang 2020-04-27 352 > 34a928cf49a7ef Jack Wang 2020-04-27 353 return err; > 34a928cf49a7ef Jack Wang 2020-04-27 354 } > 34a928cf49a7ef Jack Wang 2020-04-27 355 > 34a928cf49a7ef Jack Wang 2020-04-27 356 /** > 34a928cf49a7ef Jack Wang 2020-04-27 357 * send_io_resp_imm() - respond to client with empty IMM on failed READ/WRITE > 34a928cf49a7ef Jack Wang 2020-04-27 358 * requests or on successful WRITE request. > 34a928cf49a7ef Jack Wang 2020-04-27 359 * @con: the connection to send back result > 34a928cf49a7ef Jack Wang 2020-04-27 360 * @id: the id associated with the IO > 34a928cf49a7ef Jack Wang 2020-04-27 361 * @errno: the error number of the IO. > 34a928cf49a7ef Jack Wang 2020-04-27 362 * > 34a928cf49a7ef Jack Wang 2020-04-27 363 * Return 0 on success, errno otherwise. > 34a928cf49a7ef Jack Wang 2020-04-27 364 */ > 34a928cf49a7ef Jack Wang 2020-04-27 365 static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, > 34a928cf49a7ef Jack Wang 2020-04-27 366 int errno) > 34a928cf49a7ef Jack Wang 2020-04-27 367 { > 34a928cf49a7ef Jack Wang 2020-04-27 368 struct rtrs_sess *s = con->c.sess; > 34a928cf49a7ef Jack Wang 2020-04-27 369 struct rtrs_srv_sess *sess = to_srv_sess(s); > 34a928cf49a7ef Jack Wang 2020-04-27 370 struct ib_send_wr inv_wr, imm_wr, *wr = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 371 struct ib_reg_wr rwr; > 34a928cf49a7ef Jack Wang 2020-04-27 372 struct rtrs_srv *srv = sess->srv; > 34a928cf49a7ef Jack Wang 2020-04-27 373 struct rtrs_srv_mr *srv_mr; > 34a928cf49a7ef Jack Wang 2020-04-27 374 bool need_inval = false; > 34a928cf49a7ef Jack Wang 2020-04-27 375 enum ib_send_flags flags; > 34a928cf49a7ef Jack Wang 2020-04-27 376 u32 imm; > 34a928cf49a7ef Jack Wang 2020-04-27 377 int err; > 34a928cf49a7ef Jack Wang 2020-04-27 378 > 34a928cf49a7ef Jack Wang 2020-04-27 379 if (id->dir == READ) { > 34a928cf49a7ef Jack Wang 2020-04-27 380 struct rtrs_msg_rdma_read *rd_msg = id->rd_msg; > 34a928cf49a7ef Jack Wang 2020-04-27 381 size_t sg_cnt; > 34a928cf49a7ef Jack Wang 2020-04-27 382 > 34a928cf49a7ef Jack Wang 2020-04-27 383 need_inval = le16_to_cpu(rd_msg->flags) & > 34a928cf49a7ef Jack Wang 2020-04-27 384 RTRS_MSG_NEED_INVAL_F; > 34a928cf49a7ef Jack Wang 2020-04-27 385 sg_cnt = le16_to_cpu(rd_msg->sg_cnt); > 34a928cf49a7ef Jack Wang 2020-04-27 386 > 34a928cf49a7ef Jack Wang 2020-04-27 387 if (need_inval) { > 34a928cf49a7ef Jack Wang 2020-04-27 388 if (likely(sg_cnt)) { > 34a928cf49a7ef Jack Wang 2020-04-27 389 inv_wr.sg_list = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 390 inv_wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 391 inv_wr.opcode = IB_WR_SEND_WITH_INV; > 34a928cf49a7ef Jack Wang 2020-04-27 392 inv_wr.send_flags = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 393 /* Only one key is actually used */ > 34a928cf49a7ef Jack Wang 2020-04-27 394 inv_wr.ex.invalidate_rkey = > 34a928cf49a7ef Jack Wang 2020-04-27 395 le32_to_cpu(rd_msg->desc[0].key); > 34a928cf49a7ef Jack Wang 2020-04-27 396 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 397 WARN_ON_ONCE(1); > 34a928cf49a7ef Jack Wang 2020-04-27 398 need_inval = false; > 34a928cf49a7ef Jack Wang 2020-04-27 399 } > 34a928cf49a7ef Jack Wang 2020-04-27 400 } > 34a928cf49a7ef Jack Wang 2020-04-27 401 } > 34a928cf49a7ef Jack Wang 2020-04-27 402 > 34a928cf49a7ef Jack Wang 2020-04-27 403 if (need_inval && always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 404 wr = &inv_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 405 inv_wr.next = &rwr.wr; > 34a928cf49a7ef Jack Wang 2020-04-27 406 rwr.wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 407 } else if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 408 wr = &rwr.wr; > 34a928cf49a7ef Jack Wang 2020-04-27 409 rwr.wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 410 } else if (need_inval) { > 34a928cf49a7ef Jack Wang 2020-04-27 411 wr = &inv_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 412 inv_wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 413 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 414 wr = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 415 } > 34a928cf49a7ef Jack Wang 2020-04-27 416 /* > 34a928cf49a7ef Jack Wang 2020-04-27 417 * From time to time we have to post signalled sends, > 34a928cf49a7ef Jack Wang 2020-04-27 418 * or send queue will fill up and only QP reset can help. > 34a928cf49a7ef Jack Wang 2020-04-27 419 */ > 34a928cf49a7ef Jack Wang 2020-04-27 420 flags = atomic_inc_return(&con->wr_cnt) % srv->queue_depth ? > 34a928cf49a7ef Jack Wang 2020-04-27 421 0 : IB_SEND_SIGNALED; > 34a928cf49a7ef Jack Wang 2020-04-27 422 imm = rtrs_to_io_rsp_imm(id->msg_id, errno, need_inval); > 34a928cf49a7ef Jack Wang 2020-04-27 423 imm_wr.next = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 424 if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 425 struct ib_sge list; > 34a928cf49a7ef Jack Wang 2020-04-27 426 struct rtrs_msg_rkey_rsp *msg; > 34a928cf49a7ef Jack Wang 2020-04-27 427 > 34a928cf49a7ef Jack Wang 2020-04-27 428 srv_mr = &sess->mrs[id->msg_id]; > 34a928cf49a7ef Jack Wang 2020-04-27 429 rwr.wr.next = &imm_wr; > 34a928cf49a7ef Jack Wang 2020-04-27 430 rwr.wr.opcode = IB_WR_REG_MR; > 34a928cf49a7ef Jack Wang 2020-04-27 431 rwr.wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 432 rwr.wr.send_flags = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 433 rwr.mr = srv_mr->mr; > 34a928cf49a7ef Jack Wang 2020-04-27 434 rwr.key = srv_mr->mr->rkey; > 34a928cf49a7ef Jack Wang 2020-04-27 435 rwr.access = (IB_ACCESS_LOCAL_WRITE | > 34a928cf49a7ef Jack Wang 2020-04-27 436 IB_ACCESS_REMOTE_WRITE); > 34a928cf49a7ef Jack Wang 2020-04-27 437 msg = srv_mr->iu->buf; > 34a928cf49a7ef Jack Wang 2020-04-27 438 msg->buf_id = cpu_to_le16(id->msg_id); > 34a928cf49a7ef Jack Wang 2020-04-27 439 msg->type = cpu_to_le16(RTRS_MSG_RKEY_RSP); > 34a928cf49a7ef Jack Wang 2020-04-27 440 msg->rkey = cpu_to_le32(srv_mr->mr->rkey); > 34a928cf49a7ef Jack Wang 2020-04-27 441 > 34a928cf49a7ef Jack Wang 2020-04-27 442 list.addr = srv_mr->iu->dma_addr; > 34a928cf49a7ef Jack Wang 2020-04-27 443 list.length = sizeof(*msg); > 34a928cf49a7ef Jack Wang 2020-04-27 444 list.lkey = sess->s.dev->ib_pd->local_dma_lkey; > 34a928cf49a7ef Jack Wang 2020-04-27 445 imm_wr.sg_list = &list; > 34a928cf49a7ef Jack Wang 2020-04-27 446 imm_wr.num_sge = 1; > 34a928cf49a7ef Jack Wang 2020-04-27 447 imm_wr.opcode = IB_WR_SEND_WITH_IMM; > 34a928cf49a7ef Jack Wang 2020-04-27 448 ib_dma_sync_single_for_device(sess->s.dev->ib_dev, > 34a928cf49a7ef Jack Wang 2020-04-27 449 srv_mr->iu->dma_addr, > 34a928cf49a7ef Jack Wang 2020-04-27 450 srv_mr->iu->size, DMA_TO_DEVICE); > 34a928cf49a7ef Jack Wang 2020-04-27 451 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 452 imm_wr.sg_list = NULL; > 34a928cf49a7ef Jack Wang 2020-04-27 453 imm_wr.num_sge = 0; > 34a928cf49a7ef Jack Wang 2020-04-27 454 imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; > 34a928cf49a7ef Jack Wang 2020-04-27 455 } > 34a928cf49a7ef Jack Wang 2020-04-27 456 imm_wr.send_flags = flags; > 34a928cf49a7ef Jack Wang 2020-04-27 457 imm_wr.wr_cqe = &io_comp_cqe; > 34a928cf49a7ef Jack Wang 2020-04-27 458 > 34a928cf49a7ef Jack Wang 2020-04-27 459 imm_wr.ex.imm_data = cpu_to_be32(imm); > 34a928cf49a7ef Jack Wang 2020-04-27 460 > 34a928cf49a7ef Jack Wang 2020-04-27 461 err = ib_post_send(id->con->c.qp, wr, NULL); > 34a928cf49a7ef Jack Wang 2020-04-27 462 if (unlikely(err)) > 34a928cf49a7ef Jack Wang 2020-04-27 463 rtrs_err_rl(s, "Posting RDMA-Reply to QP failed, err: %d\n", > 34a928cf49a7ef Jack Wang 2020-04-27 464 err); > 34a928cf49a7ef Jack Wang 2020-04-27 465 > 34a928cf49a7ef Jack Wang 2020-04-27 466 return err; > 34a928cf49a7ef Jack Wang 2020-04-27 467 } > 34a928cf49a7ef Jack Wang 2020-04-27 468 > 34a928cf49a7ef Jack Wang 2020-04-27 469 void close_sess(struct rtrs_srv_sess *sess) > 34a928cf49a7ef Jack Wang 2020-04-27 470 { > 34a928cf49a7ef Jack Wang 2020-04-27 471 enum rtrs_srv_state old_state; > 34a928cf49a7ef Jack Wang 2020-04-27 472 > 34a928cf49a7ef Jack Wang 2020-04-27 473 if (rtrs_srv_change_state_get_old(sess, RTRS_SRV_CLOSING, > 34a928cf49a7ef Jack Wang 2020-04-27 474 &old_state)) > 34a928cf49a7ef Jack Wang 2020-04-27 475 queue_work(rtrs_wq, &sess->close_work); > 34a928cf49a7ef Jack Wang 2020-04-27 476 WARN_ON(sess->state != RTRS_SRV_CLOSING); > 34a928cf49a7ef Jack Wang 2020-04-27 477 } > 34a928cf49a7ef Jack Wang 2020-04-27 478 > 34a928cf49a7ef Jack Wang 2020-04-27 479 static inline const char *rtrs_srv_state_str(enum rtrs_srv_state state) > 34a928cf49a7ef Jack Wang 2020-04-27 480 { > 34a928cf49a7ef Jack Wang 2020-04-27 481 switch (state) { > 34a928cf49a7ef Jack Wang 2020-04-27 482 case RTRS_SRV_CONNECTING: > 34a928cf49a7ef Jack Wang 2020-04-27 483 return "RTRS_SRV_CONNECTING"; > 34a928cf49a7ef Jack Wang 2020-04-27 484 case RTRS_SRV_CONNECTED: > 34a928cf49a7ef Jack Wang 2020-04-27 485 return "RTRS_SRV_CONNECTED"; > 34a928cf49a7ef Jack Wang 2020-04-27 486 case RTRS_SRV_CLOSING: > 34a928cf49a7ef Jack Wang 2020-04-27 487 return "RTRS_SRV_CLOSING"; > 34a928cf49a7ef Jack Wang 2020-04-27 488 case RTRS_SRV_CLOSED: > 34a928cf49a7ef Jack Wang 2020-04-27 489 return "RTRS_SRV_CLOSED"; > 34a928cf49a7ef Jack Wang 2020-04-27 490 default: > 34a928cf49a7ef Jack Wang 2020-04-27 491 return "UNKNOWN"; > 34a928cf49a7ef Jack Wang 2020-04-27 492 } > 34a928cf49a7ef Jack Wang 2020-04-27 493 } > 34a928cf49a7ef Jack Wang 2020-04-27 494 > 34a928cf49a7ef Jack Wang 2020-04-27 495 /** > 34a928cf49a7ef Jack Wang 2020-04-27 496 * rtrs_srv_resp_rdma() - Finish an RDMA request > 34a928cf49a7ef Jack Wang 2020-04-27 497 * > 34a928cf49a7ef Jack Wang 2020-04-27 498 * @id: Internal RTRS operation identifier > 34a928cf49a7ef Jack Wang 2020-04-27 499 * @status: Response Code sent to the other side for this operation. > 34a928cf49a7ef Jack Wang 2020-04-27 500 * 0 = success, <=0 error > 34a928cf49a7ef Jack Wang 2020-04-27 501 * Context: any > 34a928cf49a7ef Jack Wang 2020-04-27 502 * > 34a928cf49a7ef Jack Wang 2020-04-27 503 * Finish a RDMA operation. A message is sent to the client and the > 34a928cf49a7ef Jack Wang 2020-04-27 504 * corresponding memory areas will be released. > 34a928cf49a7ef Jack Wang 2020-04-27 505 */ > 34a928cf49a7ef Jack Wang 2020-04-27 506 bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status) > 34a928cf49a7ef Jack Wang 2020-04-27 507 { > 34a928cf49a7ef Jack Wang 2020-04-27 @508 struct rtrs_srv_con *con = id->con; > 34a928cf49a7ef Jack Wang 2020-04-27 509 struct rtrs_sess *s = con->c.sess; > 34a928cf49a7ef Jack Wang 2020-04-27 510 struct rtrs_srv_sess *sess = to_srv_sess(s); > 34a928cf49a7ef Jack Wang 2020-04-27 511 int err; > 34a928cf49a7ef Jack Wang 2020-04-27 512 > 34a928cf49a7ef Jack Wang 2020-04-27 513 if (WARN_ON(!id)) > 34a928cf49a7ef Jack Wang 2020-04-27 514 return true; > 34a928cf49a7ef Jack Wang 2020-04-27 515 > 34a928cf49a7ef Jack Wang 2020-04-27 516 id->status = status; > 34a928cf49a7ef Jack Wang 2020-04-27 517 > 34a928cf49a7ef Jack Wang 2020-04-27 518 if (unlikely(sess->state != RTRS_SRV_CONNECTED)) { > 34a928cf49a7ef Jack Wang 2020-04-27 519 rtrs_err_rl(s, > 34a928cf49a7ef Jack Wang 2020-04-27 520 "Sending I/O response failed, session is disconnected, sess state %s\n", > 34a928cf49a7ef Jack Wang 2020-04-27 521 rtrs_srv_state_str(sess->state)); > 34a928cf49a7ef Jack Wang 2020-04-27 522 goto out; > 34a928cf49a7ef Jack Wang 2020-04-27 523 } > 34a928cf49a7ef Jack Wang 2020-04-27 524 if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 525 struct rtrs_srv_mr *mr = &sess->mrs[id->msg_id]; > 34a928cf49a7ef Jack Wang 2020-04-27 526 > 34a928cf49a7ef Jack Wang 2020-04-27 527 ib_update_fast_reg_key(mr->mr, ib_inc_rkey(mr->mr->rkey)); > 34a928cf49a7ef Jack Wang 2020-04-27 528 } > 34a928cf49a7ef Jack Wang 2020-04-27 529 if (unlikely(atomic_sub_return(1, > 34a928cf49a7ef Jack Wang 2020-04-27 530 &con->sq_wr_avail) < 0)) { > 34a928cf49a7ef Jack Wang 2020-04-27 531 pr_err("IB send queue full\n"); > 34a928cf49a7ef Jack Wang 2020-04-27 532 atomic_add(1, &con->sq_wr_avail); > 34a928cf49a7ef Jack Wang 2020-04-27 533 spin_lock(&con->rsp_wr_wait_lock); > 34a928cf49a7ef Jack Wang 2020-04-27 534 list_add_tail(&id->wait_list, &con->rsp_wr_wait_list); > 34a928cf49a7ef Jack Wang 2020-04-27 535 spin_unlock(&con->rsp_wr_wait_lock); > 34a928cf49a7ef Jack Wang 2020-04-27 536 return false; > 34a928cf49a7ef Jack Wang 2020-04-27 537 } > 34a928cf49a7ef Jack Wang 2020-04-27 538 > 34a928cf49a7ef Jack Wang 2020-04-27 539 if (status || id->dir == WRITE || !id->rd_msg->sg_cnt) > 34a928cf49a7ef Jack Wang 2020-04-27 540 err = send_io_resp_imm(con, id, status); > 34a928cf49a7ef Jack Wang 2020-04-27 541 else > 34a928cf49a7ef Jack Wang 2020-04-27 542 err = rdma_write_sg(id); > 34a928cf49a7ef Jack Wang 2020-04-27 543 > 34a928cf49a7ef Jack Wang 2020-04-27 544 if (unlikely(err)) { > 34a928cf49a7ef Jack Wang 2020-04-27 545 rtrs_err_rl(s, "IO response failed: %d\n", err); > 34a928cf49a7ef Jack Wang 2020-04-27 546 close_sess(sess); > 34a928cf49a7ef Jack Wang 2020-04-27 547 } > 34a928cf49a7ef Jack Wang 2020-04-27 548 out: > 34a928cf49a7ef Jack Wang 2020-04-27 549 rtrs_srv_put_ops_ids(sess); > 34a928cf49a7ef Jack Wang 2020-04-27 550 return true; > 34a928cf49a7ef Jack Wang 2020-04-27 551 } > 34a928cf49a7ef Jack Wang 2020-04-27 552 EXPORT_SYMBOL(rtrs_srv_resp_rdma); > 34a928cf49a7ef Jack Wang 2020-04-27 553 > 34a928cf49a7ef Jack Wang 2020-04-27 554 /** > 34a928cf49a7ef Jack Wang 2020-04-27 555 * rtrs_srv_set_sess_priv() - Set private pointer in rtrs_srv. > 34a928cf49a7ef Jack Wang 2020-04-27 556 * @srv: Session pointer > 34a928cf49a7ef Jack Wang 2020-04-27 557 * @priv: The private pointer that is associated with the session. > 34a928cf49a7ef Jack Wang 2020-04-27 558 */ > 34a928cf49a7ef Jack Wang 2020-04-27 559 void rtrs_srv_set_sess_priv(struct rtrs_srv *srv, void *priv) > 34a928cf49a7ef Jack Wang 2020-04-27 560 { > 34a928cf49a7ef Jack Wang 2020-04-27 561 srv->priv = priv; > 34a928cf49a7ef Jack Wang 2020-04-27 562 } > 34a928cf49a7ef Jack Wang 2020-04-27 563 EXPORT_SYMBOL(rtrs_srv_set_sess_priv); > 34a928cf49a7ef Jack Wang 2020-04-27 564 > 34a928cf49a7ef Jack Wang 2020-04-27 565 static void unmap_cont_bufs(struct rtrs_srv_sess *sess) > 34a928cf49a7ef Jack Wang 2020-04-27 566 { > 34a928cf49a7ef Jack Wang 2020-04-27 567 int i; > 34a928cf49a7ef Jack Wang 2020-04-27 568 > 34a928cf49a7ef Jack Wang 2020-04-27 569 for (i = 0; i < sess->mrs_num; i++) { > 34a928cf49a7ef Jack Wang 2020-04-27 570 struct rtrs_srv_mr *srv_mr; > 34a928cf49a7ef Jack Wang 2020-04-27 571 > 34a928cf49a7ef Jack Wang 2020-04-27 572 srv_mr = &sess->mrs[i]; > 34a928cf49a7ef Jack Wang 2020-04-27 573 rtrs_iu_free(srv_mr->iu, DMA_TO_DEVICE, > 34a928cf49a7ef Jack Wang 2020-04-27 574 sess->s.dev->ib_dev, 1); > 34a928cf49a7ef Jack Wang 2020-04-27 575 ib_dereg_mr(srv_mr->mr); > 34a928cf49a7ef Jack Wang 2020-04-27 576 ib_dma_unmap_sg(sess->s.dev->ib_dev, srv_mr->sgt.sgl, > 34a928cf49a7ef Jack Wang 2020-04-27 577 srv_mr->sgt.nents, DMA_BIDIRECTIONAL); > 34a928cf49a7ef Jack Wang 2020-04-27 578 sg_free_table(&srv_mr->sgt); > 34a928cf49a7ef Jack Wang 2020-04-27 579 } > 34a928cf49a7ef Jack Wang 2020-04-27 580 kfree(sess->mrs); > 34a928cf49a7ef Jack Wang 2020-04-27 581 } > 34a928cf49a7ef Jack Wang 2020-04-27 582 > 34a928cf49a7ef Jack Wang 2020-04-27 583 static int map_cont_bufs(struct rtrs_srv_sess *sess) > 34a928cf49a7ef Jack Wang 2020-04-27 584 { > 34a928cf49a7ef Jack Wang 2020-04-27 585 struct rtrs_srv *srv = sess->srv; > 34a928cf49a7ef Jack Wang 2020-04-27 586 struct rtrs_sess *ss = &sess->s; > 34a928cf49a7ef Jack Wang 2020-04-27 587 int i, mri, err, mrs_num; > 34a928cf49a7ef Jack Wang 2020-04-27 588 unsigned int chunk_bits; > 34a928cf49a7ef Jack Wang 2020-04-27 589 int chunks_per_mr = 1; > 34a928cf49a7ef Jack Wang 2020-04-27 590 > 34a928cf49a7ef Jack Wang 2020-04-27 591 /* > 34a928cf49a7ef Jack Wang 2020-04-27 592 * Here we map queue_depth chunks to MR. Firstly we have to > 34a928cf49a7ef Jack Wang 2020-04-27 593 * figure out how many chunks can we map per MR. > 34a928cf49a7ef Jack Wang 2020-04-27 594 */ > 34a928cf49a7ef Jack Wang 2020-04-27 595 if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 596 /* > 34a928cf49a7ef Jack Wang 2020-04-27 597 * in order to do invalidate for each chunks of memory, we needs > 34a928cf49a7ef Jack Wang 2020-04-27 598 * more memory regions. > 34a928cf49a7ef Jack Wang 2020-04-27 599 */ > 34a928cf49a7ef Jack Wang 2020-04-27 600 mrs_num = srv->queue_depth; > 34a928cf49a7ef Jack Wang 2020-04-27 601 } else { > 34a928cf49a7ef Jack Wang 2020-04-27 602 chunks_per_mr = > 34a928cf49a7ef Jack Wang 2020-04-27 603 sess->s.dev->ib_dev->attrs.max_fast_reg_page_list_len; > 34a928cf49a7ef Jack Wang 2020-04-27 604 mrs_num = DIV_ROUND_UP(srv->queue_depth, chunks_per_mr); > 34a928cf49a7ef Jack Wang 2020-04-27 605 chunks_per_mr = DIV_ROUND_UP(srv->queue_depth, mrs_num); > 34a928cf49a7ef Jack Wang 2020-04-27 606 } > 34a928cf49a7ef Jack Wang 2020-04-27 607 > 34a928cf49a7ef Jack Wang 2020-04-27 608 sess->mrs = kcalloc(mrs_num, sizeof(*sess->mrs), GFP_KERNEL); > 34a928cf49a7ef Jack Wang 2020-04-27 609 if (!sess->mrs) > 34a928cf49a7ef Jack Wang 2020-04-27 610 return -ENOMEM; > 34a928cf49a7ef Jack Wang 2020-04-27 611 > 34a928cf49a7ef Jack Wang 2020-04-27 612 sess->mrs_num = mrs_num; > 34a928cf49a7ef Jack Wang 2020-04-27 613 > 34a928cf49a7ef Jack Wang 2020-04-27 614 for (mri = 0; mri < mrs_num; mri++) { > 34a928cf49a7ef Jack Wang 2020-04-27 615 struct rtrs_srv_mr *srv_mr = &sess->mrs[mri]; > 34a928cf49a7ef Jack Wang 2020-04-27 616 struct sg_table *sgt = &srv_mr->sgt; > 34a928cf49a7ef Jack Wang 2020-04-27 617 struct scatterlist *s; > 34a928cf49a7ef Jack Wang 2020-04-27 618 struct ib_mr *mr; > 34a928cf49a7ef Jack Wang 2020-04-27 619 int nr, chunks; > 34a928cf49a7ef Jack Wang 2020-04-27 @620 struct rtrs_msg_rkey_rsp *rsp; > 34a928cf49a7ef Jack Wang 2020-04-27 621 > 34a928cf49a7ef Jack Wang 2020-04-27 622 chunks = chunks_per_mr * mri; > 34a928cf49a7ef Jack Wang 2020-04-27 623 if (!always_invalidate) > 34a928cf49a7ef Jack Wang 2020-04-27 624 chunks_per_mr = min_t(int, chunks_per_mr, > 34a928cf49a7ef Jack Wang 2020-04-27 625 srv->queue_depth - chunks); > 34a928cf49a7ef Jack Wang 2020-04-27 626 > 34a928cf49a7ef Jack Wang 2020-04-27 627 err = sg_alloc_table(sgt, chunks_per_mr, GFP_KERNEL); > 34a928cf49a7ef Jack Wang 2020-04-27 628 if (err) > 34a928cf49a7ef Jack Wang 2020-04-27 629 goto err; > 34a928cf49a7ef Jack Wang 2020-04-27 630 > 34a928cf49a7ef Jack Wang 2020-04-27 631 for_each_sg(sgt->sgl, s, chunks_per_mr, i) > 34a928cf49a7ef Jack Wang 2020-04-27 632 sg_set_page(s, srv->chunks[chunks + i], > 34a928cf49a7ef Jack Wang 2020-04-27 633 max_chunk_size, 0); > 34a928cf49a7ef Jack Wang 2020-04-27 634 > 34a928cf49a7ef Jack Wang 2020-04-27 635 nr = ib_dma_map_sg(sess->s.dev->ib_dev, sgt->sgl, > 34a928cf49a7ef Jack Wang 2020-04-27 636 sgt->nents, DMA_BIDIRECTIONAL); > 34a928cf49a7ef Jack Wang 2020-04-27 637 if (nr < sgt->nents) { > 34a928cf49a7ef Jack Wang 2020-04-27 638 err = nr < 0 ? nr : -EINVAL; > 34a928cf49a7ef Jack Wang 2020-04-27 639 goto free_sg; > 34a928cf49a7ef Jack Wang 2020-04-27 640 } > 34a928cf49a7ef Jack Wang 2020-04-27 641 mr = ib_alloc_mr(sess->s.dev->ib_pd, IB_MR_TYPE_MEM_REG, > 34a928cf49a7ef Jack Wang 2020-04-27 642 sgt->nents); > 34a928cf49a7ef Jack Wang 2020-04-27 643 if (IS_ERR(mr)) { > 34a928cf49a7ef Jack Wang 2020-04-27 644 err = PTR_ERR(mr); > 34a928cf49a7ef Jack Wang 2020-04-27 645 goto unmap_sg; > 34a928cf49a7ef Jack Wang 2020-04-27 646 } > 34a928cf49a7ef Jack Wang 2020-04-27 647 nr = ib_map_mr_sg(mr, sgt->sgl, sgt->nents, > 34a928cf49a7ef Jack Wang 2020-04-27 648 NULL, max_chunk_size); > 34a928cf49a7ef Jack Wang 2020-04-27 649 if (nr < sgt->nents) { > 34a928cf49a7ef Jack Wang 2020-04-27 650 err = nr < 0 ? nr : -EINVAL; > 34a928cf49a7ef Jack Wang 2020-04-27 651 goto dereg_mr; > 34a928cf49a7ef Jack Wang 2020-04-27 652 } > 34a928cf49a7ef Jack Wang 2020-04-27 653 > 34a928cf49a7ef Jack Wang 2020-04-27 654 if (always_invalidate) { > 34a928cf49a7ef Jack Wang 2020-04-27 655 srv_mr->iu = rtrs_iu_alloc(1, sizeof(*rsp), GFP_KERNEL, > 34a928cf49a7ef Jack Wang 2020-04-27 656 sess->s.dev->ib_dev, > 34a928cf49a7ef Jack Wang 2020-04-27 657 DMA_TO_DEVICE, > 34a928cf49a7ef Jack Wang 2020-04-27 658 rtrs_srv_rdma_done); > 34a928cf49a7ef Jack Wang 2020-04-27 659 if (!srv_mr->iu) { > 34a928cf49a7ef Jack Wang 2020-04-27 660 rtrs_err(ss, "rtrs_iu_alloc(), err: %d\n", > 34a928cf49a7ef Jack Wang 2020-04-27 661 -ENOMEM); > 34a928cf49a7ef Jack Wang 2020-04-27 662 goto free_iu; > 34a928cf49a7ef Jack Wang 2020-04-27 663 } > 34a928cf49a7ef Jack Wang 2020-04-27 664 } > 34a928cf49a7ef Jack Wang 2020-04-27 665 /* Eventually dma addr for each chunk can be cached */ > 34a928cf49a7ef Jack Wang 2020-04-27 666 for_each_sg(sgt->sgl, s, sgt->orig_nents, i) > 34a928cf49a7ef Jack Wang 2020-04-27 667 sess->dma_addr[chunks + i] = sg_dma_address(s); > 34a928cf49a7ef Jack Wang 2020-04-27 668 > 34a928cf49a7ef Jack Wang 2020-04-27 669 ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); > 34a928cf49a7ef Jack Wang 2020-04-27 670 srv_mr->mr = mr; > 34a928cf49a7ef Jack Wang 2020-04-27 671 > 34a928cf49a7ef Jack Wang 2020-04-27 672 continue; > 34a928cf49a7ef Jack Wang 2020-04-27 673 err: > 34a928cf49a7ef Jack Wang 2020-04-27 674 while (mri--) { > 34a928cf49a7ef Jack Wang 2020-04-27 675 srv_mr = &sess->mrs[mri]; > 34a928cf49a7ef Jack Wang 2020-04-27 676 sgt = &srv_mr->sgt; > 34a928cf49a7ef Jack Wang 2020-04-27 677 mr = srv_mr->mr; > 34a928cf49a7ef Jack Wang 2020-04-27 678 free_iu: > 34a928cf49a7ef Jack Wang 2020-04-27 679 rtrs_iu_free(srv_mr->iu, DMA_TO_DEVICE, > 34a928cf49a7ef Jack Wang 2020-04-27 680 sess->s.dev->ib_dev, 1); > 34a928cf49a7ef Jack Wang 2020-04-27 681 dereg_mr: > 34a928cf49a7ef Jack Wang 2020-04-27 682 ib_dereg_mr(mr); > 34a928cf49a7ef Jack Wang 2020-04-27 683 unmap_sg: > 34a928cf49a7ef Jack Wang 2020-04-27 684 ib_dma_unmap_sg(sess->s.dev->ib_dev, sgt->sgl, > 34a928cf49a7ef Jack Wang 2020-04-27 685 sgt->nents, DMA_BIDIRECTIONAL); > 34a928cf49a7ef Jack Wang 2020-04-27 686 free_sg: > 34a928cf49a7ef Jack Wang 2020-04-27 687 sg_free_table(sgt); > 34a928cf49a7ef Jack Wang 2020-04-27 688 } > 34a928cf49a7ef Jack Wang 2020-04-27 689 kfree(sess->mrs); > 34a928cf49a7ef Jack Wang 2020-04-27 690 > 34a928cf49a7ef Jack Wang 2020-04-27 691 return err; > 34a928cf49a7ef Jack Wang 2020-04-27 692 } > 34a928cf49a7ef Jack Wang 2020-04-27 693 > 34a928cf49a7ef Jack Wang 2020-04-27 694 chunk_bits = ilog2(srv->queue_depth - 1) + 1; > 34a928cf49a7ef Jack Wang 2020-04-27 695 sess->mem_bits = (MAX_IMM_PAYL_BITS - chunk_bits); > 34a928cf49a7ef Jack Wang 2020-04-27 696 > 34a928cf49a7ef Jack Wang 2020-04-27 697 return 0; > 34a928cf49a7ef Jack Wang 2020-04-27 698 } > 34a928cf49a7ef Jack Wang 2020-04-27 699 > > :::::: The code at line 508 was first introduced by commit > :::::: 34a928cf49a7ef7ae5027dfa9c2570ef9c5dd97e RDMA/rtrs: server: main functionality > > :::::: TO: Jack Wang <jinpu.wang@cloud.ionos.com> > :::::: CC: 0day robot <lkp@intel.com> > > --- > 0-DAY CI Kernel Test Service, Intel Corporation > https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Thanks for reporting, we will fix it.
diff --git a/drivers/infiniband/Kconfig b/drivers/infiniband/Kconfig index ade86388434f..477418b37786 100644 --- a/drivers/infiniband/Kconfig +++ b/drivers/infiniband/Kconfig @@ -107,6 +107,7 @@ source "drivers/infiniband/ulp/srpt/Kconfig" source "drivers/infiniband/ulp/iser/Kconfig" source "drivers/infiniband/ulp/isert/Kconfig" +source "drivers/infiniband/ulp/rtrs/Kconfig" source "drivers/infiniband/ulp/opa_vnic/Kconfig" diff --git a/drivers/infiniband/ulp/Makefile b/drivers/infiniband/ulp/Makefile index 437813c7b481..4d0004b58377 100644 --- a/drivers/infiniband/ulp/Makefile +++ b/drivers/infiniband/ulp/Makefile @@ -5,3 +5,4 @@ obj-$(CONFIG_INFINIBAND_SRPT) += srpt/ obj-$(CONFIG_INFINIBAND_ISER) += iser/ obj-$(CONFIG_INFINIBAND_ISERT) += isert/ obj-$(CONFIG_INFINIBAND_OPA_VNIC) += opa_vnic/ +obj-$(CONFIG_INFINIBAND_RTRS) += rtrs/ diff --git a/drivers/infiniband/ulp/rtrs/Kconfig b/drivers/infiniband/ulp/rtrs/Kconfig new file mode 100644 index 000000000000..9092b62e6dc8 --- /dev/null +++ b/drivers/infiniband/ulp/rtrs/Kconfig @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +config INFINIBAND_RTRS + tristate + depends on INFINIBAND_ADDR_TRANS + +config INFINIBAND_RTRS_CLIENT + tristate "RTRS client module" + depends on INFINIBAND_ADDR_TRANS + select INFINIBAND_RTRS + help + RDMA transport client module. + + RDMA Transport (RTRS) client implements a reliable transport layer + and also multipathing functionality and that it is intended to be + the base layer for a block storage initiator over RDMA. + +config INFINIBAND_RTRS_SERVER + tristate "RTRS server module" + depends on INFINIBAND_ADDR_TRANS + select INFINIBAND_RTRS + help + RDMA transport server module. + + RDMA Transport (RTRS) server module processing connection and IO + requests received from the RTRS client module, it will pass the + IO requests to its user eg. RNBD_server. diff --git a/drivers/infiniband/ulp/rtrs/Makefile b/drivers/infiniband/ulp/rtrs/Makefile new file mode 100644 index 000000000000..3898509be270 --- /dev/null +++ b/drivers/infiniband/ulp/rtrs/Makefile @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +rtrs-client-y := rtrs-clt.o \ + rtrs-clt-stats.o \ + rtrs-clt-sysfs.o + +rtrs-server-y := rtrs-srv.o \ + rtrs-srv-stats.o \ + rtrs-srv-sysfs.o + +rtrs-core-y := rtrs.o + +obj-$(CONFIG_INFINIBAND_RTRS) += rtrs-core.o +obj-$(CONFIG_INFINIBAND_RTRS_CLIENT) += rtrs-client.o +obj-$(CONFIG_INFINIBAND_RTRS_SERVER) += rtrs-server.o