All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chao Fan <fanc.fnst@cn.fujitsu.com>
To: Dou Liyang <douly.fnst@cn.fujitsu.com>
Cc: <linux-kernel@vger.kernel.org>, <x86@kernel.org>, <hpa@zytor.com>,
	<tglx@linutronix.de>, <mingo@redhat.com>, <bhe@redhat.com>,
	<keescook@chromium.org>, <indou.takao@jp.fujitsu.com>,
	<caoj.fnst@cn.fujitsu.com>
Subject: Re: [PATCH 1/4] kaslr: parse the extended movable_node=nn[KMG]@ss[KMG]
Date: Fri, 20 Oct 2017 11:44:21 +0800	[thread overview]
Message-ID: <20171020034421.GC5635@localhost.localdomain> (raw)
In-Reply-To: <0fe05bd2-1155-0016-9de7-688812f9dc00@cn.fujitsu.com>

On Fri, Oct 20, 2017 at 11:41:19AM +0800, Dou Liyang wrote:
>
>
>At 10/20/2017 11:22 AM, Chao Fan wrote:
>> On Fri, Oct 20, 2017 at 11:04:42AM +0800, Dou Liyang wrote:
>> > Hi Chao,
>> > 
>> Hi Dou-san,
>> 
>> > At 10/19/2017 06:02 PM, Chao Fan wrote:
>> > > Extend the movable_node to movable_node=nn[KMG]@ss[KMG].
>> > > Since in current code, kaslr may choose the memory region in hot-pluggable
>> > > nodes. So we can specific the region in immovable node. And store the
>> > > regions in immovable_mem.
>> > > 
>> > 
>> > I guess you may mean that:
>> > 
>> > In current Linux with KASLR. Kernel may choose a memory region in
>> > movable node for extracting kernel code, which will make the node
>> > can't be hot-removed.
>> > 
>> > Solve it by only specific the region in immovable node. So create
>> > immovable_mem to store the region of movable node, and only choose
>> > the memory in immovable_mem array.
>> > 
>> 
>> Thanks for the explaination.
>> 
>> > > Multiple regions can be specified, comma delimited.
>> > > Considering the usage of memory, only support for 4 regions.
>> > > 4 regions contains 2 nodes at least, and is enough for kernel to
>> > > extract.
>> > > 
>> > > Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com>
>> > > ---
>> > >  arch/x86/boot/compressed/kaslr.c | 63 +++++++++++++++++++++++++++++++++++++++-
>> > >  1 file changed, 62 insertions(+), 1 deletion(-)
>> > > 
>> > > diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
>> > > index 17818ba6906f..3c1f5204693b 100644
>> > > --- a/arch/x86/boot/compressed/kaslr.c
>> > > +++ b/arch/x86/boot/compressed/kaslr.c
>> > > @@ -107,6 +107,12 @@ enum mem_avoid_index {
>> > > 
>> > >  static struct mem_vector mem_avoid[MEM_AVOID_MAX];
>> > > 
>> > > +/* Only supporting at most 4 immovable memory regions with kaslr */
>> > > +#define MAX_IMMOVABLE_MEM	4
>> > > +
>> > > +static struct mem_vector immovable_mem[MAX_IMMOVABLE_MEM];
>> > > +static int num_immovable_region;
>> > > +
>> > >  static bool mem_overlaps(struct mem_vector *one, struct mem_vector *two)
>> > >  {
>> > >  	/* Item one is entirely before item two. */
>> > > @@ -167,6 +173,28 @@ parse_memmap(char *p, unsigned long long *start, unsigned long long *size)
>> > >  	return -EINVAL;
>> > >  }
>> > > 
>> > > +static int parse_immovable_mem(char *p,
>> > > +			       unsigned long long *start,
>> > > +			       unsigned long long *size)
>> > > +{
>> > > +	char *oldp;
>> > > +
>> > > +	if (!p)
>> > > +		return -EINVAL;
>> > > +
>> > > +	oldp = p;
>> > > +	*size = memparse(p, &p);
>> > > +	if (p == oldp)
>> > > +		return -EINVAL;
>> > > +
>> > > +	if (*p == '@') {
>> > > +		*start = memparse(p + 1, &p);
>> > > +		return 0;
>> > > +	}
>> > > +
>> > 
>> > Here you don't consider that if @ss[KMG] is omitted.
>> 
>> Yes, will add. Many thanks.
>> 
>> > 
>> > > +	return -EINVAL;
>> > > +}
>> > > +
>> > >  static void mem_avoid_memmap(char *str)
>> > >  {
>> > >  	static int i;
>> > > @@ -206,6 +234,36 @@ static void mem_avoid_memmap(char *str)
>> > >  		memmap_too_large = true;
>> > >  }
>> > > 
>> > > +#ifdef CONFIG_MEMORY_HOTPLUG
>> > > +static void mem_mark_immovable(char *str)
>> > > +{
>> > > +	int i = 0;
>> > > +
>> > 
>> > you have use num_immovable_region, 'i' is useless. just remove it.
>> 
>> Using num_immovable_region makes code too long. Using i will be
>> clear and make sure shoter than 80 characters.
>
>Oh, God, that's horrific. Did you find that your code is wrong?
>
>num_immovable_region will be reset each time.

Did you test?

Thanks,
Chao Fan

>
>Thanks,
>	dou.
>
>> 
>> > 
>> > > +	while (str && (i < MAX_IMMOVABLE_MEM)) {
>> > > +		int rc;
>> > > +		unsigned long long start, size;
>> > > +		char *k = strchr(str, ',');
>> > > +
>> > 
>> > Why do you put this definition here? IMO, moving it out is better.
>> > 
>> > > +		if (k)
>> > > +			*k++ = 0;
>> > > +
>> > > +		rc = parse_immovable_mem(str, &start, &size);
>> > > +		if (rc < 0)
>> > > +			break;
>> > > +		str = k;
>> > > +
>> > > +		immovable_mem[i].start = start;
>> > > +		immovable_mem[i].size = size;
>> > > +		i++;
>> > 
>> > Replace it with num_immovable_region
>> 
>> ditto...
>> Why do you care this little variable so much.
>> 
>> > 
>> > > +	}
>> > > +	num_immovable_region = i;
>> > 
>> > Just remove it.
>> 
>> ditto.
>> 
>> > 
>> > > +}
>> > > +#else
>> > > +static inline void mem_mark_immovable(char *str)
>> > > +{
>> > > +}
>> > > +#endif
>> > > +
>> > >  static int handle_mem_memmap(void)
>> > >  {
>> > >  	char *args = (char *)get_cmd_line_ptr();
>> > > @@ -214,7 +272,8 @@ static int handle_mem_memmap(void)
>> > >  	char *param, *val;
>> > >  	u64 mem_size;
>> > > 
>> > > -	if (!strstr(args, "memmap=") && !strstr(args, "mem="))
>> > > +	if (!strstr(args, "memmap=") && !strstr(args, "mem=") &&
>> > > +	    !strstr(args, "movable_node="))
>> > >  		return 0;
>> > > 
>> > >  	tmp_cmdline = malloc(len + 1);
>> > > @@ -239,6 +298,8 @@ static int handle_mem_memmap(void)
>> > > 
>> > >  		if (!strcmp(param, "memmap")) {
>> > >  			mem_avoid_memmap(val);
>> > > +		} else if (!strcmp(param, "movable_node")) {
>> > > +			mem_mark_immovable(val);
>> > 
>> > AFAIK, handle_mem_memmap() is invoked in mem_avoid_init(), which is used to
>> > avoid mem. But, here the value of immovable node is the memory
>> > you want to mark and use, it is better that we split it out.
>> 
>> There is existing and useful code, so it's better to reuse but not
>> re-write.
>> 
>> > 
>> > BTW, Using movable_node to store the memory of immovable node is
>> > strange and make me confuse. How about adding a new command option.
>> > 
>> 
>> I have added the document, if you think there are problems, please let
>> me know.
>> 
>> Thanks,
>> Chao Fan
>> 
>> > Thanks,
>> > 	dou.
>> > >  		} else if (!strcmp(param, "mem")) {
>> > >  			char *p = val;
>> > > 
>> > > 
>> 

  reply	other threads:[~2017-10-20  3:44 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-19 10:02 [PATCH 0/4] kaslr: extend movable_node to movable_node=nn[KMG]@ss[KMG] Chao Fan
2017-10-19 10:02 ` [PATCH 1/4] kaslr: parse the extended movable_node=nn[KMG]@ss[KMG] Chao Fan
2017-10-20  3:04   ` Dou Liyang
2017-10-20  3:22     ` Chao Fan
2017-10-20  3:41       ` Dou Liyang
2017-10-20  3:44         ` Chao Fan [this message]
2017-10-20  5:33           ` Dou Liyang
2017-10-20  9:34             ` Chao Fan
2017-10-19 10:02 ` [PATCH 2/4] kaslr: select the memory region in immovable node to process Chao Fan
2017-10-20  3:17   ` Dou Liyang
2017-10-20  3:41     ` Chao Fan
2017-10-20  6:05       ` Dou Liyang
2017-10-19 10:02 ` [PATCH 3/4] document: change the document for the extended movable_node Chao Fan
2017-10-19 10:02 ` [PATCH 4/4] kaslr: clean up a useless variable and some usless space Chao Fan
2017-10-20  3:19   ` Dou Liyang
2017-10-20  4:10     ` Chao Fan
2017-10-20  2:37 ` [PATCH 0/4] kaslr: extend movable_node to movable_node=nn[KMG]@ss[KMG] Dou Liyang
2017-10-20  2:53   ` Chao Fan
2017-10-20  3:37     ` Dou Liyang
2017-10-20  3:46       ` Chao Fan
2017-10-20  6:41         ` Dou Liyang

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=20171020034421.GC5635@localhost.localdomain \
    --to=fanc.fnst@cn.fujitsu.com \
    --cc=bhe@redhat.com \
    --cc=caoj.fnst@cn.fujitsu.com \
    --cc=douly.fnst@cn.fujitsu.com \
    --cc=hpa@zytor.com \
    --cc=indou.takao@jp.fujitsu.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.