From: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Avi Kivity <avi@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
KVM <kvm@vger.kernel.org>
Subject: Re: [PATCH v5 05/12] KVM: reorganize hva_to_pfn
Date: Sat, 11 Aug 2012 11:11:51 +0800 [thread overview]
Message-ID: <5025CD77.2030100@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120810175115.GA12477@amt.cnet>
On 08/11/2012 01:51 AM, Marcelo Tosatti wrote:
> On Tue, Aug 07, 2012 at 05:51:05PM +0800, Xiao Guangrong wrote:
>> We do too many things in hva_to_pfn, this patch reorganize the code,
>> let it be better readable
>>
>> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
>> ---
>> virt/kvm/kvm_main.c | 159 +++++++++++++++++++++++++++++++--------------------
>> 1 files changed, 97 insertions(+), 62 deletions(-)
>>
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index 26ffc87..dd01bcb 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -1043,83 +1043,118 @@ static inline int check_user_page_hwpoison(unsigned long addr)
>> return rc == -EHWPOISON;
>> }
>>
>> -static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async,
>> - bool write_fault, bool *writable)
>> +/*
>> + * The atomic path to get the writable pfn which will be stored in @pfn,
>> + * true indicates success, otherwise false is returned.
>> + */
>> +static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
>> + bool write_fault, bool *writable, pfn_t *pfn)
>> {
>> struct page *page[1];
>> - int npages = 0;
>> - pfn_t pfn;
>> + int npages;
>>
>> - /* we can do it either atomically or asynchronously, not both */
>> - BUG_ON(atomic && async);
>> + if (!(async || atomic))
>> + return false;
>>
>> - BUG_ON(!write_fault && !writable);
>> + npages = __get_user_pages_fast(addr, 1, 1, page);
>> + if (npages == 1) {
>> + *pfn = page_to_pfn(page[0]);
>>
>> - if (writable)
>> - *writable = true;
>> + if (writable)
>> + *writable = true;
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>>
>> - if (atomic || async)
>> - npages = __get_user_pages_fast(addr, 1, 1, page);
>> +/*
>> + * The slow path to get the pfn of the specified host virtual address,
>> + * 1 indicates success, -errno is returned if error is detected.
>> + */
>> +static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
>> + bool *writable, pfn_t *pfn)
>> +{
>> + struct page *page[1];
>> + int npages = 0;
>>
>> - if (unlikely(npages != 1) && !atomic) {
>> - might_sleep();
>> + might_sleep();
>>
>> - if (writable)
>> - *writable = write_fault;
>> -
>> - if (async) {
>> - down_read(¤t->mm->mmap_sem);
>> - npages = get_user_page_nowait(current, current->mm,
>> - addr, write_fault, page);
>> - up_read(¤t->mm->mmap_sem);
>> - } else
>> - npages = get_user_pages_fast(addr, 1, write_fault,
>> - page);
>> -
>> - /* map read fault as writable if possible */
>> - if (unlikely(!write_fault) && npages == 1) {
>> - struct page *wpage[1];
>> -
>> - npages = __get_user_pages_fast(addr, 1, 1, wpage);
>> - if (npages == 1) {
>> - *writable = true;
>> - put_page(page[0]);
>> - page[0] = wpage[0];
>> - }
>> - npages = 1;
>> + if (writable)
>> + *writable = write_fault;
>> +
>> + if (async) {
>> + down_read(¤t->mm->mmap_sem);
>> + npages = get_user_page_nowait(current, current->mm,
>> + addr, write_fault, page);
>> + up_read(¤t->mm->mmap_sem);
>> + } else
>> + npages = get_user_pages_fast(addr, 1, write_fault,
>> + page);
>> + if (npages != 1)
>> + return npages;
>
> * Returns number of pages pinned. This may be fewer than the number
> * requested. If nr_pages is 0 or negative, returns 0. If no pages
> * were pinned, returns -errno.
> */
> int get_user_pages_fast(unsigned long start, int nr_pages, int write,
> struct page **pages)
>
>
> Current behaviour is
>
> if (atomic || async)
> npages = __get_user_pages_fast(addr, 1, 1, page);
>
> if (npages != 1)
> slow path retry;
>
> The changes above change this, don't they?
Marcelo,
Sorry, I do not know why you thought the logic was changed, in this patch,
the logic is:
/* return true if it is successful. */
if (hva_to_pfn_fast(addr, atomic, async, write_fault, writable, &pfn))
return pfn;
/* atomic can not go to slow path. */
if (atomic)
return KVM_PFN_ERR_FAULT;
/* get pfn by the slow path */
npages = hva_to_pfn_slow(addr, async, write_fault, writable, &pfn);
if (npages == 1)
return pfn;
/* the error-handle path. */
......
Did i miss something?
next prev parent reply other threads:[~2012-08-11 3:11 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-07 9:47 [PATCH v5 00/12] KVM: introduce readonly memslot Xiao Guangrong
2012-08-07 9:48 ` [PATCH v5 01/12] KVM: fix missing check for memslot flags Xiao Guangrong
2012-08-07 9:48 ` [PATCH v5 02/12] KVM: hide KVM_MEMSLOT_INVALID from userspace Xiao Guangrong
2012-08-09 18:48 ` Marcelo Tosatti
2012-08-10 2:11 ` Xiao Guangrong
2012-08-07 9:49 ` [PATCH v5 03/12] KVM: introduce gfn_to_pfn_memslot_atomic Xiao Guangrong
2012-08-09 18:50 ` Marcelo Tosatti
2012-08-10 3:22 ` Xiao Guangrong
2012-08-07 9:50 ` [PATCH v5 04/12] KVM: introduce gfn_to_hva_read/kvm_read_hva/kvm_read_hva_atomic Xiao Guangrong
2012-08-07 9:51 ` [PATCH v5 05/12] KVM: reorganize hva_to_pfn Xiao Guangrong
2012-08-10 17:51 ` Marcelo Tosatti
2012-08-11 3:11 ` Xiao Guangrong [this message]
2012-08-07 9:51 ` [PATCH v5 06/12] KVM: use 'writable' as a hint to map writable pfn Xiao Guangrong
2012-08-07 9:52 ` [PATCH v5 07/12] KVM: introduce KVM_PFN_ERR_RO_FAULT Xiao Guangrong
2012-08-07 9:52 ` [PATCH v5 08/12] KVM: introduce KVM_HVA_ERR_BAD Xiao Guangrong
2012-08-07 9:53 ` [PATCH v5 09/12] KVM: introduce KVM_HVA_ERR_RO_BAD Xiao Guangrong
2012-08-07 9:54 ` [PATCH v5 10/12] KVM: introduce readonly memslot Xiao Guangrong
2012-08-07 9:54 ` [PATCH v5 11/12] KVM: x86: introduce set_mmio_exit_info Xiao Guangrong
2012-08-10 18:03 ` Marcelo Tosatti
2012-08-11 3:13 ` Xiao Guangrong
2012-08-07 9:55 ` [PATCH v5 12/12] KVM: indicate readonly access fault Xiao Guangrong
2012-08-10 18:14 ` [PATCH v5 00/12] KVM: introduce readonly memslot Marcelo Tosatti
2012-08-11 3:36 ` Xiao Guangrong
2012-08-13 17:39 ` Marcelo Tosatti
2012-08-14 2:58 ` Xiao Guangrong
2012-08-14 15:25 ` Marcelo Tosatti
2012-08-16 5:49 ` Xiao Guangrong
2012-08-16 16:03 ` Marcelo Tosatti
2012-08-14 14:00 ` Avi Kivity
2012-08-14 15:51 ` Marcelo Tosatti
2012-08-15 10:44 ` Avi Kivity
2012-08-15 17:53 ` Marcelo Tosatti
2012-08-16 9:03 ` Avi Kivity
2012-08-16 15:57 ` Marcelo Tosatti
2012-08-16 16:17 ` Avi Kivity
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=5025CD77.2030100@linux.vnet.ibm.com \
--to=xiaoguangrong@linux.vnet.ibm.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@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.