Commit 69c99613 authored by Dan Williams's avatar Dan Williams
Browse files

cxl/region: Fix region commit uninitialized variable warning



0day robot reports:

drivers/cxl/core/region.c:196 cxl_region_decode_commit() error: uninitialized symbol 'rc'.

The re-checking of loop termination conditions to determine "success"
makes it hard to see that @rc is initialized in all cases. Remove those
to make it explicit that @rc reflects a commit error and that the rest
of logic is concerned with unwinding committed decoders.

This change potentially results in cxl_region_decode_reset() being
called with @count == 0 where it was not called before, but
cxl_region_decode_reset() treats that as a nop.

Fixes: 176baefb ("cxl/hdm: Commit decoder state to hardware")
Reported-by: default avatarkernel test robot <lkp@intel.com>
Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: http://lore.kernel.org/r/165951148105.967013.14191992449932268431.stgit@dwillia2-xfh.jf.intel.com


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 8d428542
Loading
Loading
Loading
Loading
+13 −17
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ static int cxl_region_decode_reset(struct cxl_region *cxlr, int count)
static int cxl_region_decode_commit(struct cxl_region *cxlr)
{
	struct cxl_region_params *p = &cxlr->params;
	int i, rc;
	int i, rc = 0;

	for (i = 0; i < p->nr_targets; i++) {
		struct cxl_endpoint_decoder *cxled = p->targets[i];
@@ -179,10 +179,7 @@ static int cxl_region_decode_commit(struct cxl_region *cxlr)
				break;
		}

		/* success, all decoders up to the root are programmed */
		if (is_cxl_root(iter))
			continue;

		if (rc) {
			/* programming @iter failed, teardown */
			for (ep = cxl_ep_load(iter, cxlmd); ep && iter;
			     iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) {
@@ -192,14 +189,13 @@ static int cxl_region_decode_commit(struct cxl_region *cxlr)
			}

			cxled->cxld.reset(&cxled->cxld);
		if (i == 0)
			return rc;
		break;
			goto err;
		}
	}

	if (i >= p->nr_targets)
	return 0;

err:
	/* undo the targets that were successfully committed */
	cxl_region_decode_reset(cxlr, i);
	return rc;