All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xunlei Pang <xlpang@redhat.com>
To: Minfei Huang <mhuang@redhat.com>
Cc: kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
	ebiederm@xmission.com, akpm@linux-foundation.org,
	Dave Young <dyoung@redhat.com>, Vivek Goyal <vgoyal@redhat.com>
Subject: Re: [PATCH v2 2/2] kexec: Provide arch_kexec_protect(unprotect)_crashkres()
Date: Thu, 7 Jan 2016 10:14:08 +0800	[thread overview]
Message-ID: <568DC9F0.8090609@redhat.com> (raw)
In-Reply-To: <20160106170832.GB25832@dhcp-128-25.nay.redhat.com>

On 01/07/2016 at 01:08 AM, Minfei Huang wrote:
> On 01/06/16 at 05:50pm, Xunlei Pang wrote:
>> diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
>> index 819ab3f..cda867d 100644
>> --- a/arch/x86/kernel/machine_kexec_64.c
>> +++ b/arch/x86/kernel/machine_kexec_64.c
>> @@ -536,3 +536,44 @@ overflow:
>>  	return -ENOEXEC;
>>  }
>>  #endif /* CONFIG_KEXEC_FILE */
>> +
>> +static int
>> +kexec_mark_range(unsigned long start, unsigned long end, bool protect)
>> +{
>> +	struct page *page;
>> +	unsigned int nr_pages;
>> +
>> +	/* For physical range: [start, end] */
>> +	if (!start || !end || start > end)
>> +		return 0;
> Hi, Xunlei.
>
>         if (start > end)
>                 return 0;

If both start and end are zero, we want to return directly, so the two
more check doesn't hurt.

> See the below comment.
>> +
>> +	page = pfn_to_page(start >> PAGE_SHIFT);
>> +	nr_pages = (end + PAGE_SIZE - start) >> PAGE_SHIFT;
> As I commented in last version, it is better to cover the case if the
> range from start to end acrosses two pages.

right.

>> +	if (protect)
>> +		return set_pages_ro(page, nr_pages);
>> +	else
>> +		return set_pages_rw(page, nr_pages);
>> +}
>> +
>> +static void kexec_mark_crashkres(bool protect)
>> +{
>> +	unsigned long control;
>> +
>> +	kexec_mark_range(crashk_low_res.start, crashk_low_res.end, protect);
> Adding the following if test to test crashk_low_res is better. Then we
> do not need to test if start or end is equal to 0 in kexec_mark_range.
>
>         if (crashk_low_res.start != crashk_low_res.end) {
>                 kexec_mark_range(crashk_low_res.start,
>                                 crashk_low_res.end, protect);
>         }

The checks in kexec_mark_range() will handle the case, it's not
performance-critical path and will make the code less clean.

>> +
>> +	/* Don't touch the control code page used in crash_kexec().*/
>> +	control = PFN_PHYS(page_to_pfn(kexec_crash_image->control_code_page));
>> +	/* Control code page is located in the 2nd page. */
>> +	kexec_mark_range(crashk_res.start, control + PAGE_SIZE - 1, protect);
>> +	kexec_mark_range(control + 2 * PAGE_SIZE, crashk_res.end, protect);
> I think it is more readable, if we use MACRO KEXEC_CONTROL_PAGE_SIZE,
> instead of using 2*PAGE_SIZE directly.

OK.

How about the following update:

+static int
+kexec_mark_range(unsigned long start, unsigned long end, bool protect)
+{
+       struct page *page;
+       unsigned int nr_pages;
+
+       /* For physical range: [start, end] */
+       if (!start || !end || start > end)
+               return 0;
+
+       page = pfn_to_page(start >> PAGE_SHIFT);
+       nr_pages = (end >> PAGE_SHIFT) - (start >> PAGE_SHIFT) + 1;
+       if (protect)
+               return set_pages_ro(page, nr_pages);
+       else
+               return set_pages_rw(page, nr_pages);
+}
+
+static void kexec_mark_crashkres(bool protect)
+{
+       unsigned long control;
+
+       kexec_mark_range(crashk_low_res.start, crashk_low_res.end, protect);
+
+       /* Don't touch the control code page used in crash_kexec().*/
+       control = PFN_PHYS(page_to_pfn(kexec_crash_image->control_code_page));
+       /* Control code page is located in the 2nd page. */
+       kexec_mark_range(crashk_res.start, control + PAGE_SIZE - 1, protect);
+       control += KEXEC_CONTROL_PAGE_SIZE;
+       kexec_mark_range(control, crashk_res.end, protect);
+}
+
+void arch_kexec_protect_crashkres(void)
+{
+       kexec_mark_crashkres(true);
+}
+
+void arch_kexec_unprotect_crashkres(void)
+{
+       kexec_mark_crashkres(false);
+}

> Thanks
> Minfei
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

WARNING: multiple messages have this Message-ID (diff)
From: Xunlei Pang <xlpang@redhat.com>
To: Minfei Huang <mhuang@redhat.com>
Cc: kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
	ebiederm@xmission.com, akpm@linux-foundation.org,
	Dave Young <dyoung@redhat.com>, Vivek Goyal <vgoyal@redhat.com>
Subject: Re: [PATCH v2 2/2] kexec: Provide arch_kexec_protect(unprotect)_crashkres()
Date: Thu, 7 Jan 2016 10:14:08 +0800	[thread overview]
Message-ID: <568DC9F0.8090609@redhat.com> (raw)
In-Reply-To: <20160106170832.GB25832@dhcp-128-25.nay.redhat.com>

On 01/07/2016 at 01:08 AM, Minfei Huang wrote:
> On 01/06/16 at 05:50pm, Xunlei Pang wrote:
>> diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
>> index 819ab3f..cda867d 100644
>> --- a/arch/x86/kernel/machine_kexec_64.c
>> +++ b/arch/x86/kernel/machine_kexec_64.c
>> @@ -536,3 +536,44 @@ overflow:
>>  	return -ENOEXEC;
>>  }
>>  #endif /* CONFIG_KEXEC_FILE */
>> +
>> +static int
>> +kexec_mark_range(unsigned long start, unsigned long end, bool protect)
>> +{
>> +	struct page *page;
>> +	unsigned int nr_pages;
>> +
>> +	/* For physical range: [start, end] */
>> +	if (!start || !end || start > end)
>> +		return 0;
> Hi, Xunlei.
>
>         if (start > end)
>                 return 0;

If both start and end are zero, we want to return directly, so the two
more check doesn't hurt.

> See the below comment.
>> +
>> +	page = pfn_to_page(start >> PAGE_SHIFT);
>> +	nr_pages = (end + PAGE_SIZE - start) >> PAGE_SHIFT;
> As I commented in last version, it is better to cover the case if the
> range from start to end acrosses two pages.

right.

>> +	if (protect)
>> +		return set_pages_ro(page, nr_pages);
>> +	else
>> +		return set_pages_rw(page, nr_pages);
>> +}
>> +
>> +static void kexec_mark_crashkres(bool protect)
>> +{
>> +	unsigned long control;
>> +
>> +	kexec_mark_range(crashk_low_res.start, crashk_low_res.end, protect);
> Adding the following if test to test crashk_low_res is better. Then we
> do not need to test if start or end is equal to 0 in kexec_mark_range.
>
>         if (crashk_low_res.start != crashk_low_res.end) {
>                 kexec_mark_range(crashk_low_res.start,
>                                 crashk_low_res.end, protect);
>         }

The checks in kexec_mark_range() will handle the case, it's not
performance-critical path and will make the code less clean.

>> +
>> +	/* Don't touch the control code page used in crash_kexec().*/
>> +	control = PFN_PHYS(page_to_pfn(kexec_crash_image->control_code_page));
>> +	/* Control code page is located in the 2nd page. */
>> +	kexec_mark_range(crashk_res.start, control + PAGE_SIZE - 1, protect);
>> +	kexec_mark_range(control + 2 * PAGE_SIZE, crashk_res.end, protect);
> I think it is more readable, if we use MACRO KEXEC_CONTROL_PAGE_SIZE,
> instead of using 2*PAGE_SIZE directly.

OK.

How about the following update:

+static int
+kexec_mark_range(unsigned long start, unsigned long end, bool protect)
+{
+       struct page *page;
+       unsigned int nr_pages;
+
+       /* For physical range: [start, end] */
+       if (!start || !end || start > end)
+               return 0;
+
+       page = pfn_to_page(start >> PAGE_SHIFT);
+       nr_pages = (end >> PAGE_SHIFT) - (start >> PAGE_SHIFT) + 1;
+       if (protect)
+               return set_pages_ro(page, nr_pages);
+       else
+               return set_pages_rw(page, nr_pages);
+}
+
+static void kexec_mark_crashkres(bool protect)
+{
+       unsigned long control;
+
+       kexec_mark_range(crashk_low_res.start, crashk_low_res.end, protect);
+
+       /* Don't touch the control code page used in crash_kexec().*/
+       control = PFN_PHYS(page_to_pfn(kexec_crash_image->control_code_page));
+       /* Control code page is located in the 2nd page. */
+       kexec_mark_range(crashk_res.start, control + PAGE_SIZE - 1, protect);
+       control += KEXEC_CONTROL_PAGE_SIZE;
+       kexec_mark_range(control, crashk_res.end, protect);
+}
+
+void arch_kexec_protect_crashkres(void)
+{
+       kexec_mark_crashkres(true);
+}
+
+void arch_kexec_unprotect_crashkres(void)
+{
+       kexec_mark_crashkres(false);
+}

> Thanks
> Minfei
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2016-01-07  2:14 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-06  9:50 [PATCH v2 1/2] kexec: Introduce a protection mechanism for the crashkernel reserved memory Xunlei Pang
2016-01-06  9:50 ` Xunlei Pang
2016-01-06  9:50 ` [PATCH v2 2/2] kexec: Provide arch_kexec_protect(unprotect)_crashkres() Xunlei Pang
2016-01-06  9:50   ` Xunlei Pang
2016-01-06 17:08   ` Minfei Huang
2016-01-06 17:08     ` Minfei Huang
2016-01-07  2:14     ` Xunlei Pang [this message]
2016-01-07  2:14       ` Xunlei Pang
2016-01-07  2:20       ` Xunlei Pang
2016-01-07  2:20         ` Xunlei Pang
2016-01-07  2:36       ` Minfei Huang
2016-01-07  2:36         ` Minfei Huang
2016-01-07  5:08         ` Xunlei Pang
2016-01-07  5:08           ` Xunlei Pang
2016-01-07  9:20           ` Petr Tesarik
2016-01-07  9:20             ` Petr Tesarik
2016-01-07 11:14             ` Xunlei Pang
2016-01-07 11:14               ` Xunlei Pang

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=568DC9F0.8090609@redhat.com \
    --to=xlpang@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=dyoung@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=kexec@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhuang@redhat.com \
    --cc=vgoyal@redhat.com \
    /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.