Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ac2aed8 authored by Tom Lendacky's avatar Tom Lendacky Committed by Thomas Gleixner
Browse files

resource: Consolidate resource walking code



The walk_iomem_res_desc(), walk_system_ram_res() and walk_system_ram_range()
functions each have much of the same code.

Create a new function that consolidates the common code from these
functions in one place to reduce the amount of duplicated code.

Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarBrijesh Singh <brijesh.singh@amd.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarBorislav Petkov <bp@suse.de>
Tested-by: default avatarBorislav Petkov <bp@suse.de>
Cc: kvm@vger.kernel.org
Cc: Borislav Petkov <bp@alien8.de>
Link: https://lkml.kernel.org/r/20171020143059.3291-9-brijesh.singh@amd.com
parent 1379edd5
Loading
Loading
Loading
Loading
+25 −27
Original line number Original line Diff line number Diff line
@@ -400,6 +400,26 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
	return 0;
	return 0;
}
}


static int __walk_iomem_res_desc(struct resource *res, unsigned long desc,
				 bool first_level_children_only,
				 void *arg, int (*func)(u64, u64, void *))
{
	u64 orig_end = res->end;
	int ret = -1;

	while ((res->start < res->end) &&
	       !find_next_iomem_res(res, desc, first_level_children_only)) {
		ret = (*func)(res->start, res->end, arg);
		if (ret)
			break;

		res->start = res->end + 1;
		res->end = orig_end;
	}

	return ret;
}

/*
/*
 * Walks through iomem resources and calls func() with matching resource
 * Walks through iomem resources and calls func() with matching resource
 * ranges. This walks through whole tree and not just first level children.
 * ranges. This walks through whole tree and not just first level children.
@@ -418,26 +438,12 @@ int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
		u64 end, void *arg, int (*func)(u64, u64, void *))
		u64 end, void *arg, int (*func)(u64, u64, void *))
{
{
	struct resource res;
	struct resource res;
	u64 orig_end;
	int ret = -1;


	res.start = start;
	res.start = start;
	res.end = end;
	res.end = end;
	res.flags = flags;
	res.flags = flags;
	orig_end = res.end;

	while ((res.start < res.end) &&
		(!find_next_iomem_res(&res, desc, false))) {

		ret = (*func)(res.start, res.end, arg);
		if (ret)
			break;


		res.start = res.end + 1;
	return __walk_iomem_res_desc(&res, desc, false, arg, func);
		res.end = orig_end;
	}

	return ret;
}
}


/*
/*
@@ -451,22 +457,13 @@ int walk_system_ram_res(u64 start, u64 end, void *arg,
				int (*func)(u64, u64, void *))
				int (*func)(u64, u64, void *))
{
{
	struct resource res;
	struct resource res;
	u64 orig_end;
	int ret = -1;


	res.start = start;
	res.start = start;
	res.end = end;
	res.end = end;
	res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
	res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
	orig_end = res.end;

	while ((res.start < res.end) &&
	return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true,
		(!find_next_iomem_res(&res, IORES_DESC_NONE, true))) {
				     arg, func);
		ret = (*func)(res.start, res.end, arg);
		if (ret)
			break;
		res.start = res.end + 1;
		res.end = orig_end;
	}
	return ret;
}
}


#if !defined(CONFIG_ARCH_HAS_WALK_MEMORY)
#if !defined(CONFIG_ARCH_HAS_WALK_MEMORY)
@@ -508,6 +505,7 @@ static int __is_ram(unsigned long pfn, unsigned long nr_pages, void *arg)
{
{
	return 1;
	return 1;
}
}

/*
/*
 * This generic page_is_ram() returns true if specified address is
 * This generic page_is_ram() returns true if specified address is
 * registered as System RAM in iomem_resource list.
 * registered as System RAM in iomem_resource list.