From patchwork Thu Mar 24 12:43:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Walukiewicz, Miroslaw" X-Patchwork-Id: 658661 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p2OChfr7009300 for ; Thu, 24 Mar 2011 12:43:41 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752504Ab1CXMnk (ORCPT ); Thu, 24 Mar 2011 08:43:40 -0400 Received: from mga14.intel.com ([143.182.124.37]:61520 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751947Ab1CXMnj (ORCPT ); Thu, 24 Mar 2011 08:43:39 -0400 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 24 Mar 2011 05:43:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.63,236,1299484800"; d="scan'208";a="407894357" Received: from cmsutil001.isw.intel.com ([10.237.237.10]) by azsmga001.ch.intel.com with ESMTP; 24 Mar 2011 05:43:38 -0700 Received: from gkslx010.igk.intel.com (gkslx010.igk.intel.com [172.28.168.161]) by cmsutil001.isw.intel.com (8.12.11.20060308/8.12.11/MailSET/Hub) with ESMTP id p2OChbZK032455; Thu, 24 Mar 2011 12:43:37 GMT Received: from gkslx010.igk.intel.com (localhost [127.0.0.1]) by gkslx010.igk.intel.com with ESMTP id p2OCha3F019779; Thu, 24 Mar 2011 13:43:36 +0100 Subject: [PATCH] RDMA/core: Optimized path for kernel post_send/post_recv To: roland@kernel.org From: miroslaw.walukiewicz@intel.com Cc: linux-rdma@vger.kernel.org Date: Thu, 24 Mar 2011 13:43:36 +0100 Message-ID: <20110324123937.19461.56781.stgit@gkslx010.igk.intel.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Thu, 24 Mar 2011 12:43:42 +0000 (UTC) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index c426992..ba6655c 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -299,6 +299,7 @@ ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file, INIT_LIST_HEAD(&ucontext->srq_list); INIT_LIST_HEAD(&ucontext->ah_list); ucontext->closing = 0; + ucontext->use_shpage_for_rxtx = 0; resp.num_comp_vectors = file->device->num_comp_vectors; @@ -1448,15 +1449,31 @@ ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file, if (cmd.wqe_size < sizeof (struct ib_uverbs_send_wr)) return -EINVAL; + qp = idr_read_qp(cmd.qp_handle, file->ucontext); + if (!qp) + goto out_raw_qp; + + if (file->ucontext->use_shpage_for_rxtx) { + /* pass NULL pointers as the information about */ + /* buffers is passed using endor defined shared page */ + resp.bad_wr = 0; + ret = qp->device->post_send(qp, NULL, NULL); + if (ret) + resp.bad_wr = cmd.wr_count; + + if (copy_to_user((void __user *) (unsigned long) + cmd.response, + &resp, + sizeof resp)) + ret = -EFAULT; + put_qp_read(qp); + goto out_raw_qp; + } user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL); if (!user_wr) return -ENOMEM; - qp = idr_read_qp(cmd.qp_handle, file->ucontext); - if (!qp) - goto out; - is_ud = qp->qp_type == IB_QPT_UD; sg_ind = 0; last = NULL; @@ -1576,9 +1593,8 @@ out_put: wr = next; } -out: kfree(user_wr); - +out_raw_qp: return ret ? ret : in_len; } @@ -1680,16 +1696,33 @@ ssize_t ib_uverbs_post_recv(struct ib_uverbs_file *file, if (copy_from_user(&cmd, buf, sizeof cmd)) return -EFAULT; + qp = idr_read_qp(cmd.qp_handle, file->ucontext); + if (!qp) + goto out_raw_qp; + + if (file->ucontext->use_shpage_for_rxtx) { + resp.bad_wr = 0; + /* pass NULL pointers as the information about */ + /* buffers is passed using endor defined shared page */ + ret = qp->device->post_recv(qp, NULL, NULL); + if (ret) + resp.bad_wr = cmd.wr_count; + + if (copy_to_user((void __user *) (unsigned long) + cmd.response, + &resp, + sizeof resp)) + ret = -EFAULT; + put_qp_read(qp); + goto out_raw_qp; + } + wr = ib_uverbs_unmarshall_recv(buf + sizeof cmd, in_len - sizeof cmd, cmd.wr_count, cmd.sge_count, cmd.wqe_size); if (IS_ERR(wr)) return PTR_ERR(wr); - qp = idr_read_qp(cmd.qp_handle, file->ucontext); - if (!qp) - goto out; - resp.bad_wr = 0; ret = qp->device->post_recv(qp, wr, &bad_wr); @@ -1706,13 +1739,13 @@ ssize_t ib_uverbs_post_recv(struct ib_uverbs_file *file, &resp, sizeof resp)) ret = -EFAULT; -out: while (wr) { next = wr->next; kfree(wr); wr = next; } +out_raw_qp: return ret ? ret : in_len; } diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 55cd0a0..ab31c03 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -831,6 +831,7 @@ struct ib_ucontext { struct list_head srq_list; struct list_head ah_list; int closing; + int use_shpage_for_rxtx; }; struct ib_uobject {