| From b25bd59a9c5e28aa787d48ff4b72c00d9cd729bd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Apr 2021 19:21:04 -0500 |
| Subject: RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails |
| |
| From: Sindhu Devale <sindhu.devale@intel.com> |
| |
| [ Upstream commit 783a11bf2400e5d5c42a943c3083dc0330751842 ] |
| |
| When i40iw_hmc_sd_one fails, chunk is freed without the deletion of chunk |
| entry in the PBLE info list. |
| |
| Fix it by adding the chunk entry to the PBLE info list only after |
| successful addition of SD in i40iw_hmc_sd_one. |
| |
| This fixes a static checker warning reported here: |
| https://lore.kernel.org/linux-rdma/YHV4CFXzqTm23AOZ@mwanda/ |
| |
| Fixes: 9715830157be ("i40iw: add pble resource files") |
| Link: https://lore.kernel.org/r/20210416002104.323-1-shiraz.saleem@intel.com |
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Sindhu Devale <sindhu.devale@intel.com> |
| Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com> |
| Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/hw/i40iw/i40iw_pble.c | 6 ++---- |
| 1 file changed, 2 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/infiniband/hw/i40iw/i40iw_pble.c b/drivers/infiniband/hw/i40iw/i40iw_pble.c |
| index 5f97643e22e5..ae7d227edad2 100644 |
| --- a/drivers/infiniband/hw/i40iw/i40iw_pble.c |
| +++ b/drivers/infiniband/hw/i40iw/i40iw_pble.c |
| @@ -392,12 +392,9 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev, |
| i40iw_debug(dev, I40IW_DEBUG_PBLE, "next_fpm_addr = %llx chunk_size[%u] = 0x%x\n", |
| pble_rsrc->next_fpm_addr, chunk->size, chunk->size); |
| pble_rsrc->unallocated_pble -= (chunk->size >> 3); |
| - list_add(&chunk->list, &pble_rsrc->pinfo.clist); |
| sd_reg_val = (sd_entry_type == I40IW_SD_TYPE_PAGED) ? |
| sd_entry->u.pd_table.pd_page_addr.pa : sd_entry->u.bp.addr.pa; |
| - if (sd_entry->valid) |
| - return 0; |
| - if (dev->is_pf) { |
| + if (dev->is_pf && !sd_entry->valid) { |
| ret_code = i40iw_hmc_sd_one(dev, hmc_info->hmc_fn_id, |
| sd_reg_val, idx->sd_idx, |
| sd_entry->entry_type, true); |
| @@ -408,6 +405,7 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev, |
| } |
| |
| sd_entry->valid = true; |
| + list_add(&chunk->list, &pble_rsrc->pinfo.clist); |
| return 0; |
| error: |
| kfree(chunk); |
| -- |
| 2.30.2 |
| |