Commit 3a6982df authored by Jakub Pawlak's avatar Jakub Pawlak Committed by Doug Ledford

IB/hfi1: Fix resource release in context allocation

Correct resource free in allocate_ctxt() function.
When context creation fails allocated resources are properly
released and pointer in receive context data table is set back
to NULL.
Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarJakub Pawlak <jakub.pawlak@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 242833fb
...@@ -978,14 +978,16 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd, ...@@ -978,14 +978,16 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd,
*/ */
uctxt->sc = sc_alloc(dd, SC_USER, uctxt->rcvhdrqentsize, uctxt->sc = sc_alloc(dd, SC_USER, uctxt->rcvhdrqentsize,
uctxt->dd->node); uctxt->dd->node);
if (!uctxt->sc) if (!uctxt->sc) {
return -ENOMEM; ret = -ENOMEM;
goto ctxdata_free;
}
hfi1_cdbg(PROC, "allocated send context %u(%u)\n", uctxt->sc->sw_index, hfi1_cdbg(PROC, "allocated send context %u(%u)\n", uctxt->sc->sw_index,
uctxt->sc->hw_context); uctxt->sc->hw_context);
ret = sc_enable(uctxt->sc); ret = sc_enable(uctxt->sc);
if (ret) if (ret)
return ret; goto ctxdata_free;
/* /*
* Setup shared context resources if the user-level has requested * Setup shared context resources if the user-level has requested
* shared contexts and this is the 'master' process. * shared contexts and this is the 'master' process.
...@@ -999,7 +1001,7 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd, ...@@ -999,7 +1001,7 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd,
* send context because it will be done during file close * send context because it will be done during file close
*/ */
if (ret) if (ret)
return ret; goto ctxdata_free;
} }
uctxt->userversion = uinfo->userversion; uctxt->userversion = uinfo->userversion;
uctxt->flags = hfi1_cap_mask; /* save current flag state */ uctxt->flags = hfi1_cap_mask; /* save current flag state */
...@@ -1019,6 +1021,11 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd, ...@@ -1019,6 +1021,11 @@ static int allocate_ctxt(struct file *fp, struct hfi1_devdata *dd,
fd->uctxt = uctxt; fd->uctxt = uctxt;
return 0; return 0;
ctxdata_free:
dd->rcd[ctxt] = NULL;
hfi1_free_ctxtdata(dd, uctxt);
return ret;
} }
static int init_subctxts(struct hfi1_ctxtdata *uctxt, static int init_subctxts(struct hfi1_ctxtdata *uctxt,
......
...@@ -336,6 +336,7 @@ struct hfi1_ctxtdata *hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, u32 ctxt, ...@@ -336,6 +336,7 @@ struct hfi1_ctxtdata *hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, u32 ctxt,
} }
return rcd; return rcd;
bail: bail:
dd->rcd[ctxt] = NULL;
kfree(rcd->egrbufs.rcvtids); kfree(rcd->egrbufs.rcvtids);
kfree(rcd->egrbufs.buffers); kfree(rcd->egrbufs.buffers);
kfree(rcd); kfree(rcd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment