* Re: [PATCH V2 08/10] i40iw: Control debug error prints using env variable
From: Leon Romanovsky @ 2016-12-10 14:34 UTC (permalink / raw)
To: Tatyana Nikolova
Cc: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/,
dledford-H+wXaHxf7aLQT0dZR+AlfA,
linux-rdma-u79uwXL29TY76Z2rM5mHXA,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <1481306104-19352-9-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 12313 bytes --]
On Fri, Dec 09, 2016 at 11:55:02AM -0600, Tatyana Nikolova wrote:
> From: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> Debug prints for error paths are off by default. User
> has the option to turn them on by setting environment
> variable I40IW_DEBUG in command line.
>
> Signed-off-by: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Hi Tatyana,
This patch duplicates already existing code in most of providers and
libraries in rdma-core, while two of our main goals for creating this
consolidated library were simplification for users and reduce code duplication.
It will be very beneficial if you:
1. Use and promote general pr_debug(..), srp_tools has nice piece of code, to be general code.
2. Create one and general place for all rdma-core's environment variables.
This infrastructure will allow us in the future create better manual of
all variables supported and ensure easy change if neeeded.
Thanks
> ---
> providers/i40iw/i40iw_umain.c | 11 ++++++---
> providers/i40iw/i40iw_umain.h | 7 ++++++
> providers/i40iw/i40iw_uverbs.c | 52 +++++++++++++++++++++++-------------------
> 3 files changed, 44 insertions(+), 26 deletions(-)
>
> diff --git a/providers/i40iw/i40iw_umain.c b/providers/i40iw/i40iw_umain.c
> index 1756e65..a204859 100644
> --- a/providers/i40iw/i40iw_umain.c
> +++ b/providers/i40iw/i40iw_umain.c
> @@ -46,7 +46,7 @@
> #include "i40iw_umain.h"
> #include "i40iw-abi.h"
>
> -unsigned int i40iw_debug_level;
> +unsigned int i40iw_dbg;
>
> #include <sys/types.h>
> #include <sys/stat.h>
> @@ -184,7 +184,7 @@ static struct ibv_context *i40iw_ualloc_context(struct ibv_device *ibdev, int cm
> return &iwvctx->ibv_ctx;
>
> err_free:
> - fprintf(stderr, PFX "%s: failed to allocate context for device.\n", __func__);
> + i40iw_debug("failed to allocate context for device.\n");
> free(iwvctx);
>
> return NULL;
> @@ -216,6 +216,7 @@ static struct ibv_device_ops i40iw_udev_ops = {
> struct ibv_device *i40iw_driver_init(const char *uverbs_sys_path, int abi_version)
> {
> char value[16];
> + char *env_val;
> struct i40iw_udevice *dev;
> unsigned int vendor, device;
> int i;
> @@ -236,9 +237,13 @@ struct ibv_device *i40iw_driver_init(const char *uverbs_sys_path, int abi_versio
>
> return NULL;
> found:
> + env_val = getenv("I40IW_DEBUG");
> + if (env_val)
> + i40iw_dbg = atoi(env_val);
> +
> dev = malloc(sizeof(*dev));
> if (!dev) {
> - fprintf(stderr, PFX "%s: failed to allocate memory for device object\n", __func__);
> + i40iw_debug("failed to allocate memory for device object\n");
> return NULL;
> }
>
> diff --git a/providers/i40iw/i40iw_umain.h b/providers/i40iw/i40iw_umain.h
> index 13d3da8..889c006 100644
> --- a/providers/i40iw/i40iw_umain.h
> +++ b/providers/i40iw/i40iw_umain.h
> @@ -72,6 +72,13 @@
> #define I40E_DB_SHADOW_AREA_SIZE 64
> #define I40E_DB_CQ_OFFSET 0x40
>
> +extern unsigned int i40iw_dbg;
> +#define i40iw_debug(fmt, args...) \
> +do { \
> + if (i40iw_dbg) \
> + fprintf(stderr, PFX "%s: " fmt, __FUNCTION__, ##args); \
> +} while (0)
> +
> enum i40iw_uhca_type {
> INTEL_i40iw
> };
> diff --git a/providers/i40iw/i40iw_uverbs.c b/providers/i40iw/i40iw_uverbs.c
> index f6d9196..464900b 100644
> --- a/providers/i40iw/i40iw_uverbs.c
> +++ b/providers/i40iw/i40iw_uverbs.c
> @@ -65,7 +65,7 @@ int i40iw_uquery_device(struct ibv_context *context, struct ibv_device_attr *att
>
> ret = ibv_cmd_query_device(context, attr, &i40iw_fw_ver, &cmd, sizeof(cmd));
> if (ret) {
> - fprintf(stderr, PFX "%s: query device failed and returned status code: %d\n", __func__, ret);
> + i40iw_debug("query device failed and returned status code: %d\n", ret);
> return ret;
> }
>
> @@ -165,7 +165,7 @@ struct ibv_mr *i40iw_ureg_mr(struct ibv_pd *pd, void *addr, size_t length, int a
> if (ibv_cmd_reg_mr(pd, addr, length, (uintptr_t)addr,
> access, mr, &cmd.ibv_cmd, sizeof(cmd),
> &resp, sizeof(resp))) {
> - fprintf(stderr, PFX "%s: Failed to register memory\n", __func__);
> + i40iw_debug("Failed to register memory\n");
> free(mr);
> return NULL;
> }
> @@ -264,7 +264,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
> &iwucq->mr, ®_mr_cmd.ibv_cmd, sizeof(reg_mr_cmd), ®_mr_resp,
> sizeof(reg_mr_resp));
> if (ret) {
> - fprintf(stderr, PFX "%s: failed to pin memory for CQ\n", __func__);
> + i40iw_debug("failed to pin memory for CQ\n");
> goto err;
> }
>
> @@ -274,7 +274,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
> &resp.ibv_resp, sizeof(resp));
> if (ret) {
> ibv_cmd_dereg_mr(&iwucq->mr);
> - fprintf(stderr, PFX "%s: failed to create CQ\n", __func__);
> + i40iw_debug("failed to create CQ\n");
> goto err;
> }
>
> @@ -286,7 +286,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
> if (!ret)
> return &iwucq->ibv_cq;
> else
> - fprintf(stderr, PFX "%s: failed to initialze CQ, status %d\n", __func__, ret);
> + i40iw_debug("failed to initialze CQ, status %d\n", ret);
> err:
> if (info.cq_base)
> free(info.cq_base);
> @@ -307,11 +307,11 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
>
> ret = pthread_spin_destroy(&iwucq->lock);
> if (ret)
> - return ret;
> + goto err;
>
> ret = ibv_cmd_destroy_cq(cq);
> if (ret)
> - return ret;
> + goto err;
>
> ibv_cmd_dereg_mr(&iwucq->mr);
>
> @@ -319,6 +319,9 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
> free(iwucq);
>
> return 0;
> +err:
> + i40iw_debug("failed to destroy CQ, status %d\n", ret);
> + return ret;
> }
>
> /**
> @@ -344,7 +347,7 @@ int i40iw_upoll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *entry)
> if (ret == I40IW_ERR_QUEUE_EMPTY) {
> break;
> } else if (ret) {
> - fprintf(stderr, PFX "%s: Error polling CQ, status %d\n", __func__, ret);
> + i40iw_debug("Error polling CQ, status %d\n", ret);
> if (!cqe_count)
> /* Indicate error */
> cqe_count = -1;
> @@ -519,7 +522,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
> info->sq = memalign(I40IW_HW_PAGE_SIZE, totalqpsize);
>
> if (!info->sq) {
> - fprintf(stderr, PFX "%s: failed to allocate memory for SQ\n", __func__);
> + i40iw_debug("failed to allocate memory for SQ\n");
> return 0;
> }
>
> @@ -535,7 +538,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
> IBV_ACCESS_LOCAL_WRITE, &iwuqp->mr, ®_mr_cmd.ibv_cmd,
> sizeof(reg_mr_cmd), ®_mr_resp, sizeof(reg_mr_resp));
> if (ret) {
> - fprintf(stderr, PFX "%s: failed to pin memory for SQ\n", __func__);
> + i40iw_debug("failed to pin memory for SQ\n");
> free(info->sq);
> return 0;
> }
> @@ -545,7 +548,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
> ret = ibv_cmd_create_qp(pd, &iwuqp->ibv_qp, attr, &cmd.ibv_cmd, sizeof(cmd),
> &resp->ibv_resp, sizeof(struct i40iw_ucreate_qp_resp));
> if (ret) {
> - fprintf(stderr, PFX "%s: failed to create QP, status %d\n", __func__, ret);
> + i40iw_debug("failed to create QP, status %d\n", ret);
> ibv_cmd_dereg_mr(&iwuqp->mr);
> free(info->sq);
> return 0;
> @@ -565,7 +568,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
> map = mmap(NULL, I40IW_HW_PAGE_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED,
> pd->context->cmd_fd, offset);
> if (map == MAP_FAILED) {
> - fprintf(stderr, PFX "%s: failed to map push page, errno %d\n", __func__, errno);
> + i40iw_debug("failed to map push page, errno %d\n", errno);
> info->push_wqe = NULL;
> info->push_db = NULL;
> } else {
> @@ -575,7 +578,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
> map = mmap(NULL, I40IW_HW_PAGE_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED,
> pd->context->cmd_fd, offset);
> if (map == MAP_FAILED) {
> - fprintf(stderr, PFX "%s: failed to map push doorbell, errno %d\n", __func__, errno);
> + i40iw_debug("failed to map push doorbell, errno %d\n", errno);
> munmap(info->push_wqe, I40IW_HW_PAGE_SIZE);
> info->push_wqe = NULL;
> info->push_db = NULL;
> @@ -639,7 +642,7 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
> int sq_attr, rq_attr;
>
> if (attr->qp_type != IBV_QPT_RC) {
> - fprintf(stderr, PFX "%s: failed to create QP, unsupported QP type: 0x%x\n", __func__, attr->qp_type);
> + i40iw_debug("failed to create QP, unsupported QP type: 0x%x\n", attr->qp_type);
> return NULL;
> }
>
> @@ -658,8 +661,8 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
> /* Sanity check QP size before proceeding */
> sqdepth = i40iw_qp_get_qdepth(sq_attr, attr->cap.max_send_sge, attr->cap.max_inline_data);
> if (!sqdepth) {
> - fprintf(stderr, PFX "%s: invalid SQ attributes, max_send_wr=%d max_send_sge=%d\n",
> - __func__, attr->cap.max_send_wr, attr->cap.max_send_sge);
> + i40iw_debug("invalid SQ attributes, max_send_wr=%d max_send_sge=%d\n",
> + attr->cap.max_send_wr, attr->cap.max_send_sge);
> return NULL;
> }
>
> @@ -691,13 +694,13 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
> info.sq_wrtrk_array = calloc(sqdepth, sizeof(*info.sq_wrtrk_array));
>
> if (!info.sq_wrtrk_array) {
> - fprintf(stderr, PFX "%s: failed to allocate memory for SQ work array\n", __func__);
> + i40iw_debug("failed to allocate memory for SQ work array\n");
> goto err_destroy_lock;
> }
>
> info.rq_wrid_array = calloc(rqdepth, sizeof(*info.rq_wrid_array));
> if (!info.rq_wrid_array) {
> - fprintf(stderr, PFX "%s: failed to allocate memory for RQ work array\n", __func__);
> + i40iw_debug("failed to allocate memory for RQ work array\n");
> goto err_free_sq_wrtrk;
> }
>
> @@ -706,7 +709,7 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
> status = i40iw_vmapped_qp(iwuqp, pd, attr, &resp, sqdepth, rqdepth, &info);
>
> if (!status) {
> - fprintf(stderr, PFX "%s: failed to map QP\n", __func__);
> + i40iw_debug("failed to map QP\n");
> goto err_free_rq_wrid;
> }
> info.qp_id = resp.qp_id;
> @@ -772,11 +775,11 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
>
> ret = pthread_spin_destroy(&iwuqp->lock);
> if (ret)
> - return ret;
> + goto err;
>
> ret = i40iw_destroy_vmapped_qp(iwuqp, iwuqp->qp.sq_base);
> if (ret)
> - return ret;
> + goto err;
>
> if (iwuqp->qp.sq_wrtrk_array)
> free(iwuqp->qp.sq_wrtrk_array);
> @@ -792,6 +795,9 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
> free(iwuqp);
>
> return 0;
> +err:
> + i40iw_debug("failed to destroy QP, status %d\n", ret);
> + return ret;
> }
>
> /**
> @@ -916,7 +922,7 @@ int i40iw_upost_send(struct ibv_qp *ib_qp, struct ibv_send_wr *ib_wr, struct ibv
> default:
> /* error */
> err = -EINVAL;
> - fprintf(stderr, PFX "%s: post work request failed, invalid opcode: 0x%x\n", __func__, ib_wr->opcode);
> + i40iw_debug("post work request failed, invalid opcode: 0x%x\n", ib_wr->opcode);
> break;
> }
>
> @@ -960,7 +966,7 @@ int i40iw_upost_recv(struct ibv_qp *ib_qp, struct ibv_recv_wr *ib_wr, struct ibv
> post_recv.sg_list = sg_list;
> ret = iwuqp->qp.ops.iw_post_receive(&iwuqp->qp, &post_recv);
> if (ret) {
> - fprintf(stderr, PFX "%s: failed to post receives, status %d\n", __func__, ret);
> + i40iw_debug("failed to post receives, status %d\n", ret);
> if (ret == I40IW_ERR_QP_TOOMANY_WRS_POSTED)
> err = -ENOMEM;
> else
> --
> 1.8.5.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH] libcxgb4: set *bad_wr in post_send/recv error paths
From: Leon Romanovsky @ 2016-12-10 14:20 UTC (permalink / raw)
To: Steve Wise
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA,
linux-rdma-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20161206210403.71E59E08C5-/5N3P9jjx0xzbRFIqnYvSA@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 238 bytes --]
On Tue, Dec 06, 2016 at 11:49:32AM -0800, Steve Wise wrote:
> Signed-off-by: Steve Wise <swise-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org>
> ---
> providers/cxgb4/qp.c | 4 ++++
> 1 file changed, 4 insertions(+)
Thanks, applied.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH V2 18/22] bnxt_re: Support for DCB
From: Or Gerlitz @ 2016-12-10 13:50 UTC (permalink / raw)
To: Selvin Xavier
Cc: Doug Ledford, linux-rdma@vger.kernel.org, Linux Netdev List,
Eddie Wai, Devesh Sharma, Somnath Kotur, Sriharsha Basavapatna
In-Reply-To: <1481266096-23331-19-git-send-email-selvin.xavier@broadcom.com>
On Fri, Dec 9, 2016 at 8:48 AM, Selvin Xavier
<selvin.xavier@broadcom.com> wrote:
> This patch queries the configured RoCE APP Priority on the host
> using the dcbnl API and programs the RoCE FW with the corresponding
> Traffic Class(es) for the priority.
> +#define BNXT_RE_ROCE_V1_ETH_TYPE 0x8915
> +#define BNXT_RE_ROCE_V2_PORT_NO 4791
I believe these two are defined already, try # git grep on each under include
^ permalink raw reply
* Re: [PATCH V2 00/22] Broadcom RoCE Driver (bnxt_re)
From: Selvin Xavier @ 2016-12-10 5:36 UTC (permalink / raw)
To: Doug Ledford, linux-rdma-u79uwXL29TY76Z2rM5mHXA
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Selvin Xavier
In-Reply-To: <1481266096-23331-1-git-send-email-selvin.xavier-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
On Fri, Dec 9, 2016 at 12:17 PM, Selvin Xavier
<selvin.xavier-dY08KVG/lbpWk0Htik3J/w@public.gmane.org> wrote:
> I am preparing a git repository with these changes as per Jason's
> comment and will share the details later today.
Please use bnxt_re branch in this git repository.
https://github.com/Broadcom/linux-rdma-nxt.git
Thanks,
Selvin Xavier
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH] net: mlx5: Fix Kconfig help text
From: David Miller @ 2016-12-10 4:09 UTC (permalink / raw)
To: cov-sgV2jX0FEOL9JmXXK+q4OQ
Cc: saeedm-VPRAkNaXOzVWk0Htik3J/w, matanb-VPRAkNaXOzVWk0Htik3J/w,
leonro-VPRAkNaXOzVWk0Htik3J/w, netdev-u79uwXL29TY76Z2rM5mHXA,
linux-rdma-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
In-Reply-To: <20161209215306.721-1-cov-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
From: Christopher Covington <cov-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Date: Fri, 9 Dec 2016 16:53:05 -0500
> Since the following commit, Infiniband and Ethernet have not been
> mutually exclusive.
>
> Fixes: 4aa17b28 mlx5: Enable mutual support for IB and Ethernet
>
> Signed-off-by: Christopher Covington <cov-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Applied.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH V2 03/22] bnxt_re: register with the NIC driver
From: Jonathan Toppins @ 2016-12-10 0:03 UTC (permalink / raw)
To: Selvin Xavier, dledford, linux-rdma
Cc: netdev, Eddie Wai, Devesh Sharma, Somnath Kotur,
Sriharsha Basavapatna
In-Reply-To: <1481266096-23331-4-git-send-email-selvin.xavier@broadcom.com>
On 12/09/2016 01:47 AM, Selvin Xavier wrote:
> This patch handles the registration with bnxt_en driver. The driver registers
> with netdev notifier chain. Upon receiving NETDEV_REGISTER event, the driver
> in turn registers with bnxt_en driver.
> 1. bnxt_en's ulp_probe function returns a structure that contains information
> about the device and additional entry points.
> 2. bnxt_en driver returns 'struct bnxt_eth_dev' that contains set of operation
> vectors that RocE driver invokes later.
> 3. bnxt_request_msix() allows the RoCE driver to specify the number of MSI-X
> vectors that are needed.
> 4. bnxt_send_fw_msg () can be used to send messages to the FW
> 5. bnxt_register_async_events() can be used to register for async event
> callbacks.
>
> v2: Remove some sparse warning. Also, remove some unused code from unreg path.
>
> Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com>
> Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
> Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
> drivers/infiniband/hw/bnxtre/bnxt_re.h | 48 +++
> drivers/infiniband/hw/bnxtre/bnxt_re_main.c | 436 ++++++++++++++++++++++++++++
> 2 files changed, 484 insertions(+)
>
[...]
> #endif
> diff --git a/drivers/infiniband/hw/bnxtre/bnxt_re_main.c b/drivers/infiniband/hw/bnxtre/bnxt_re_main.c
> index ebe1c69..029824a 100644
> --- a/drivers/infiniband/hw/bnxtre/bnxt_re_main.c
> +++ b/drivers/infiniband/hw/bnxtre/bnxt_re_main.c
> +
> +static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
> +{
> + int i, j, rc;
> +
> + /* Registered a new RoCE device instance to netdev */
> + rc = bnxt_re_register_netdev(rdev);
> + if (rc) {
> + pr_err("Failed to register with netedev: %#x\n", rc);
> + return -EINVAL;
> + }
> + set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
> +
> + rc = bnxt_re_request_msix(rdev);
> + if (rc) {
> + pr_err("Failed to get MSI-X vectors: %#x\n", rc);
> + rc = -EINVAL;
> + goto fail;
> + }
> + set_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags);
Though this exit path looks correct (need to verify) once all patches
are applied, this looks incorrect if only considering this specific
patch. I think you need the following:
+ return 0;
> +
> +fail:
> + bnxt_re_ib_unreg(rdev, true);
> + return rc;
> +}
> +
^ permalink raw reply
* Re: [PATCH V2 00/10] i40iw: Fixes and optimizations
From: Jason Gunthorpe @ 2016-12-09 23:45 UTC (permalink / raw)
To: Nikolova, Tatyana E
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
In-Reply-To: <13AA599688F47243B14FCFCCC2C803BB10AC5C2C-96pTJSsuoYQ64kNsxIetb7fspsVTdybXVpNB7YpNyf8@public.gmane.org>
On Fri, Dec 09, 2016 at 11:24:43PM +0000, Nikolova, Tatyana E wrote:
> I followed your recommendation about github PR.
>
> When applying the patches to rdma-core, patch 08/10 V2 failed to
> apply, because it is removing a variable already removed:
>
> -unsigned int i40iw_debug_level
Yes, I noticed that too..
> This issue is fixed in my github branch. Please pull the patches from
> https://github.com/tatyana-en/rdma-core.git
If you click on the 'Create Pull Request' button in the github GUI
on your repository then your patches will show up here:
https://github.com/linux-rdma/rdma-core/pulls
And travisci will run automatically on your series which is one less
step for Leon&Doug.
I also recommend in future to put a series onto branches in your
repository, eg from your local machine do:
git push -f github master:fixes1
Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* RE: [PATCH V2 00/10] i40iw: Fixes and optimizations
From: Nikolova, Tatyana E @ 2016-12-09 23:24 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
In-Reply-To: <20161209183650.GB10830-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
Hi Jason,
I followed your recommendation about github PR.
When applying the patches to rdma-core, patch 08/10 V2 failed to apply, because it is removing a variable already removed:
-unsigned int i40iw_debug_level
This issue is fixed in my github branch. Please pull the patches from
https://github.com/tatyana-en/rdma-core.git
Starting with "i40iw: Optimize setting fragments" - commit 3c642b3f6477d0e4733802d863788d4aa30f55b0
Ending with " i40iw: Remove SQ size constraint" - commit 1ccbcd4e3c6630a43e9adc0fcc4e9659cd721440
Thank you,
Tatyana
-----Original Message-----
From: Jason Gunthorpe [mailto:jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org]
Sent: Friday, December 09, 2016 12:37 PM
To: Nikolova, Tatyana E <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org; leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org; linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH V2 00/10] i40iw: Fixes and optimizations
On Fri, Dec 09, 2016 at 06:33:30PM +0000, Nikolova, Tatyana E wrote:
> I am sorry I missed to specify rdma-core in the patch description for
> the V2 series. All ten patches in the series are rdma-core V2
> patches.
Indeed, you may also wish to consider doing a github PR for this big series. I'm generally encouraging the providers maintainers to do this as it reduces the workload on Leon :)
I have no other comments on the series..
Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH] net: mlx5: Fix Kconfig help text
From: Christopher Covington @ 2016-12-09 21:53 UTC (permalink / raw)
To: Saeed Mahameed, Matan Barak, Leon Romanovsky,
netdev-u79uwXL29TY76Z2rM5mHXA, linux-rdma-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
Christopher Covington
Since the following commit, Infiniband and Ethernet have not been
mutually exclusive.
Fixes: 4aa17b28 mlx5: Enable mutual support for IB and Ethernet
Signed-off-by: Christopher Covington <cov-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
---
drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index aae4688..521cfdb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -18,8 +18,6 @@ config MLX5_CORE_EN
default n
---help---
Ethernet support in Mellanox Technologies ConnectX-4 NIC.
- Ethernet and Infiniband support in ConnectX-4 are currently mutually
- exclusive.
config MLX5_CORE_EN_DCB
bool "Data Center Bridging (DCB) Support"
--
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora
Forum, a Linux Foundation Collaborative Project.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [GIT PULL] Please pull NFSoRDMA client side changes for 4.10
From: Anna Schumaker @ 2016-12-09 21:01 UTC (permalink / raw)
To: Trond Myklebust; +Cc: Linux NFS Mailing List, linux-rdma-u79uwXL29TY76Z2rM5mHXA
Hi Trond,
The following changes since commit e5517c2a5a49ed5e99047008629f1cd60246ea0e:
Linux 4.9-rc7 (2016-11-27 13:08:04 -0800)
are available in the git repository at:
git://git.linux-nfs.org/projects/anna/nfs-rdma.git tags/nfs-rdma-4.10-1
for you to fetch changes up to 3a72dc771cc38e4d6e441a86256a3d7788a84c01:
xprtrdma: Relocate connection helper functions (2016-11-29 16:45:44 -0500)
----------------------------------------------------------------
New Features:
- Support for SG_GAP devices
Bugfixes and cleanups:
- Cap size of callback buffer resources
- Improve send queue and RPC metric accounting
- Fix coverity warning
- Avoid calls to ro_unmap_safe()
- Refactor FRMR invalidation
- Error message improvements
Thanks,
Anna
----------------------------------------------------------------
Chuck Lever (12):
xprtrdma: Cap size of callback buffer resources
xprtrdma: Make FRWR send queue entry accounting more accurate
xprtrdma: Support for SG_GAP devices
SUNRPC: Proper metric accounting when RPC is not transmitted
xprtrdma: Address coverity complaint about wait_for_completion()
xprtrdma: Avoid calls to ro_unmap_safe()
xprtrdma: Refactor FRMR invalidation
xprtrdma: Update documenting comment
xprtrdma: Squelch "max send, max recv" messages at connect time
xprtrdma: Shorten QP access error message
xprtrdma: Update dprintk in rpcrdma_count_chunks
xprtrdma: Relocate connection helper functions
net/sunrpc/stats.c | 10 ++++++----
net/sunrpc/xprtrdma/backchannel.c | 4 +++-
net/sunrpc/xprtrdma/frwr_ops.c | 94 ++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------
net/sunrpc/xprtrdma/rpc_rdma.c | 36 +-----------------------------------
net/sunrpc/xprtrdma/transport.c | 34 ++++++++++++++++++++++++++++++++--
net/sunrpc/xprtrdma/verbs.c | 37 ++++++++++++++++++++-----------------
net/sunrpc/xprtrdma/xprt_rdma.h | 31 ++++++++++++++++++++++---------
7 files changed, 128 insertions(+), 118 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 3/5] Move dma_ops from archdata into struct device
From: Bart Van Assche @ 2016-12-09 19:46 UTC (permalink / raw)
To: David Woodhouse, Christoph Hellwig
Cc: linux-arch, Sagi Grimberg, linux-rdma@vger.kernel.org,
linux-kernel, virtualization, Doug Ledford
In-Reply-To: <1481310814.98151.11.camel@infradead.org>
On 12/09/2016 11:13 AM, David Woodhouse wrote:
> On Fri, 2016-12-09 at 19:22 +0100, Christoph Hellwig wrote:
>> We'll need a bit of a wieder audience for this I think..
>>
>> On Wed, Dec 07, 2016 at 05:11:28PM -0800, Bart Van Assche wrote:
>>> Additionally, introduce set_dma_ops(). A later patch will introduce a
>>> call to that function in the RDMA drivers that will be modified to use
>>> dma_noop_ops.
>>
>> This looks good to me, and we had a lot of talk about this for other
>> purposes for a while.
>
> Hm, I'm not convinced we want per-device dma_ops. What we want is per-
> device IOMMU ops, and any dma_ops are just a generic or platform-
> specific (in some cases) wrapper around those. We shouldn't normally
> need per-device DMA ops at all.
Hello David,
Can you recommend an approach for e.g. the qib driver
(drivers/infiniband/hw/qib)? That driver uses the CPU (PIO) instead of
DMA to transfer data to a PCIe device. Sorry but I don't see how
per-device IOMMU ops would allow to avoid that e.g. a cache flush is
triggered before PIO starts.
Bart.
^ permalink raw reply
* Re: [PATCH 3/5] Move dma_ops from archdata into struct device
From: David Woodhouse @ 2016-12-09 19:13 UTC (permalink / raw)
To: Christoph Hellwig, Bart Van Assche
Cc: Doug Ledford, Sagi Grimberg, linux-rdma@vger.kernel.org,
virtualization, linux-arch, linux-kernel
In-Reply-To: <20161209182230.GC16622@lst.de>
[-- Attachment #1: Type: text/plain, Size: 721 bytes --]
On Fri, 2016-12-09 at 19:22 +0100, Christoph Hellwig wrote:
> We'll need a bit of a wieder audience for this I think..
>
> On Wed, Dec 07, 2016 at 05:11:28PM -0800, Bart Van Assche wrote:
> > Additionally, introduce set_dma_ops(). A later patch will introduce a
> > call to that function in the RDMA drivers that will be modified to use
> > dma_noop_ops.
>
> This looks good to me, and we had a lot of talk about this for other
> purposes for a while.
Hm, I'm not convinced we want per-device dma_ops. What we want is per-
device IOMMU ops, and any dma_ops are just a generic or platform-
specific (in some cases) wrapper around those. We shouldn't normally
need per-device DMA ops at all.
--
dwmw2
[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5760 bytes --]
^ permalink raw reply
* [PATCH] IB/srpt: Accept GUIDs as port names
From: Bart Van Assche @ 2016-12-09 19:00 UTC (permalink / raw)
To: Doug Ledford
Cc: Christoph Hellwig, Nicholas A. Bellinger,
linux-rdma@vger.kernel.org, target-devel
Port and ACL information must be configured before an initiator
logs in. Make it possible to configure this information before
a subnet prefix has been assigned to a port by not only accepting
GIDs as target port and initiator port names but by also accepting
port GUIDs.
Add a 'priv' member to struct se_wwn to allow target drivers to
associate their own data with struct se_wwn.
Reported-by: Doug Ledford <dledford@redhat.com>
References: http://www.spinics.net/lists/linux-rdma/msg39505.html
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Nicholas Bellinger <nab@linux-iscsi.org>
---
drivers/infiniband/ulp/srpt/ib_srpt.c | 139 ++++++++++++++++++++--------------
drivers/infiniband/ulp/srpt/ib_srpt.h | 18 +++--
drivers/target/target_core_tpg.c | 1 +
include/target/target_core_base.h | 1 +
4 files changed, 98 insertions(+), 61 deletions(-)
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index b6b9a6401a2d..0474004ebad2 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -500,6 +500,7 @@ static int srpt_refresh_port(struct srpt_port *sport)
struct ib_mad_reg_req reg_req;
struct ib_port_modify port_modify;
struct ib_port_attr port_attr;
+ __be16 *guid;
int ret;
memset(&port_modify, 0, sizeof(port_modify));
@@ -522,10 +523,17 @@ static int srpt_refresh_port(struct srpt_port *sport)
if (ret)
goto err_query_port;
+ sport->port_guid_wwn.priv = sport;
+ guid = (__be16 *)&sport->gid.global.interface_id;
snprintf(sport->port_guid, sizeof(sport->port_guid),
- "0x%016llx%016llx",
- be64_to_cpu(sport->gid.global.subnet_prefix),
- be64_to_cpu(sport->gid.global.interface_id));
+ "%04x:%04x:%04x:%04x",
+ be16_to_cpu(guid[0]), be16_to_cpu(guid[1]),
+ be16_to_cpu(guid[2]), be16_to_cpu(guid[3]));
+ sport->port_gid_wwn.priv = sport;
+ snprintf(sport->port_gid, sizeof(sport->port_gid),
+ "0x%016llx%016llx",
+ be64_to_cpu(sport->gid.global.subnet_prefix),
+ be64_to_cpu(sport->gid.global.interface_id));
if (!sport->mad_agent) {
memset(®_req, 0, sizeof(reg_req));
@@ -1840,6 +1848,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
struct srp_login_rej *rej;
struct ib_cm_rep_param *rep_param;
struct srpt_rdma_ch *ch, *tmp_ch;
+ __be16 *guid;
u32 it_iu_len;
int i, ret = 0;
@@ -1985,26 +1994,30 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
goto destroy_ib;
}
- /*
- * Use the initator port identifier as the session name, when
- * checking against se_node_acl->initiatorname[] this can be
- * with or without preceeding '0x'.
- */
+ guid = (__be16 *)¶m->primary_path->sgid.global.interface_id;
+ snprintf(ch->ini_guid, sizeof(ch->ini_guid), "%04x:%04x:%04x:%04x",
+ be16_to_cpu(guid[0]), be16_to_cpu(guid[1]),
+ be16_to_cpu(guid[2]), be16_to_cpu(guid[3]));
snprintf(ch->sess_name, sizeof(ch->sess_name), "0x%016llx%016llx",
be64_to_cpu(*(__be64 *)ch->i_port_id),
be64_to_cpu(*(__be64 *)(ch->i_port_id + 8)));
pr_debug("registering session %s\n", ch->sess_name);
- ch->sess = target_alloc_session(&sport->port_tpg_1, 0, 0,
+ if (sport->port_guid_tpg.se_tpg_wwn)
+ ch->sess = target_alloc_session(&sport->port_guid_tpg, 0, 0,
+ TARGET_PROT_NORMAL,
+ ch->ini_guid, ch, NULL);
+ if (sport->port_gid_tpg.se_tpg_wwn && IS_ERR_OR_NULL(ch->sess))
+ ch->sess = target_alloc_session(&sport->port_gid_tpg, 0, 0,
TARGET_PROT_NORMAL, ch->sess_name, ch,
NULL);
/* Retry without leading "0x" */
- if (IS_ERR(ch->sess))
- ch->sess = target_alloc_session(&sport->port_tpg_1, 0, 0,
+ if (sport->port_gid_tpg.se_tpg_wwn && IS_ERR_OR_NULL(ch->sess))
+ ch->sess = target_alloc_session(&sport->port_gid_tpg, 0, 0,
TARGET_PROT_NORMAL,
ch->sess_name + 2, ch, NULL);
- if (IS_ERR(ch->sess)) {
+ if (IS_ERR_OR_NULL(ch->sess)) {
pr_info("Rejected login because no ACL has been configured yet for initiator %s.\n",
ch->sess_name);
rej->reason = cpu_to_be32((PTR_ERR(ch->sess) == -ENOMEM) ?
@@ -2422,7 +2435,7 @@ static int srpt_release_sdev(struct srpt_device *sdev)
return 0;
}
-static struct srpt_port *__srpt_lookup_port(const char *name)
+static struct se_wwn *__srpt_lookup_wwn(const char *name)
{
struct ib_device *dev;
struct srpt_device *sdev;
@@ -2437,23 +2450,25 @@ static struct srpt_port *__srpt_lookup_port(const char *name)
for (i = 0; i < dev->phys_port_cnt; i++) {
sport = &sdev->port[i];
- if (!strcmp(sport->port_guid, name))
- return sport;
+ if (strcmp(sport->port_guid, name) == 0)
+ return &sport->port_guid_wwn;
+ if (strcmp(sport->port_gid, name) == 0)
+ return &sport->port_gid_wwn;
}
}
return NULL;
}
-static struct srpt_port *srpt_lookup_port(const char *name)
+static struct se_wwn *srpt_lookup_wwn(const char *name)
{
- struct srpt_port *sport;
+ struct se_wwn *wwn;
spin_lock(&srpt_dev_lock);
- sport = __srpt_lookup_port(name);
+ wwn = __srpt_lookup_wwn(name);
spin_unlock(&srpt_dev_lock);
- return sport;
+ return wwn;
}
/**
@@ -2645,11 +2660,19 @@ static char *srpt_get_fabric_name(void)
return "srpt";
}
+static struct srpt_port *srpt_tpg_to_sport(struct se_portal_group *tpg)
+{
+ return tpg->se_tpg_wwn->priv;
+}
+
static char *srpt_get_fabric_wwn(struct se_portal_group *tpg)
{
- struct srpt_port *sport = container_of(tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(tpg);
- return sport->port_guid;
+ WARN_ON_ONCE(tpg != &sport->port_guid_tpg &&
+ tpg != &sport->port_gid_tpg);
+ return tpg == &sport->port_guid_tpg ? sport->port_guid :
+ sport->port_gid;
}
static u16 srpt_get_tag(struct se_portal_group *tpg)
@@ -2739,6 +2762,19 @@ static int srpt_get_tcm_cmd_state(struct se_cmd *se_cmd)
return srpt_get_cmd_state(ioctx);
}
+static int srpt_parse_guid(u64 *guid, const char *name)
+{
+ u16 w[4];
+ int ret = -EINVAL;
+
+ if (sscanf(name, "%hx:%hx:%hx:%hx", &w[0], &w[1], &w[2], &w[3]) != 4)
+ goto out;
+ *guid = get_unaligned_be64(w);
+ ret = 0;
+out:
+ return ret;
+}
+
/**
* srpt_parse_i_port_id() - Parse an initiator port ID.
* @name: ASCII representation of a 128-bit initiator port ID.
@@ -2773,20 +2809,23 @@ static int srpt_parse_i_port_id(u8 i_port_id[16], const char *name)
*/
static int srpt_init_nodeacl(struct se_node_acl *se_nacl, const char *name)
{
+ u64 guid;
u8 i_port_id[16];
+ int ret;
- if (srpt_parse_i_port_id(i_port_id, name) < 0) {
+ ret = srpt_parse_guid(&guid, name);
+ if (ret < 0)
+ ret = srpt_parse_i_port_id(i_port_id, name);
+ if (ret < 0)
pr_err("invalid initiator port ID %s\n", name);
- return -EINVAL;
- }
- return 0;
+ return ret;
}
static ssize_t srpt_tpg_attrib_srp_max_rdma_size_show(struct config_item *item,
char *page)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
return sprintf(page, "%u\n", sport->port_attrib.srp_max_rdma_size);
}
@@ -2795,7 +2834,7 @@ static ssize_t srpt_tpg_attrib_srp_max_rdma_size_store(struct config_item *item,
const char *page, size_t count)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
unsigned long val;
int ret;
@@ -2823,7 +2862,7 @@ static ssize_t srpt_tpg_attrib_srp_max_rsp_size_show(struct config_item *item,
char *page)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
return sprintf(page, "%u\n", sport->port_attrib.srp_max_rsp_size);
}
@@ -2832,7 +2871,7 @@ static ssize_t srpt_tpg_attrib_srp_max_rsp_size_store(struct config_item *item,
const char *page, size_t count)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
unsigned long val;
int ret;
@@ -2860,7 +2899,7 @@ static ssize_t srpt_tpg_attrib_srp_sq_size_show(struct config_item *item,
char *page)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
return sprintf(page, "%u\n", sport->port_attrib.srp_sq_size);
}
@@ -2869,7 +2908,7 @@ static ssize_t srpt_tpg_attrib_srp_sq_size_store(struct config_item *item,
const char *page, size_t count)
{
struct se_portal_group *se_tpg = attrib_to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
unsigned long val;
int ret;
@@ -2907,7 +2946,7 @@ static struct configfs_attribute *srpt_tpg_attrib_attrs[] = {
static ssize_t srpt_tpg_enable_show(struct config_item *item, char *page)
{
struct se_portal_group *se_tpg = to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
return snprintf(page, PAGE_SIZE, "%d\n", (sport->enabled) ? 1: 0);
}
@@ -2916,7 +2955,7 @@ static ssize_t srpt_tpg_enable_store(struct config_item *item,
const char *page, size_t count)
{
struct se_portal_group *se_tpg = to_tpg(item);
- struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
struct srpt_device *sdev = sport->sdev;
struct srpt_rdma_ch *ch;
unsigned long tmp;
@@ -2968,15 +3007,19 @@ static struct se_portal_group *srpt_make_tpg(struct se_wwn *wwn,
struct config_group *group,
const char *name)
{
- struct srpt_port *sport = container_of(wwn, struct srpt_port, port_wwn);
+ struct srpt_port *sport = wwn->priv;
+ static struct se_portal_group *tpg;
int res;
- /* Initialize sport->port_wwn and sport->port_tpg_1 */
- res = core_tpg_register(&sport->port_wwn, &sport->port_tpg_1, SCSI_PROTOCOL_SRP);
+ WARN_ON_ONCE(wwn != &sport->port_guid_wwn &&
+ wwn != &sport->port_gid_wwn);
+ tpg = wwn == &sport->port_guid_wwn ? &sport->port_guid_tpg :
+ &sport->port_gid_tpg;
+ res = core_tpg_register(wwn, tpg, SCSI_PROTOCOL_SRP);
if (res)
return ERR_PTR(res);
- return &sport->port_tpg_1;
+ return tpg;
}
/**
@@ -2985,11 +3028,10 @@ static struct se_portal_group *srpt_make_tpg(struct se_wwn *wwn,
*/
static void srpt_drop_tpg(struct se_portal_group *tpg)
{
- struct srpt_port *sport = container_of(tpg,
- struct srpt_port, port_tpg_1);
+ struct srpt_port *sport = srpt_tpg_to_sport(tpg);
sport->enabled = false;
- core_tpg_deregister(&sport->port_tpg_1);
+ core_tpg_deregister(tpg);
}
/**
@@ -3000,19 +3042,7 @@ static struct se_wwn *srpt_make_tport(struct target_fabric_configfs *tf,
struct config_group *group,
const char *name)
{
- struct srpt_port *sport;
- int ret;
-
- sport = srpt_lookup_port(name);
- pr_debug("make_tport(%s)\n", name);
- ret = -EINVAL;
- if (!sport)
- goto err;
-
- return &sport->port_wwn;
-
-err:
- return ERR_PTR(ret);
+ return srpt_lookup_wwn(name) ? : ERR_PTR(-EINVAL);
}
/**
@@ -3021,9 +3051,6 @@ static struct se_wwn *srpt_make_tport(struct target_fabric_configfs *tf,
*/
static void srpt_drop_tport(struct se_wwn *wwn)
{
- struct srpt_port *sport = container_of(wwn, struct srpt_port, port_wwn);
-
- pr_debug("drop_tport(%s\n", config_item_name(&sport->port_wwn.wwn_group.cg_item));
}
static ssize_t srpt_wwn_version_show(struct config_item *item, char *buf)
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h
index 581878782854..cc1183851af5 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.h
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.h
@@ -258,6 +258,7 @@ enum rdma_ch_state {
* against concurrent modification by the cm_id spinlock.
* @sess: Session information associated with this SRP channel.
* @sess_name: Session name.
+ * @ini_guid: Initiator port GUID.
* @release_work: Allows scheduling of srpt_release_channel().
* @release_done: Enables waiting for srpt_release_channel() completion.
*/
@@ -284,6 +285,7 @@ struct srpt_rdma_ch {
struct list_head cmd_wait_list;
struct se_session *sess;
u8 sess_name[36];
+ u8 ini_guid[24];
struct work_struct release_work;
struct completion *release_done;
};
@@ -306,28 +308,34 @@ struct srpt_port_attrib {
* @mad_agent: per-port management datagram processing information.
* @enabled: Whether or not this target port is enabled.
* @port_guid: ASCII representation of Port GUID
+ * @port_gid: ASCII representation of Port GID
* @port: one-based port number.
* @sm_lid: cached value of the port's sm_lid.
* @lid: cached value of the port's lid.
* @gid: cached value of the port's gid.
* @port_acl_lock spinlock for port_acl_list:
* @work: work structure for refreshing the aforementioned cached values.
- * @port_tpg_1 Target portal group = 1 data.
- * @port_wwn: Target core WWN data.
+ * @port_guid_tpg: TPG associated with target port GUID.
+ * @port_guid_wwn: WWN associated with target port GUID.
+ * @port_gid_tpg: TPG associated with target port GID.
+ * @port_gid_wwn: WWN associated with target port GID.
* @port_acl_list: Head of the list with all node ACLs for this port.
*/
struct srpt_port {
struct srpt_device *sdev;
struct ib_mad_agent *mad_agent;
bool enabled;
- u8 port_guid[64];
+ u8 port_guid[24];
+ u8 port_gid[64];
u8 port;
u16 sm_lid;
u16 lid;
union ib_gid gid;
struct work_struct work;
- struct se_portal_group port_tpg_1;
- struct se_wwn port_wwn;
+ struct se_portal_group port_guid_tpg;
+ struct se_wwn port_guid_wwn;
+ struct se_portal_group port_gid_tpg;
+ struct se_wwn port_gid_wwn;
struct srpt_port_attrib port_attrib;
};
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index d99752c6cd60..4a8b180c478b 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -448,6 +448,7 @@ static void core_tpg_lun_ref_release(struct percpu_ref *ref)
complete(&lun->lun_ref_comp);
}
+/* Does not change se_wwn->priv. */
int core_tpg_register(
struct se_wwn *se_wwn,
struct se_portal_group *se_tpg,
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index ca8ec7218f39..22c37987d937 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -909,6 +909,7 @@ static inline struct se_portal_group *param_to_tpg(struct config_item *item)
struct se_wwn {
struct target_fabric_configfs *wwn_tf;
+ void *priv;
struct config_group wwn_group;
struct config_group fabric_stat_group;
};
--
2.11.0
^ permalink raw reply related
* Re: [PATCH V2 00/10] i40iw: Fixes and optimizations
From: Jason Gunthorpe @ 2016-12-09 18:36 UTC (permalink / raw)
To: Nikolova, Tatyana E
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
In-Reply-To: <13AA599688F47243B14FCFCCC2C803BB10AC5AA2-96pTJSsuoYQ64kNsxIetb7fspsVTdybXVpNB7YpNyf8@public.gmane.org>
On Fri, Dec 09, 2016 at 06:33:30PM +0000, Nikolova, Tatyana E wrote:
> I am sorry I missed to specify rdma-core in the patch description
> for the V2 series. All ten patches in the series are rdma-core V2
> patches.
Indeed, you may also wish to consider doing a github PR for this big
series. I'm generally encouraging the providers maintainers to do this
as it reduces the workload on Leon :)
I have no other comments on the series..
Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* RE: [PATCH V2 00/10] i40iw: Fixes and optimizations
From: Nikolova, Tatyana E @ 2016-12-09 18:33 UTC (permalink / raw)
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org,
dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
In-Reply-To: <1481306104-19352-1-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Hi,
I am sorry I missed to specify rdma-core in the patch description for the V2 series.
All ten patches in the series are rdma-core V2 patches.
Thank you,
Tatyana
-----Original Message-----
From: linux-rdma-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org [mailto:linux-rdma-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org] On Behalf Of Tatyana Nikolova
Sent: Friday, December 09, 2016 11:55 AM
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org; dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org; leonro-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: [PATCH V2 00/10] i40iw: Fixes and optimizations
The patch series includes fixes, optimizations and clean up to the user space i40iw.
V2 Changes:
Use do/while(0) in i40iw_debug macro.
Mustafa Ismail (4):
i40iw: Optimize setting fragments
i40iw: Remove unnecessary parameter
i40iw: Optimize inline data copy
i40iw: Remove unnecessary check for moving CQ head
Shiraz Saleem (6):
i40iw: Fix incorrect assignment of SQ head
i40iw: Return correct error codes for destroy QP and CQ
i40iw: Do not destroy QP/CQ if lock is held
i40iw: Control debug error prints using env variable
i40iw: Use 2M huge pages for CQ/QP memory if available
i40iw: Remove SQ size constraint
providers/i40iw/i40iw_d.h | 6 +-
providers/i40iw/i40iw_uk.c | 62 ++++++++------------
providers/i40iw/i40iw_umain.c | 21 ++++++- providers/i40iw/i40iw_umain.h | 11 ++++
providers/i40iw/i40iw_user.h | 2 +-
providers/i40iw/i40iw_uverbs.c | 128 ++++++++++++++++++++++++++++++-----------
6 files changed, 153 insertions(+), 77 deletions(-)
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org 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 majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 4/5] IB: Switch from struct ib_dma_mapping_ops to struct dma_mapping_ops
From: Christoph Hellwig @ 2016-12-09 18:24 UTC (permalink / raw)
To: Bart Van Assche
Cc: Doug Ledford, Christoph Hellwig, Sagi Grimberg,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <25d066c2-59d7-2be7-dd56-e29e99b43620-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
> Additionally, use dma_noop_ops instead of duplicating it.
Oops, I don't think that part actually is correct. Both rdmavt
and the weird intel drivers want the _virtual_ address in their dma
address instead of the physical one set by dma_noop_ops.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 5/5] treewide: Inline ib_dma_map_*() functions
From: Christoph Hellwig @ 2016-12-09 18:23 UTC (permalink / raw)
To: Bart Van Assche
Cc: Doug Ledford, Christoph Hellwig, Sagi Grimberg,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <9bdf696e-ec64-d60e-3d7e-7ad5b3000d60-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
Ah, there we go:
Reviewed-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 4/5] IB: Switch from struct ib_dma_mapping_ops to struct dma_mapping_ops
From: Christoph Hellwig @ 2016-12-09 18:23 UTC (permalink / raw)
To: Bart Van Assche
Cc: Doug Ledford, Christoph Hellwig, Sagi Grimberg,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <25d066c2-59d7-2be7-dd56-e29e99b43620-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
Looks fine:
Reviewed-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
Even better with a follow up patch to kill the ib_* wrappers..
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 3/5] Move dma_ops from archdata into struct device
From: Christoph Hellwig @ 2016-12-09 18:22 UTC (permalink / raw)
To: Bart Van Assche
Cc: linux-arch, Sagi Grimberg, linux-rdma@vger.kernel.org,
linux-kernel, virtualization, Doug Ledford, David Woodhouse,
Christoph Hellwig
In-Reply-To: <58a325aa-8df7-6a2e-fadb-5d9031d8a1a0@sandisk.com>
We'll need a bit of a wieder audience for this I think..
On Wed, Dec 07, 2016 at 05:11:28PM -0800, Bart Van Assche wrote:
> Additionally, introduce set_dma_ops(). A later patch will introduce a
> call to that function in the RDMA drivers that will be modified to use
> dma_noop_ops.
This looks good to me, and we had a lot of talk about this for other
purposes for a while.
^ permalink raw reply
* Re: [PATCH 2/5] misc: vop: Remove a cast
From: Christoph Hellwig @ 2016-12-09 18:20 UTC (permalink / raw)
To: Bart Van Assche
Cc: Doug Ledford, Christoph Hellwig, Sagi Grimberg,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <6fff2450-6442-4539-47ff-67f04a593c06-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
Looks fine,
Reviewed-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 1/5] treewide: constify most struct dma_map_ops
From: Christoph Hellwig @ 2016-12-09 18:20 UTC (permalink / raw)
To: Bart Van Assche
Cc: Doug Ledford, Christoph Hellwig, Sagi Grimberg,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
In-Reply-To: <f6b70724-772c-c17f-f1be-1681fab31228-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
Looks fine,
Reviewed-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH 10/10] i40iw: Remove SQ size constraint
From: Tatyana Nikolova @ 2016-12-09 17:55 UTC (permalink / raw)
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/,
dledford-H+wXaHxf7aLQT0dZR+AlfA, leonro-VPRAkNaXOzVWk0Htik3J/w
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <1481306104-19352-1-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
From: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Pre-production firmware does not invalidate RQ PBL indexes
if the RQ base is not cache aligned. Remove the workaround
which constraints SQ depth to be a multiple of 1024.
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Signed-off-by: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
providers/i40iw/i40iw_d.h | 3 ---
providers/i40iw/i40iw_uverbs.c | 2 --
2 files changed, 5 deletions(-)
diff --git a/providers/i40iw/i40iw_d.h b/providers/i40iw/i40iw_d.h
index 1906cbf..174115c 100644
--- a/providers/i40iw/i40iw_d.h
+++ b/providers/i40iw/i40iw_d.h
@@ -1318,9 +1318,6 @@
/* wqe size considering 32 bytes per wqe*/
#define I40IWQP_SW_MIN_WQSIZE 4 /* 128 bytes */
#define I40IWQP_SW_MAX_WQSIZE 2048 /* 2048 bytes */
-
-#define I40IWQP_SW_WQSIZE_1024 1024
-
#define I40IWQP_OP_RDMA_WRITE 0
#define I40IWQP_OP_RDMA_READ 1
#define I40IWQP_OP_RDMA_SEND 3
diff --git a/providers/i40iw/i40iw_uverbs.c b/providers/i40iw/i40iw_uverbs.c
index 85ed77c..75b7cb0 100644
--- a/providers/i40iw/i40iw_uverbs.c
+++ b/providers/i40iw/i40iw_uverbs.c
@@ -537,8 +537,6 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
struct ibv_reg_mr_resp reg_mr_resp;
memset(®_mr_cmd, 0, sizeof(reg_mr_cmd));
- if ((sqdepth % I40IWQP_SW_WQSIZE_1024))
- sqdepth = sqdepth + I40IWQP_SW_WQSIZE_1024 - (sqdepth % I40IWQP_SW_WQSIZE_1024);
sqsize = sqdepth * I40IW_QP_WQE_MIN_SIZE;
rqsize = rqdepth * I40IW_QP_WQE_MIN_SIZE;
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH 09/10] i40iw: Use 2M huge pages for CQ/QP memory if available
From: Tatyana Nikolova @ 2016-12-09 17:55 UTC (permalink / raw)
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/,
dledford-H+wXaHxf7aLQT0dZR+AlfA, leonro-VPRAkNaXOzVWk0Htik3J/w
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <1481306104-19352-1-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
From: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Attempt to allocate a 2M huge page from the pool
for QP/CQ memory if its size is > 4K and < 2M.
This will lead to physically contiguous QP/CQ memory
and avoid the use of PBLs. The total number of 2M huge
pages available for this feature is controlled by a user
environment variable, I40IW_MAX_HUGEPGCNT, with an upper
limit of 100, and 0 if invalid values are used.
Signed-off-by: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
providers/i40iw/i40iw_umain.c | 10 +++++++++
providers/i40iw/i40iw_umain.h | 4 ++++
providers/i40iw/i40iw_uverbs.c | 46 ++++++++++++++++++++++++++++++++++++++++--
3 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/providers/i40iw/i40iw_umain.c b/providers/i40iw/i40iw_umain.c
index a204859..b2e6236 100644
--- a/providers/i40iw/i40iw_umain.c
+++ b/providers/i40iw/i40iw_umain.c
@@ -47,6 +47,7 @@
#include "i40iw-abi.h"
unsigned int i40iw_dbg;
+unsigned int i40iw_max_hugepgcnt;
#include <sys/types.h>
#include <sys/stat.h>
@@ -241,6 +242,15 @@ found:
if (env_val)
i40iw_dbg = atoi(env_val);
+ env_val = getenv("I40IW_MAX_HUGEPGCNT");
+ if (env_val) {
+ if ((atoi(env_val) < 0) || (atoi(env_val) > 100))
+ fprintf(stderr, PFX "%s: Valid range for Max Huge Page Count is 0 to 100. Setting to 0\n",
+ __func__);
+ else
+ i40iw_max_hugepgcnt = atoi(env_val);
+ }
+
dev = malloc(sizeof(*dev));
if (!dev) {
i40iw_debug("failed to allocate memory for device object\n");
diff --git a/providers/i40iw/i40iw_umain.h b/providers/i40iw/i40iw_umain.h
index 889c006..7bcd197 100644
--- a/providers/i40iw/i40iw_umain.h
+++ b/providers/i40iw/i40iw_umain.h
@@ -72,6 +72,8 @@
#define I40E_DB_SHADOW_AREA_SIZE 64
#define I40E_DB_CQ_OFFSET 0x40
+#define I40IW_HPAGE_SIZE_2M (2 * 1024 * 1024)
+
extern unsigned int i40iw_dbg;
#define i40iw_debug(fmt, args...) \
do { \
@@ -120,6 +122,7 @@ struct i40iw_ucq {
int comp_vector;
struct i40iw_uqp *udqp;
struct i40iw_cq_uk cq;
+ bool is_hugetlb;
};
struct i40iw_uqp {
@@ -138,6 +141,7 @@ struct i40iw_uqp {
uint32_t wq_size;
struct ibv_recv_wr *pend_rx_wr;
struct i40iw_qp_uk qp;
+ bool is_hugetlb;
};
diff --git a/providers/i40iw/i40iw_uverbs.c b/providers/i40iw/i40iw_uverbs.c
index 464900b..85ed77c 100644
--- a/providers/i40iw/i40iw_uverbs.c
+++ b/providers/i40iw/i40iw_uverbs.c
@@ -51,6 +51,9 @@
#include "i40iw_umain.h"
#include "i40iw-abi.h"
+unsigned int i40iw_hugepgcnt;
+extern unsigned int i40iw_max_hugepgcnt;
+
/**
* i40iw_uquery_device - call driver to query device for max resources
* @context: user context for the device
@@ -248,11 +251,24 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
cq_pages = i40iw_num_of_pages(info.cq_size * cqe_struct_size);
totalsize = (cq_pages << 12) + I40E_DB_SHADOW_AREA_SIZE;
+ if ((totalsize > I40IW_HW_PAGE_SIZE) && (totalsize <= I40IW_HPAGE_SIZE_2M)) {
+ if (i40iw_hugepgcnt < i40iw_max_hugepgcnt) {
+ info.cq_base = mmap(NULL, I40IW_HPAGE_SIZE_2M, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, 0, 0);
+ if (info.cq_base != MAP_FAILED) {
+ iwucq->is_hugetlb = true;
+ i40iw_hugepgcnt++;
+ goto cqmem_alloc_done;
+ }
+ }
+ }
+
info.cq_base = memalign(I40IW_HW_PAGE_SIZE, totalsize);
if (!info.cq_base)
goto err;
+cqmem_alloc_done:
memset(info.cq_base, 0, totalsize);
info.shadow_area = (u64 *)((u8 *)info.cq_base + (cq_pages << 12));
reg_mr_cmd.reg_type = I40IW_UMEMREG_TYPE_CQ;
@@ -315,7 +331,13 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
ibv_cmd_dereg_mr(&iwucq->mr);
- free(iwucq->cq.cq_base);
+ if (iwucq->is_hugetlb) {
+ munmap(iwucq->cq.cq_base, I40IW_HPAGE_SIZE_2M);
+ i40iw_hugepgcnt--;
+ } else {
+ free(iwucq->cq.cq_base);
+ }
+
free(iwucq);
return 0;
@@ -481,7 +503,13 @@ static int i40iw_destroy_vmapped_qp(struct i40iw_uqp *iwuqp,
munmap(iwuqp->push_wqe, I40IW_HW_PAGE_SIZE);
ibv_cmd_dereg_mr(&iwuqp->mr);
- free((void *)sq_base);
+
+ if (iwuqp->is_hugetlb) {
+ munmap((void *)sq_base, I40IW_HPAGE_SIZE_2M);
+ i40iw_hugepgcnt--;
+ } else {
+ free((void *)sq_base);
+ }
return 0;
}
@@ -519,6 +547,19 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
sqsize = sq_pages << 12;
rqsize = rq_pages << 12;
totalqpsize = rqsize + sqsize + I40E_DB_SHADOW_AREA_SIZE;
+
+ if ((totalqpsize > I40IW_HW_PAGE_SIZE) && (totalqpsize <= I40IW_HPAGE_SIZE_2M)) {
+ if (i40iw_hugepgcnt < i40iw_max_hugepgcnt) {
+ info->sq = mmap(NULL, I40IW_HPAGE_SIZE_2M, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, 0, 0);
+ if (info->sq != MAP_FAILED) {
+ iwuqp->is_hugetlb = true;
+ i40iw_hugepgcnt++;
+ goto qpmem_alloc_done;
+ }
+ }
+ }
+
info->sq = memalign(I40IW_HW_PAGE_SIZE, totalqpsize);
if (!info->sq) {
@@ -526,6 +567,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
return 0;
}
+qpmem_alloc_done:
memset(info->sq, 0, totalqpsize);
info->rq = &info->sq[sqsize / I40IW_QP_WQE_MIN_SIZE];
info->shadow_area = info->rq[rqsize / I40IW_QP_WQE_MIN_SIZE].elem;
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH V2 08/10] i40iw: Control debug error prints using env variable
From: Tatyana Nikolova @ 2016-12-09 17:55 UTC (permalink / raw)
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/,
dledford-H+wXaHxf7aLQT0dZR+AlfA, leonro-VPRAkNaXOzVWk0Htik3J/w
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <1481306104-19352-1-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
From: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Debug prints for error paths are off by default. User
has the option to turn them on by setting environment
variable I40IW_DEBUG in command line.
Signed-off-by: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
providers/i40iw/i40iw_umain.c | 11 ++++++---
providers/i40iw/i40iw_umain.h | 7 ++++++
providers/i40iw/i40iw_uverbs.c | 52 +++++++++++++++++++++++-------------------
3 files changed, 44 insertions(+), 26 deletions(-)
diff --git a/providers/i40iw/i40iw_umain.c b/providers/i40iw/i40iw_umain.c
index 1756e65..a204859 100644
--- a/providers/i40iw/i40iw_umain.c
+++ b/providers/i40iw/i40iw_umain.c
@@ -46,7 +46,7 @@
#include "i40iw_umain.h"
#include "i40iw-abi.h"
-unsigned int i40iw_debug_level;
+unsigned int i40iw_dbg;
#include <sys/types.h>
#include <sys/stat.h>
@@ -184,7 +184,7 @@ static struct ibv_context *i40iw_ualloc_context(struct ibv_device *ibdev, int cm
return &iwvctx->ibv_ctx;
err_free:
- fprintf(stderr, PFX "%s: failed to allocate context for device.\n", __func__);
+ i40iw_debug("failed to allocate context for device.\n");
free(iwvctx);
return NULL;
@@ -216,6 +216,7 @@ static struct ibv_device_ops i40iw_udev_ops = {
struct ibv_device *i40iw_driver_init(const char *uverbs_sys_path, int abi_version)
{
char value[16];
+ char *env_val;
struct i40iw_udevice *dev;
unsigned int vendor, device;
int i;
@@ -236,9 +237,13 @@ struct ibv_device *i40iw_driver_init(const char *uverbs_sys_path, int abi_versio
return NULL;
found:
+ env_val = getenv("I40IW_DEBUG");
+ if (env_val)
+ i40iw_dbg = atoi(env_val);
+
dev = malloc(sizeof(*dev));
if (!dev) {
- fprintf(stderr, PFX "%s: failed to allocate memory for device object\n", __func__);
+ i40iw_debug("failed to allocate memory for device object\n");
return NULL;
}
diff --git a/providers/i40iw/i40iw_umain.h b/providers/i40iw/i40iw_umain.h
index 13d3da8..889c006 100644
--- a/providers/i40iw/i40iw_umain.h
+++ b/providers/i40iw/i40iw_umain.h
@@ -72,6 +72,13 @@
#define I40E_DB_SHADOW_AREA_SIZE 64
#define I40E_DB_CQ_OFFSET 0x40
+extern unsigned int i40iw_dbg;
+#define i40iw_debug(fmt, args...) \
+do { \
+ if (i40iw_dbg) \
+ fprintf(stderr, PFX "%s: " fmt, __FUNCTION__, ##args); \
+} while (0)
+
enum i40iw_uhca_type {
INTEL_i40iw
};
diff --git a/providers/i40iw/i40iw_uverbs.c b/providers/i40iw/i40iw_uverbs.c
index f6d9196..464900b 100644
--- a/providers/i40iw/i40iw_uverbs.c
+++ b/providers/i40iw/i40iw_uverbs.c
@@ -65,7 +65,7 @@ int i40iw_uquery_device(struct ibv_context *context, struct ibv_device_attr *att
ret = ibv_cmd_query_device(context, attr, &i40iw_fw_ver, &cmd, sizeof(cmd));
if (ret) {
- fprintf(stderr, PFX "%s: query device failed and returned status code: %d\n", __func__, ret);
+ i40iw_debug("query device failed and returned status code: %d\n", ret);
return ret;
}
@@ -165,7 +165,7 @@ struct ibv_mr *i40iw_ureg_mr(struct ibv_pd *pd, void *addr, size_t length, int a
if (ibv_cmd_reg_mr(pd, addr, length, (uintptr_t)addr,
access, mr, &cmd.ibv_cmd, sizeof(cmd),
&resp, sizeof(resp))) {
- fprintf(stderr, PFX "%s: Failed to register memory\n", __func__);
+ i40iw_debug("Failed to register memory\n");
free(mr);
return NULL;
}
@@ -264,7 +264,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
&iwucq->mr, ®_mr_cmd.ibv_cmd, sizeof(reg_mr_cmd), ®_mr_resp,
sizeof(reg_mr_resp));
if (ret) {
- fprintf(stderr, PFX "%s: failed to pin memory for CQ\n", __func__);
+ i40iw_debug("failed to pin memory for CQ\n");
goto err;
}
@@ -274,7 +274,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
&resp.ibv_resp, sizeof(resp));
if (ret) {
ibv_cmd_dereg_mr(&iwucq->mr);
- fprintf(stderr, PFX "%s: failed to create CQ\n", __func__);
+ i40iw_debug("failed to create CQ\n");
goto err;
}
@@ -286,7 +286,7 @@ struct ibv_cq *i40iw_ucreate_cq(struct ibv_context *context, int cqe,
if (!ret)
return &iwucq->ibv_cq;
else
- fprintf(stderr, PFX "%s: failed to initialze CQ, status %d\n", __func__, ret);
+ i40iw_debug("failed to initialze CQ, status %d\n", ret);
err:
if (info.cq_base)
free(info.cq_base);
@@ -307,11 +307,11 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
ret = pthread_spin_destroy(&iwucq->lock);
if (ret)
- return ret;
+ goto err;
ret = ibv_cmd_destroy_cq(cq);
if (ret)
- return ret;
+ goto err;
ibv_cmd_dereg_mr(&iwucq->mr);
@@ -319,6 +319,9 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
free(iwucq);
return 0;
+err:
+ i40iw_debug("failed to destroy CQ, status %d\n", ret);
+ return ret;
}
/**
@@ -344,7 +347,7 @@ int i40iw_upoll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *entry)
if (ret == I40IW_ERR_QUEUE_EMPTY) {
break;
} else if (ret) {
- fprintf(stderr, PFX "%s: Error polling CQ, status %d\n", __func__, ret);
+ i40iw_debug("Error polling CQ, status %d\n", ret);
if (!cqe_count)
/* Indicate error */
cqe_count = -1;
@@ -519,7 +522,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
info->sq = memalign(I40IW_HW_PAGE_SIZE, totalqpsize);
if (!info->sq) {
- fprintf(stderr, PFX "%s: failed to allocate memory for SQ\n", __func__);
+ i40iw_debug("failed to allocate memory for SQ\n");
return 0;
}
@@ -535,7 +538,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
IBV_ACCESS_LOCAL_WRITE, &iwuqp->mr, ®_mr_cmd.ibv_cmd,
sizeof(reg_mr_cmd), ®_mr_resp, sizeof(reg_mr_resp));
if (ret) {
- fprintf(stderr, PFX "%s: failed to pin memory for SQ\n", __func__);
+ i40iw_debug("failed to pin memory for SQ\n");
free(info->sq);
return 0;
}
@@ -545,7 +548,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
ret = ibv_cmd_create_qp(pd, &iwuqp->ibv_qp, attr, &cmd.ibv_cmd, sizeof(cmd),
&resp->ibv_resp, sizeof(struct i40iw_ucreate_qp_resp));
if (ret) {
- fprintf(stderr, PFX "%s: failed to create QP, status %d\n", __func__, ret);
+ i40iw_debug("failed to create QP, status %d\n", ret);
ibv_cmd_dereg_mr(&iwuqp->mr);
free(info->sq);
return 0;
@@ -565,7 +568,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
map = mmap(NULL, I40IW_HW_PAGE_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED,
pd->context->cmd_fd, offset);
if (map == MAP_FAILED) {
- fprintf(stderr, PFX "%s: failed to map push page, errno %d\n", __func__, errno);
+ i40iw_debug("failed to map push page, errno %d\n", errno);
info->push_wqe = NULL;
info->push_db = NULL;
} else {
@@ -575,7 +578,7 @@ static int i40iw_vmapped_qp(struct i40iw_uqp *iwuqp, struct ibv_pd *pd,
map = mmap(NULL, I40IW_HW_PAGE_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED,
pd->context->cmd_fd, offset);
if (map == MAP_FAILED) {
- fprintf(stderr, PFX "%s: failed to map push doorbell, errno %d\n", __func__, errno);
+ i40iw_debug("failed to map push doorbell, errno %d\n", errno);
munmap(info->push_wqe, I40IW_HW_PAGE_SIZE);
info->push_wqe = NULL;
info->push_db = NULL;
@@ -639,7 +642,7 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
int sq_attr, rq_attr;
if (attr->qp_type != IBV_QPT_RC) {
- fprintf(stderr, PFX "%s: failed to create QP, unsupported QP type: 0x%x\n", __func__, attr->qp_type);
+ i40iw_debug("failed to create QP, unsupported QP type: 0x%x\n", attr->qp_type);
return NULL;
}
@@ -658,8 +661,8 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
/* Sanity check QP size before proceeding */
sqdepth = i40iw_qp_get_qdepth(sq_attr, attr->cap.max_send_sge, attr->cap.max_inline_data);
if (!sqdepth) {
- fprintf(stderr, PFX "%s: invalid SQ attributes, max_send_wr=%d max_send_sge=%d\n",
- __func__, attr->cap.max_send_wr, attr->cap.max_send_sge);
+ i40iw_debug("invalid SQ attributes, max_send_wr=%d max_send_sge=%d\n",
+ attr->cap.max_send_wr, attr->cap.max_send_sge);
return NULL;
}
@@ -691,13 +694,13 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
info.sq_wrtrk_array = calloc(sqdepth, sizeof(*info.sq_wrtrk_array));
if (!info.sq_wrtrk_array) {
- fprintf(stderr, PFX "%s: failed to allocate memory for SQ work array\n", __func__);
+ i40iw_debug("failed to allocate memory for SQ work array\n");
goto err_destroy_lock;
}
info.rq_wrid_array = calloc(rqdepth, sizeof(*info.rq_wrid_array));
if (!info.rq_wrid_array) {
- fprintf(stderr, PFX "%s: failed to allocate memory for RQ work array\n", __func__);
+ i40iw_debug("failed to allocate memory for RQ work array\n");
goto err_free_sq_wrtrk;
}
@@ -706,7 +709,7 @@ struct ibv_qp *i40iw_ucreate_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr
status = i40iw_vmapped_qp(iwuqp, pd, attr, &resp, sqdepth, rqdepth, &info);
if (!status) {
- fprintf(stderr, PFX "%s: failed to map QP\n", __func__);
+ i40iw_debug("failed to map QP\n");
goto err_free_rq_wrid;
}
info.qp_id = resp.qp_id;
@@ -772,11 +775,11 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
ret = pthread_spin_destroy(&iwuqp->lock);
if (ret)
- return ret;
+ goto err;
ret = i40iw_destroy_vmapped_qp(iwuqp, iwuqp->qp.sq_base);
if (ret)
- return ret;
+ goto err;
if (iwuqp->qp.sq_wrtrk_array)
free(iwuqp->qp.sq_wrtrk_array);
@@ -792,6 +795,9 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
free(iwuqp);
return 0;
+err:
+ i40iw_debug("failed to destroy QP, status %d\n", ret);
+ return ret;
}
/**
@@ -916,7 +922,7 @@ int i40iw_upost_send(struct ibv_qp *ib_qp, struct ibv_send_wr *ib_wr, struct ibv
default:
/* error */
err = -EINVAL;
- fprintf(stderr, PFX "%s: post work request failed, invalid opcode: 0x%x\n", __func__, ib_wr->opcode);
+ i40iw_debug("post work request failed, invalid opcode: 0x%x\n", ib_wr->opcode);
break;
}
@@ -960,7 +966,7 @@ int i40iw_upost_recv(struct ibv_qp *ib_qp, struct ibv_recv_wr *ib_wr, struct ibv
post_recv.sg_list = sg_list;
ret = iwuqp->qp.ops.iw_post_receive(&iwuqp->qp, &post_recv);
if (ret) {
- fprintf(stderr, PFX "%s: failed to post receives, status %d\n", __func__, ret);
+ i40iw_debug("failed to post receives, status %d\n", ret);
if (ret == I40IW_ERR_QP_TOOMANY_WRS_POSTED)
err = -ENOMEM;
else
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH V2 07/10] i40iw: Do not destroy QP/CQ if lock is held
From: Tatyana Nikolova @ 2016-12-09 17:55 UTC (permalink / raw)
To: jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/,
dledford-H+wXaHxf7aLQT0dZR+AlfA, leonro-VPRAkNaXOzVWk0Htik3J/w
Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA,
e1000-rdma-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
In-Reply-To: <1481306104-19352-1-git-send-email-tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
From: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Destroy the QP/CQ if their lock can be destroyed first.
Signed-off-by: Shiraz Saleem <shiraz.saleem-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
providers/i40iw/i40iw_uverbs.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/providers/i40iw/i40iw_uverbs.c b/providers/i40iw/i40iw_uverbs.c
index ef381ed..f6d9196 100644
--- a/providers/i40iw/i40iw_uverbs.c
+++ b/providers/i40iw/i40iw_uverbs.c
@@ -305,6 +305,10 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
struct i40iw_ucq *iwucq = to_i40iw_ucq(cq);
int ret;
+ ret = pthread_spin_destroy(&iwucq->lock);
+ if (ret)
+ return ret;
+
ret = ibv_cmd_destroy_cq(cq);
if (ret)
return ret;
@@ -312,9 +316,6 @@ int i40iw_udestroy_cq(struct ibv_cq *cq)
ibv_cmd_dereg_mr(&iwucq->mr);
free(iwucq->cq.cq_base);
- ret = pthread_spin_destroy(&iwucq->lock);
- if (ret)
- return ret;
free(iwucq);
return 0;
@@ -769,6 +770,10 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
struct i40iw_uqp *iwuqp = to_i40iw_uqp(qp);
int ret;
+ ret = pthread_spin_destroy(&iwuqp->lock);
+ if (ret)
+ return ret;
+
ret = i40iw_destroy_vmapped_qp(iwuqp, iwuqp->qp.sq_base);
if (ret)
return ret;
@@ -784,10 +789,9 @@ int i40iw_udestroy_qp(struct ibv_qp *qp)
if ((iwuqp->recv_cq) && (iwuqp->recv_cq != iwuqp->send_cq))
i40iw_clean_cq((void *)&iwuqp->qp, &iwuqp->recv_cq->cq);
- ret = pthread_spin_destroy(&iwuqp->lock);
free(iwuqp);
- return ret;
+ return 0;
}
/**
--
1.8.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox