From: Leon Romanovsky <leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Dennis Dalessandro
<dennis.dalessandro-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Michael J. Ruhl"
<michael.j.ruhl-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Mike Marciniszyn
<mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH 15/15] IB/hfi1: Clean up on context initialization failure
Date: Wed, 3 May 2017 10:35:48 +0300 [thread overview]
Message-ID: <20170503073548.GC22833@mtr-leonro.local> (raw)
In-Reply-To: <20170503004229.6965.97776.stgit-9QXIwq+3FY+1XWohqUldA0EOCMrvLtNR@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 18588 bytes --]
On Tue, May 02, 2017 at 05:42:30PM -0700, Dennis Dalessandro wrote:
> From: Michael J. Ruhl <michael.j.ruhl-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> The error path for context initialization is not consistent. Cleanup all
> resources on failure.
>
> Removed unused variable user_event_mask.
>
> Add the _BASE_FAILED bit to the event flags so that a base context can
> notify waiting sub contexts that they cannot continue.
>
> Running out of sub contexts is an EBUSY result, not EINVAL.
>
> Reviewed-by: Mike Marciniszyn <mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Michael J. Ruhl <michael.j.ruhl-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Dennis Dalessandro <dennis.dalessandro-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
> drivers/infiniband/hw/hfi1/file_ops.c | 114 +++++++++++------------------
> drivers/infiniband/hw/hfi1/hfi.h | 16 ++--
> drivers/infiniband/hw/hfi1/init.c | 10 +--
> drivers/infiniband/hw/hfi1/user_exp_rcv.c | 28 ++++---
> drivers/infiniband/hw/hfi1/user_sdma.c | 60 +++++++--------
> drivers/infiniband/hw/hfi1/vnic_main.c | 8 +-
> 6 files changed, 103 insertions(+), 133 deletions(-)
>
> diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
> index 84e6342..0ea842d 100644
> --- a/drivers/infiniband/hw/hfi1/file_ops.c
> +++ b/drivers/infiniband/hw/hfi1/file_ops.c
> @@ -82,7 +82,7 @@
> static int init_subctxts(struct hfi1_ctxtdata *uctxt,
> const struct hfi1_user_info *uinfo);
> static int init_user_ctxt(struct hfi1_filedata *fd);
> -static int user_init(struct hfi1_ctxtdata *uctxt);
> +static void user_init(struct hfi1_ctxtdata *uctxt);
> static int get_ctxt_info(struct hfi1_filedata *fd, void __user *ubase,
> __u32 len);
> static int get_base_info(struct hfi1_filedata *fd, void __user *ubase,
> @@ -847,7 +847,7 @@ static u64 kvirt_to_phys(void *addr)
>
> static int assign_ctxt(struct hfi1_filedata *fd, struct hfi1_user_info *uinfo)
> {
> - int ret = 0;
> + int ret;
> unsigned int swmajor, swminor;
>
> swmajor = uinfo->userversion >> 16;
> @@ -857,14 +857,16 @@ static int assign_ctxt(struct hfi1_filedata *fd, struct hfi1_user_info *uinfo)
> swminor = uinfo->userversion & 0xffff;
>
> mutex_lock(&hfi1_mutex);
> - /* First, lets check if we need to get a sub context? */
> + /*
> + * Get a sub context if necessary.
> + * ret < 0 error, 0 no context, 1 sub-context found
> + */
> + ret = 0;
> if (uinfo->subctxt_cnt) {
> - /* < 0 error, 0 no context, 1 sub-context found */
> ret = find_sub_ctxt(fd, uinfo);
> - if (ret > 0) {
> + if (ret > 0)
> fd->rec_cpu_num =
> hfi1_get_proc_affinity(fd->uctxt->numa_id);
> - }
> }
>
> /*
> @@ -885,17 +887,27 @@ static int assign_ctxt(struct hfi1_filedata *fd, struct hfi1_user_info *uinfo)
> ret = wait_event_interruptible(fd->uctxt->wait, !test_bit(
> HFI1_CTXT_BASE_UNINIT,
> &fd->uctxt->event_flags));
> + if (test_bit(HFI1_CTXT_BASE_FAILED, &fd->uctxt->event_flags)) {
> + clear_bit(fd->subctxt, fd->uctxt->in_use_ctxts);
> + return -ENOMEM;
> + }
> /* The only thing a sub context needs is the user_xxx stuff */
> if (!ret)
> - init_user_ctxt(fd);
> + ret = init_user_ctxt(fd);
> +
> + if (ret)
> + clear_bit(fd->subctxt, fd->uctxt->in_use_ctxts);
> } else if (!ret) {
> ret = setup_base_ctxt(fd);
> -
> - /*
> - * Base context is done, notify anybody using a sub-context
> - * that is waiting for this completion
> - */
> - if (!ret && fd->uctxt->subctxt_cnt) {
> + if (fd->uctxt->subctxt_cnt) {
> + /* If there is an error, set the failed bit. */
> + if (ret)
> + set_bit(HFI1_CTXT_BASE_FAILED,
> + &fd->uctxt->event_flags);
> + /*
> + * Base context is done, notify anybody using a
> + * sub-context that is waiting for this completion
> + */
> clear_bit(HFI1_CTXT_BASE_UNINIT,
> &fd->uctxt->event_flags);
> wake_up(&fd->uctxt->wait);
> @@ -916,7 +928,7 @@ static int find_sub_ctxt(struct hfi1_filedata *fd,
> struct hfi1_devdata *dd = fd->dd;
> u16 subctxt;
>
> - for (i = dd->first_user_ctxt; i < dd->num_rcv_contexts; i++) {
> + for (i = dd->first_dyn_alloc_ctxt; i < dd->num_rcv_contexts; i++) {
> struct hfi1_ctxtdata *uctxt = dd->rcd[i];
>
> /* Skip ctxts which are not yet open */
> @@ -925,6 +937,10 @@ static int find_sub_ctxt(struct hfi1_filedata *fd,
> HFI1_MAX_SHARED_CTXTS))
> continue;
>
> + /* Skip dynamically allocated kernel contexts */
> + if (uctxt->sc && (uctxt->sc->type == SC_KERNEL))
> + continue;
> +
> /* Skip ctxt if it doesn't match the requested one */
> if (memcmp(uctxt->uuid, uinfo->uuid,
> sizeof(uctxt->uuid)) ||
> @@ -932,55 +948,17 @@ static int find_sub_ctxt(struct hfi1_filedata *fd,
> uctxt->subctxt_id != uinfo->subctxt_id ||
> uctxt->subctxt_cnt != uinfo->subctxt_cnt)
> continue;
> -<<<<<<< HEAD
> - for (i = dd->first_dyn_alloc_ctxt;
> - i < dd->num_rcv_contexts; i++) {
> - struct hfi1_ctxtdata *uctxt = dd->rcd[i];
> -
> - /* Skip ctxts which are not yet open */
> - if (!uctxt || !uctxt->cnt)
> - continue;
> -
> - /* Skip dynamically allocted kernel contexts */
> - if (uctxt->sc && (uctxt->sc->type == SC_KERNEL))
> - continue;
> -
> - /* Skip ctxt if it doesn't match the requested one */
> - if (memcmp(uctxt->uuid, uinfo->uuid,
> - sizeof(uctxt->uuid)) ||
> - uctxt->jkey != generate_jkey(current_uid()) ||
> - uctxt->subctxt_id != uinfo->subctxt_id ||
> - uctxt->subctxt_cnt != uinfo->subctxt_cnt)
> - continue;
> -
> - /* Verify the sharing process matches the master */
> - if (uctxt->userversion != uinfo->userversion ||
> - uctxt->cnt >= uctxt->subctxt_cnt) {
> - ret = -EINVAL;
> - goto done;
> - }
> - fd->uctxt = uctxt;
> - fd->subctxt = uctxt->cnt++;
> - uctxt->active_slaves |= 1 << fd->subctxt;
> - ret = 1;
> - goto done;
> -=======
>
> /* Verify the sharing process matches the master */
> if (uctxt->userversion != uinfo->userversion)
> return -EINVAL;
> -<<<<<<< HEAD
> ->>>>>>> f1f8a68... IB/hfi1: Search shared contexts on the opened device, not all devices
> - }
> -=======
>
> /* Find an unused context */
> subctxt = find_first_zero_bit(uctxt->in_use_ctxts,
> HFI1_MAX_SHARED_CTXTS);
> if (subctxt >= uctxt->subctxt_cnt)
> - return -EINVAL;
> + return -EBUSY;
>
> ->>>>>>> d409d3d... IB/hfi1: Fix an assign/ordering issue with shared context IDs
Denny,
You forgot to fix the rebase conflict :)
> fd->uctxt = uctxt;
> fd->subctxt = subctxt;
> __set_bit(fd->subctxt, uctxt->in_use_ctxts);
> @@ -1009,10 +987,6 @@ static int allocate_ctxt(struct hfi1_filedata *fd, struct hfi1_devdata *dd,
> return -EIO;
> }
>
> -<<<<<<< HEAD
> - for (ctxt = dd->first_dyn_alloc_ctxt;
> - ctxt < dd->num_rcv_contexts; ctxt++)
> -=======
> /*
> * This check is sort of redundant to the next EBUSY error. It would
> * also indicate an inconsistancy in the driver if this value was
> @@ -1021,8 +995,8 @@ static int allocate_ctxt(struct hfi1_filedata *fd, struct hfi1_devdata *dd,
> if (!dd->freectxts)
> return -EBUSY;
>
> - for (ctxt = dd->first_user_ctxt; ctxt < dd->num_rcv_contexts; ctxt++)
> ->>>>>>> f1f8a68... IB/hfi1: Search shared contexts on the opened device, not all devices
> + for (ctxt = dd->first_dyn_alloc_ctxt;
> + ctxt < dd->num_rcv_contexts; ctxt++)
> if (!dd->rcd[ctxt])
> break;
>
> @@ -1156,7 +1130,7 @@ static int setup_subctxt(struct hfi1_ctxtdata *uctxt)
> return ret;
> }
>
> -static int user_init(struct hfi1_ctxtdata *uctxt)
> +static void user_init(struct hfi1_ctxtdata *uctxt)
> {
> unsigned int rcvctrl_ops = 0;
>
> @@ -1206,8 +1180,6 @@ static int user_init(struct hfi1_ctxtdata *uctxt)
> else
> rcvctrl_ops |= HFI1_RCVCTRL_TAILUPD_DIS;
> hfi1_rcvctrl(uctxt->dd, rcvctrl_ops, uctxt->ctxt);
> -
> - return 0;
> }
>
> static int get_ctxt_info(struct hfi1_filedata *fd, void __user *ubase,
> @@ -1276,28 +1248,32 @@ static int setup_base_ctxt(struct hfi1_filedata *fd)
> /* Now allocate the RcvHdr queue and eager buffers. */
> ret = hfi1_create_rcvhdrq(dd, uctxt);
> if (ret)
> - goto done;
> + return ret;
>
> ret = hfi1_setup_eagerbufs(uctxt);
> if (ret)
> - goto done;
> + goto setup_failed;
>
> /* If sub-contexts are enabled, do the appropriate setup */
> if (uctxt->subctxt_cnt)
> ret = setup_subctxt(uctxt);
> if (ret)
> - goto done;
> + goto setup_failed;
>
> ret = hfi1_user_exp_rcv_grp_init(fd);
> if (ret)
> - goto done;
> + goto setup_failed;
>
> ret = init_user_ctxt(fd);
> if (ret)
> - goto done;
> + goto setup_failed;
>
> - ret = user_init(uctxt);
> -done:
> + user_init(uctxt);
> +
> + return 0;
> +
> +setup_failed:
> + hfi1_free_ctxtdata(dd, uctxt);
> return ret;
> }
>
> diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
> index f3d75fc..509df98 100644
> --- a/drivers/infiniband/hw/hfi1/hfi.h
> +++ b/drivers/infiniband/hw/hfi1/hfi.h
> @@ -196,12 +196,6 @@ struct hfi1_ctxtdata {
> void *rcvhdrq;
> /* kernel virtual address where hdrqtail is updated */
> volatile __le64 *rcvhdrtail_kvaddr;
> - /*
> - * Shared page for kernel to signal user processes that send buffers
> - * need disarming. The process should call HFI1_CMD_DISARM_BUFS
> - * or HFI1_CMD_ACK_EVENT with IPATH_EVENT_DISARM_BUFS set.
> - */
> - unsigned long *user_event_mask;
> /* when waiting for rcv or pioavail */
> wait_queue_head_t wait;
> /* rcvhdrq size (for freeing) */
> @@ -1724,12 +1718,14 @@ struct cc_state *get_cc_state_protected(struct hfi1_pportdata *ppd)
> #define HFI1_PBC_LENGTH_MASK ((1 << 11) - 1)
>
> /* ctxt_flag bit offsets */
> + /* base context has not finished initializing */
> +#define HFI1_CTXT_BASE_UNINIT 1
> + /* base context initaliation failed */
> +#define HFI1_CTXT_BASE_FAILED 2
> /* waiting for a packet to arrive */
> -#define HFI1_CTXT_WAITING_RCV 2
> - /* master has not finished initializing */
> -#define HFI1_CTXT_BASE_UNINIT 4
> +#define HFI1_CTXT_WAITING_RCV 3
> /* waiting for an urgent packet to arrive */
> -#define HFI1_CTXT_WAITING_URG 5
> +#define HFI1_CTXT_WAITING_URG 4
>
> /* free up any allocated data at closes */
> struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
> diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c
> index 694a8ec..4a11d4d 100644
> --- a/drivers/infiniband/hw/hfi1/init.c
> +++ b/drivers/infiniband/hw/hfi1/init.c
> @@ -964,7 +964,6 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
> kfree(rcd->egrbufs.buffers);
>
> sc_free(rcd->sc);
> - vfree(rcd->user_event_mask);
> vfree(rcd->subctxt_uregbase);
> vfree(rcd->subctxt_rcvegrbuf);
> vfree(rcd->subctxt_rcvhdr_base);
> @@ -1683,8 +1682,6 @@ int hfi1_create_rcvhdrq(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
> dd_dev_err(dd,
> "attempt to allocate 1 page for ctxt %u rcvhdrqtailaddr failed\n",
> rcd->ctxt);
> - vfree(rcd->user_event_mask);
> - rcd->user_event_mask = NULL;
> dma_free_coherent(&dd->pcidev->dev, amt, rcd->rcvhdrq,
> rcd->rcvhdrq_dma);
> rcd->rcvhdrq = NULL;
> @@ -1851,7 +1848,7 @@ int hfi1_setup_eagerbufs(struct hfi1_ctxtdata *rcd)
> "ctxt%u: current Eager buffer size is invalid %u\n",
> rcd->ctxt, rcd->egrbufs.rcvtid_size);
> ret = -EINVAL;
> - goto bail;
> + goto bail_rcvegrbuf_phys;
> }
>
> for (idx = 0; idx < rcd->egrbufs.alloced; idx++) {
> @@ -1859,7 +1856,8 @@ int hfi1_setup_eagerbufs(struct hfi1_ctxtdata *rcd)
> rcd->egrbufs.rcvtids[idx].dma, order);
> cond_resched();
> }
> - goto bail;
> +
> + return 0;
>
> bail_rcvegrbuf_phys:
> for (idx = 0; idx < rcd->egrbufs.alloced &&
> @@ -1873,6 +1871,6 @@ int hfi1_setup_eagerbufs(struct hfi1_ctxtdata *rcd)
> rcd->egrbufs.buffers[idx].dma = 0;
> rcd->egrbufs.buffers[idx].len = 0;
> }
> -bail:
> +
> return ret;
> }
> diff --git a/drivers/infiniband/hw/hfi1/user_exp_rcv.c b/drivers/infiniband/hw/hfi1/user_exp_rcv.c
> index bfaf159..0462d9d 100644
> --- a/drivers/infiniband/hw/hfi1/user_exp_rcv.c
> +++ b/drivers/infiniband/hw/hfi1/user_exp_rcv.c
> @@ -160,6 +160,7 @@ int hfi1_user_exp_rcv_grp_init(struct hfi1_filedata *fd)
> struct hfi1_devdata *dd = fd->dd;
> u32 tidbase;
> u32 i;
> + struct tid_group *grp, *gptr;
>
> exp_tid_group_init(&uctxt->tid_group_list);
> exp_tid_group_init(&uctxt->tid_used_list);
> @@ -168,17 +169,10 @@ int hfi1_user_exp_rcv_grp_init(struct hfi1_filedata *fd)
> tidbase = uctxt->expected_base;
> for (i = 0; i < uctxt->expected_count /
> dd->rcv_entries.group_size; i++) {
> - struct tid_group *grp;
> -
> grp = kzalloc(sizeof(*grp), GFP_KERNEL);
> - if (!grp) {
> - /*
> - * If we fail here, the groups already
> - * allocated will be freed by the close
> - * call.
> - */
> - return -ENOMEM;
> - }
> + if (!grp)
> + goto grp_failed;
> +
> grp->size = dd->rcv_entries.group_size;
> grp->base = tidbase;
> tid_group_add_tail(grp, &uctxt->tid_group_list);
> @@ -186,6 +180,15 @@ int hfi1_user_exp_rcv_grp_init(struct hfi1_filedata *fd)
> }
>
> return 0;
> +
> +grp_failed:
> + list_for_each_entry_safe(grp, gptr, &uctxt->tid_group_list.list,
> + list) {
> + list_del_init(&grp->list);
> + kfree(grp);
> + }
> +
> + return -ENOMEM;
> }
>
> /*
> @@ -213,8 +216,11 @@ int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd)
> fd->invalid_tids = kcalloc(uctxt->expected_count,
> sizeof(u32),
> GFP_KERNEL);
> - if (!fd->invalid_tids)
> + if (!fd->invalid_tids) {
> + kfree(fd->entry_to_rb);
> + fd->entry_to_rb = NULL;
> return -ENOMEM;
> + }
>
> /*
> * Register MMU notifier callbacks. If the registration
> diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c
> index 6b72267..e38fa88 100644
> --- a/drivers/infiniband/hw/hfi1/user_sdma.c
> +++ b/drivers/infiniband/hw/hfi1/user_sdma.c
> @@ -374,40 +374,25 @@ static void sdma_kmem_cache_ctor(void *obj)
> int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
> struct hfi1_filedata *fd)
> {
> - int ret = 0;
> + int ret = -ENOMEM;
> + unsigned memsize;
> char buf[64];
> struct hfi1_devdata *dd;
> struct hfi1_user_sdma_comp_q *cq;
> struct hfi1_user_sdma_pkt_q *pq;
> unsigned long flags;
>
> - if (!uctxt || !fd) {
> - ret = -EBADF;
> - goto done;
> - }
> + if (!uctxt || !fd)
> + return -EBADF;
>
> - if (!hfi1_sdma_comp_ring_size) {
> - ret = -EINVAL;
> - goto done;
> - }
> + if (!hfi1_sdma_comp_ring_size)
> + return -EINVAL;
>
> dd = uctxt->dd;
>
> pq = kzalloc(sizeof(*pq), GFP_KERNEL);
> if (!pq)
> - goto pq_nomem;
> -
> - pq->reqs = kcalloc(hfi1_sdma_comp_ring_size,
> - sizeof(*pq->reqs),
> - GFP_KERNEL);
> - if (!pq->reqs)
> - goto pq_reqs_nomem;
> -
> - pq->req_in_use = kcalloc(BITS_TO_LONGS(hfi1_sdma_comp_ring_size),
> - sizeof(*pq->req_in_use),
> - GFP_KERNEL);
> - if (!pq->req_in_use)
> - goto pq_reqs_no_in_use;
> + return -ENOMEM;
>
> INIT_LIST_HEAD(&pq->list);
> pq->dd = dd;
> @@ -423,10 +408,21 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
> iowait_init(&pq->busy, 0, NULL, defer_packet_queue,
> activate_packet_queue, NULL);
> pq->reqidx = 0;
> +
> + memsize = sizeof(*pq->reqs) * hfi1_sdma_comp_ring_size;
> + pq->reqs = kzalloc(memsize, GFP_KERNEL);
> + if (!pq->reqs)
> + goto pq_reqs_nomem;
> +
> + memsize = BITS_TO_LONGS(hfi1_sdma_comp_ring_size) * sizeof(long);
> + pq->req_in_use = kzalloc(memsize, GFP_KERNEL);
> + if (!pq->req_in_use)
> + goto pq_reqs_no_in_use;
> +
> snprintf(buf, 64, "txreq-kmem-cache-%u-%u-%u", dd->unit, uctxt->ctxt,
> fd->subctxt);
> pq->txreq_cache = kmem_cache_create(buf,
> - sizeof(struct user_sdma_txreq),
> + sizeof(struct user_sdma_txreq),
> L1_CACHE_BYTES,
> SLAB_HWCACHE_ALIGN,
> sdma_kmem_cache_ctor);
> @@ -435,7 +431,7 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
> uctxt->ctxt);
> goto pq_txreq_nomem;
> }
> - fd->pq = pq;
> +
> cq = kzalloc(sizeof(*cq), GFP_KERNEL);
> if (!cq)
> goto cq_nomem;
> @@ -446,20 +442,25 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
> goto cq_comps_nomem;
>
> cq->nentries = hfi1_sdma_comp_ring_size;
> - fd->cq = cq;
>
> ret = hfi1_mmu_rb_register(pq, pq->mm, &sdma_rb_ops, dd->pport->hfi1_wq,
> &pq->handler);
> if (ret) {
> dd_dev_err(dd, "Failed to register with MMU %d", ret);
> - goto done;
> + goto pq_mmu_fail;
> }
>
> + fd->pq = pq;
> + fd->cq = cq;
> +
> spin_lock_irqsave(&uctxt->sdma_qlock, flags);
> list_add(&pq->list, &uctxt->sdma_queues);
> spin_unlock_irqrestore(&uctxt->sdma_qlock, flags);
> - goto done;
>
> + return 0;
> +
> +pq_mmu_fail:
> + vfree(cq->comps);
> cq_comps_nomem:
> kfree(cq);
> cq_nomem:
> @@ -470,10 +471,7 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
> kfree(pq->reqs);
> pq_reqs_nomem:
> kfree(pq);
> - fd->pq = NULL;
> -pq_nomem:
> - ret = -ENOMEM;
> -done:
> +
> return ret;
> }
>
> diff --git a/drivers/infiniband/hw/hfi1/vnic_main.c b/drivers/infiniband/hw/hfi1/vnic_main.c
> index 392f4d5..b601c29 100644
> --- a/drivers/infiniband/hw/hfi1/vnic_main.c
> +++ b/drivers/infiniband/hw/hfi1/vnic_main.c
> @@ -67,9 +67,7 @@ static int setup_vnic_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt)
> unsigned int rcvctrl_ops = 0;
> int ret;
>
> - ret = hfi1_init_ctxt(uctxt->sc);
> - if (ret)
> - goto done;
> + hfi1_init_ctxt(uctxt->sc);
>
> uctxt->do_interrupt = &handle_receive_interrupt;
>
> @@ -82,8 +80,6 @@ static int setup_vnic_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt)
> if (ret)
> goto done;
>
> - set_bit(HFI1_CTXT_SETUP_DONE, &uctxt->event_flags);
> -
> if (uctxt->rcvhdrtail_kvaddr)
> clear_rcvhdrtail(uctxt);
>
> @@ -209,7 +205,7 @@ static void deallocate_vnic_ctxt(struct hfi1_devdata *dd,
> uctxt->event_flags = 0;
>
> hfi1_clear_tids(uctxt);
> - hfi1_clear_ctxt_pkey(dd, uctxt->ctxt);
> + hfi1_clear_ctxt_pkey(dd, uctxt);
>
> hfi1_stats.sps_ctxts--;
> hfi1_free_ctxtdata(dd, uctxt);
>
> --
> 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 --]
prev parent reply other threads:[~2017-05-03 7:35 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-03 0:40 [PATCH 00/15] IB/hfi1: hfi1 driver patches for 4.12 Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 06/15] IB/hfi1: Return an error on memory allocation failure Dennis Dalessandro
[not found] ` <20170503003734.6965.67405.stgit-9QXIwq+3FY+1XWohqUldA0EOCMrvLtNR@public.gmane.org>
2017-05-03 0:41 ` [PATCH 01/15] IB/hfi1: Fix checks for Offline transient state Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 02/15] IB/hfi1, IB/rdmavt: Move r_adefered to r_lock cache line Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 03/15] IB/hfi1: Fix yield logic in send engine Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 04/15] IB/hfi1: Get rid of divide when setting the tx request header Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 05/15] IB/hfi1: Adjust default eager_buffer_size to 8MB Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 07/15] IB/hfi1: Fix a subcontext memory leak Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 08/15] IB/hfi1: Name function prototype parameters Dennis Dalessandro
2017-05-03 0:41 ` [PATCH 09/15] IB/hfi1: Use filedata rather than filepointer Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 10/15] IB/hfi1: Remove atomic operations for SDMA_REQ_HAVE_AHG bit Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 11/15] IB/hfi1: Search shared contexts on the opened device, not all devices Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 12/15] IB/hfi1: Correctly clear the pkey Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 13/15] IB/hfi1: Clean up context initialization Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 14/15] IB/hfi1: Fix an assign/ordering issue with shared context IDs Dennis Dalessandro
[not found] ` <20170503004223.6965.13575.stgit-9QXIwq+3FY+1XWohqUldA0EOCMrvLtNR@public.gmane.org>
2017-05-03 7:36 ` Leon Romanovsky
[not found] ` <20170503073632.GD22833-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2017-05-03 11:19 ` Dennis Dalessandro
2017-05-03 0:42 ` [PATCH 15/15] IB/hfi1: Clean up on context initialization failure Dennis Dalessandro
[not found] ` <20170503004229.6965.97776.stgit-9QXIwq+3FY+1XWohqUldA0EOCMrvLtNR@public.gmane.org>
2017-05-03 7:35 ` Leon Romanovsky [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170503073548.GC22833@mtr-leonro.local \
--to=leon-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=dennis.dalessandro-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=michael.j.ruhl-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).