diff options
author | Michael J. Ruhl <michael.j.ruhl@intel.com> | 2017-05-04 05:15:21 -0700 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-05-04 19:31:46 -0400 |
commit | 62239fc6e5545b2e59f83dfbc5db231a81f37a45 (patch) | |
tree | e09329080790c0f624f0b3f7f95facabf7acf369 /drivers/infiniband/hw/hfi1/user_exp_rcv.c | |
parent | 8737ce95c463c6d8c4307ab3d6858cbf71cd4fc8 (diff) | |
download | talos-obmc-linux-62239fc6e5545b2e59f83dfbc5db231a81f37a45.tar.gz talos-obmc-linux-62239fc6e5545b2e59f83dfbc5db231a81f37a45.zip |
IB/hfi1: Clean up on context initialization failure
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@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/hw/hfi1/user_exp_rcv.c')
-rw-r--r-- | drivers/infiniband/hw/hfi1/user_exp_rcv.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/hfi1/user_exp_rcv.c b/drivers/infiniband/hw/hfi1/user_exp_rcv.c index 4c66f8d57cc1..a8f0aa4722f6 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,11 +216,11 @@ int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd) fd->invalid_tids = kcalloc(uctxt->expected_count, sizeof(*fd->invalid_tids), GFP_KERNEL); - /* - * NOTE: If this is an error, shouldn't we cleanup enry_to_rb? - */ - 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 |