All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	Michal Hocko <mhocko@kernel.org>,
	Oscar Salvador <osalvador@suse.de>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] mm, soft-offline: convert parameter to pfn
Date: Thu, 17 Oct 2019 09:16:42 +0200	[thread overview]
Message-ID: <ac4c1ab9-1df6-6a30-30ed-a015622ef591@redhat.com> (raw)
In-Reply-To: <20191016234706.GA5493@www9186uo.sakura.ne.jp>

On 17.10.19 01:47, Naoya Horiguchi wrote:
> On Wed, Oct 16, 2019 at 10:57:57AM +0200, David Hildenbrand wrote:
>> On 16.10.19 10:54, Naoya Horiguchi wrote:
>>> On Wed, Oct 16, 2019 at 10:34:52AM +0200, David Hildenbrand wrote:
>>>> On 16.10.19 10:27, Naoya Horiguchi wrote:
>>>>> On Wed, Oct 16, 2019 at 09:56:19AM +0200, David Hildenbrand wrote:
>>>>>> On 16.10.19 09:09, Naoya Horiguchi wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I wrote a simple cleanup for parameter of soft_offline_page(),
>>>>>>> based on thread https://lkml.org/lkml/2019/10/11/57.
>>>>>>>
>>>>>>> I know that we need more cleanup on hwpoison-inject, but I think
>>>>>>> that will be mentioned in re-write patchset Oscar is preparing now.
>>>>>>> So let me shared only this part as a separate one now.
>>>>> ...
>>>>>>
>>>>>> I think you should rebase that patch on linux-next (where the
>>>>>> pfn_to_online_page() check is in place). I assume you'll want to move the
>>>>>> pfn_to_online_page() check into soft_offline_page() then as well?
>>>>>
>>>>> I rebased to next-20191016. And yes, we will move pfn_to_online_page()
>>>>> into soft offline code.  It seems that we can also move pfn_valid(),
>>>>> but is simply moving like below good enough for you?
>>>>
>>>> At least I can't am the patch to current next/master (due to
>>>> pfn_to_online_page()).
>>
>> Could also be that my "git am" skills failed as the mail was not a
>> proper patch itself :)
> 
> Sorry for the inconvenience, my company email system breaks original
> message by introducing quoted-printable format ('=20' or '=3D').
> Most mail client usually handles it but git-am doesn't.
> I give up using it and send via smtp.gmail.com.
> 
>>> @@ -1877,11 +1877,17 @@ static int soft_offline_free_page(struct page *page)
>>>    * This is not a 100% solution for all memory, but tries to be
>>>    * ``good enough'' for the majority of memory.
>>>    */
>>> -int soft_offline_page(struct page *page, int flags)
>>> +int soft_offline_page(unsigned long pfn, int flags)
>>>   {
>>>   	int ret;
>>> -	unsigned long pfn = page_to_pfn(page);
>>> +	struct page *page;
>>> +	if (!pfn_valid(pfn))
>>> +		return -ENXIO;
>>> +	/* Only online pages can be soft-offlined (esp., not ZONE_DEVICE). */
>>> +	page = pfn_to_online_page(pfn);
>>> +	if (!page)
>>> +		return -EIO;
>>>   	if (is_zone_device_page(page)) {
>>
>> -> this is now no longer possible! So you can drop the whole if
>> (is_zone_device....) case
> 
> OK, thanks. I updated it.
> 
> Thanks,
> Naoya Horiguchi
> ---
>  From 5faf227839b578726fe7f5ff414a153abb3b3a31 Mon Sep 17 00:00:00 2001
> From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> Date: Thu, 17 Oct 2019 08:40:53 +0900
> Subject: [PATCH] mm, soft-offline: convert parameter to pfn
> 
> Currently soft_offline_page() receives struct page, and its sibling
> memory_failure() receives pfn. This discrepancy looks weird and makes
> precheck on pfn validity tricky. So let's align them.
> 
> Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> ---
>   drivers/base/memory.c |  7 +------
>   include/linux/mm.h    |  2 +-
>   mm/madvise.c          |  2 +-
>   mm/memory-failure.c   | 19 +++++++++----------
>   4 files changed, 12 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/base/memory.c b/drivers/base/memory.c
> index 55907c27075b..a757d9ed88a7 100644
> --- a/drivers/base/memory.c
> +++ b/drivers/base/memory.c
> @@ -538,12 +538,7 @@ static ssize_t soft_offline_page_store(struct device *dev,
>   	if (kstrtoull(buf, 0, &pfn) < 0)
>   		return -EINVAL;
>   	pfn >>= PAGE_SHIFT;
> -	if (!pfn_valid(pfn))
> -		return -ENXIO;
> -	/* Only online pages can be soft-offlined (esp., not ZONE_DEVICE). */
> -	if (!pfn_to_online_page(pfn))
> -		return -EIO;
> -	ret = soft_offline_page(pfn_to_page(pfn), 0);
> +	ret = soft_offline_page(pfn, 0);
>   	return ret == 0 ? count : ret;
>   }
>   
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 44d058723db9..fd360d208346 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -2794,7 +2794,7 @@ extern int sysctl_memory_failure_early_kill;
>   extern int sysctl_memory_failure_recovery;
>   extern void shake_page(struct page *p, int access);
>   extern atomic_long_t num_poisoned_pages __read_mostly;
> -extern int soft_offline_page(struct page *page, int flags);
> +extern int soft_offline_page(unsigned long pfn, int flags);
>   
>   
>   /*
> diff --git a/mm/madvise.c b/mm/madvise.c
> index 2be9f3fdb05e..99dd06fecfa9 100644
> --- a/mm/madvise.c
> +++ b/mm/madvise.c
> @@ -887,7 +887,7 @@ static int madvise_inject_error(int behavior,
>   			pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n",
>   					pfn, start);
>   
> -			ret = soft_offline_page(page, MF_COUNT_INCREASED);
> +			ret = soft_offline_page(pfn, MF_COUNT_INCREASED);
>   			if (ret)
>   				return ret;
>   			continue;
> diff --git a/mm/memory-failure.c b/mm/memory-failure.c
> index 05c8c6df25e6..af2712004a4d 100644
> --- a/mm/memory-failure.c
> +++ b/mm/memory-failure.c
> @@ -1476,7 +1476,7 @@ static void memory_failure_work_func(struct work_struct *work)
>   		if (!gotten)
>   			break;
>   		if (entry.flags & MF_SOFT_OFFLINE)
> -			soft_offline_page(pfn_to_page(entry.pfn), entry.flags);
> +			soft_offline_page(entry.pfn, entry.flags);
>   		else
>   			memory_failure(entry.pfn, entry.flags);
>   	}
> @@ -1857,7 +1857,7 @@ static int soft_offline_free_page(struct page *page)
>   
>   /**
>    * soft_offline_page - Soft offline a page.
> - * @page: page to offline
> + * @pfn: pfn to soft-offline
>    * @flags: flags. Same as memory_failure().
>    *
>    * Returns 0 on success, otherwise negated errno.
> @@ -1877,18 +1877,17 @@ static int soft_offline_free_page(struct page *page)
>    * This is not a 100% solution for all memory, but tries to be
>    * ``good enough'' for the majority of memory.
>    */
> -int soft_offline_page(struct page *page, int flags)
> +int soft_offline_page(unsigned long pfn, int flags)
>   {
>   	int ret;
> -	unsigned long pfn = page_to_pfn(page);
> +	struct page *page;
>   
> -	if (is_zone_device_page(page)) {
> -		pr_debug_ratelimited("soft_offline: %#lx page is device page\n",
> -				pfn);
> -		if (flags & MF_COUNT_INCREASED)
> -			put_page(page);
> +	if (!pfn_valid(pfn))
> +		return -ENXIO;
> +	/* Only online pages can be soft-offlined (esp., not ZONE_DEVICE). */
> +	page = pfn_to_online_page(pfn);
> +	if (!page)

If you pass in a PFN with MF_COUNT_INCREASED via mm/madvise.c, you would  
now no longer do a put_page(page) in case of ZONE_DEVICE (!page =  
pfn_to_online_page(pfn);)

something like this

page = pfn_to_online_page(pfn);
if (!page) {
	/*
	 * With MF_COUNT_INCREASED, we can use pfn_to_page() directly
	 * (esp., ZONE_DEVICE).
	 */
	if (flags & MF_COUNT_INCREASED)
		put_page(pfn_to_page(page));
	return -EIO;
}

For !pfn_valid(pfn), this is not relevant.

>   		return -EIO;
> -	}
>   
>   	if (PageHWPoison(page)) {
>   		pr_info("soft offline: %#lx page already poisoned\n", pfn);
> 


-- 

Thanks,

David / dhildenb

  reply	other threads:[~2019-10-17  7:16 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-16  7:09 [PATCH] mm, soft-offline: convert parameter to pfn Naoya Horiguchi
2019-10-16  7:56 ` David Hildenbrand
2019-10-16  8:27   ` Naoya Horiguchi
2019-10-16  8:34     ` David Hildenbrand
2019-10-16  8:54       ` Naoya Horiguchi
2019-10-16  8:57         ` David Hildenbrand
2019-10-16 23:47           ` Naoya Horiguchi
2019-10-17  7:16             ` David Hildenbrand [this message]
2019-10-17  7:50               ` Naoya Horiguchi
2019-10-17  8:02                 ` David Hildenbrand
2019-10-17  8:03                 ` Oscar Salvador
2019-10-17  8:07                   ` Naoya Horiguchi

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=ac4c1ab9-1df6-6a30-30ed-a015622ef591@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=n-horiguchi@ah.jp.nec.com \
    --cc=nao.horiguchi@gmail.com \
    --cc=osalvador@suse.de \
    /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.