linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: panand@redhat.com (Pratyush Anand)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH kexec-tools v2 12/32] kexec: add helper to exlude a region from a set of memory ranges
Date: Tue, 7 Jun 2016 10:25:15 +0530	[thread overview]
Message-ID: <20160607045515.GA13643@dhcppc6> (raw)
In-Reply-To: <E1b9xsO-0003sa-Sr@e0050434b2927.dyn.armlinux.org.uk>

On 06/06/2016:05:59:44 PM, Russell King wrote:
> Add a helper to exclude a region from a set of memory ranges.
> 
> Signed-off-by: Russell King <rmk@arm.linux.org.uk>

Reviewed-by: Pratyush Anand <panand@redhat.com>
> ---
>  kexec/mem_regions.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  kexec/mem_regions.h |  4 +++
>  2 files changed, 75 insertions(+)
> 
> diff --git a/kexec/mem_regions.c b/kexec/mem_regions.c
> index 804984a..b01a5c8 100644
> --- a/kexec/mem_regions.c
> +++ b/kexec/mem_regions.c
> @@ -55,3 +55,74 @@ int mem_regions_add(struct memory_ranges *ranges, unsigned long long base,
>  	return 0;
>  }
>  
> +static void mem_regions_remove(struct memory_ranges *ranges, int index)
> +{
> +	int tail_entries;
> +
> +	/* we are assured to have at least one entry */
> +	ranges->size -= 1;
> +
> +	/* if we have following entries, shuffle them down one place */
> +	tail_entries = ranges->size - index;
> +	if (tail_entries)
> +		memmove(ranges->ranges + index, ranges->ranges + index + 1,
> +			tail_entries * sizeof(*ranges->ranges));
> +
> +	/* zero the new tail entry */
> +	memset(ranges->ranges + ranges->size, 0, sizeof(*ranges->ranges));
> +}
> +
> +/**
> + * mem_regions_exclude() - excludes a memory region from a set of memory ranges
> + * @ranges: memory ranges to exclude the region from
> + * @range: memory range to exclude
> + *
> + * Exclude a memory region from a set of memory ranges.  We assume that
> + * the region to be excluded is either wholely located within one of the
> + * memory ranges, or not at all.
> + */
> +int mem_regions_exclude(struct memory_ranges *ranges,
> +			const struct memory_range *range)
> +{
> +	int i, ret;
> +
> +	for (i = 0; i < ranges->size; i++) {
> +		struct memory_range *r = ranges->ranges + i;
> +
> +		/*
> +		 * We assume that crash area is fully contained in
> +		 * some larger memory area.
> +		 */
> +		if (r->start <= range->start && r->end >= range->end) {
> +			if (r->start == range->start) {
> +				if (r->end == range->end)
> +					/* Remove this entry */
> +					mem_regions_remove(ranges, i);
> +				else
> +					/* Shrink the start of this memory range */
> +					r->start = range->end + 1;
> +			} else if (r->end == range->end) {
> +				/* Shrink the end of this memory range */
> +				r->end = range->start - 1;
> +			} else {
> +				/*
> +				 * Split this area into 2 smaller ones and
> +				 * remove excluded range from between. First
> +				 * create new entry for the remaining area.
> +				 */
> +				ret = mem_regions_add(ranges, range->end + 1,
> +						      r->end - range->end, 0);
> +				if (ret < 0)
> +					return ret;
> +
> +				/*
> +				 * Update this area to end before excluded
> +				 * range.
> +				 */
> +				r->end = range->start - 1;
> +				break;
> +			}
> +		}
> +	}
> +	return 0;
> +}
> diff --git a/kexec/mem_regions.h b/kexec/mem_regions.h
> index da7b5e8..ae9e972 100644
> --- a/kexec/mem_regions.h
> +++ b/kexec/mem_regions.h
> @@ -2,9 +2,13 @@
>  #define MEM_REGIONS_H
>  
>  struct memory_ranges;
> +struct memory_range;
>  
>  void mem_regions_sort(struct memory_ranges *ranges);
>  
> +int mem_regions_exclude(struct memory_ranges *ranges,
> +			const struct memory_range *range);
> +
>  int mem_regions_add(struct memory_ranges *ranges, unsigned long long base,
>                      unsigned long long length, int type);
>  
> -- 
> 1.9.1

  reply	other threads:[~2016-06-07  4:55 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-06 16:41 [PATCH kexec-tools v2 00/32] Keystone II updates for kexec tools Russell King - ARM Linux
2016-06-06 16:58 ` [PATCH kexec-tools v2 01/32] kdump: mmap() and munmap() only work on page-aligned quantites Russell King
2016-06-06 16:58 ` [PATCH kexec-tools v2 02/32] kdump: fix multiple program header entries Russell King
2016-06-06 16:58 ` [PATCH kexec-tools v2 03/32] kdump: actually write out the memory Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 04/32] kdump: fix kdump mapping Russell King
2016-06-07  2:05   ` Pratyush Anand
2016-06-06 16:59 ` [PATCH kexec-tools v2 05/32] arm: fix kdump to work on LPAE systems Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 06/32] kdump: print mmap() offset in hex Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 07/32] kexec: fix warnings caused by selecting 64-bit file IO on 32-bit platforms Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 08/32] kexec: add max_size to memory_ranges Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 09/32] kexec: phys_to_virt() must take unsigned long long Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 10/32] kexec: add generic helper to add to memory_regions Russell King
2016-06-08  1:13   ` Baoquan He
2016-06-08  1:22     ` Simon Horman
2016-06-09 16:18       ` [PATCH] Remove "max" parameter comment Russell King
2016-06-09 17:06         ` Pratyush Anand
2016-06-23  0:40         ` Simon Horman
2016-06-06 16:59 ` [PATCH kexec-tools v2 11/32] kexec: add mem_regions sorting implementation Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 12/32] kexec: add helper to exlude a region from a set of memory ranges Russell King
2016-06-07  4:55   ` Pratyush Anand [this message]
2016-06-06 16:59 ` [PATCH kexec-tools v2 13/32] arm: fix pointer signedness warning in kexec-uImage-arm.c Russell King
2016-06-06 16:59 ` [PATCH kexec-tools v2 14/32] arm: fix off-by-one on memory end Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 15/32] arm: fix get_kernel_stext_sym() to close its file Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 16/32] arm: fix ELF32/ELF64 check Russell King
2016-06-07  5:41   ` Pratyush Anand
2016-06-06 17:00 ` [PATCH kexec-tools v2 17/32] arm: return proper error for missing crash kernel Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 18/32] arm: report if crash kernel is out of bounds Russell King
2016-06-07  5:41   ` Pratyush Anand
2016-06-06 17:00 ` [PATCH kexec-tools v2 19/32] arm: add memory ranges debug Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 20/32] arm: add maximum number of memory ranges Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 21/32] arm: parse crash_reserved_mem early Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 22/32] arm: use generic mem_region sorting implementation Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 23/32] arm: move crash system RAM parsing earlier Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 24/32] arm: add support for platforms with boot memory aliases Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 25/32] arm: crashdump needs boot alias of crash kernel region Russell King
2016-06-06 17:00 ` [PATCH kexec-tools v2 26/32] arm: rename crash_reserved_mem to crash_kernel_mem Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 27/32] arm: add support for multiple reserved regions Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 28/32] arm: add support for boot-time crash kernel resource Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 29/32] arm: add debug of reserved and coredump memory ranges Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 30/32] arm: fix type of phys_offset Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 31/32] arm: clean up phys/page offset debug Russell King
2016-06-06 17:01 ` [PATCH kexec-tools v2 32/32] arm: report which ELF core format we will use Russell King
2016-06-08  0:27 ` [PATCH kexec-tools v2 00/32] Keystone II updates for kexec tools Simon Horman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160607045515.GA13643@dhcppc6 \
    --to=panand@redhat.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).