lkml.org 
[lkml]   [2012]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v5 06/12] KVM: use 'writable' as a hint to map writable pfn
    In current code, we always map writable pfn for the read-fault, in order
    to support readonly memslot, we map writable pfn only if 'writable'
    is not NULL

    Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
    ---
    virt/kvm/kvm_main.c | 24 +++++++++++++++++++++++-
    1 files changed, 23 insertions(+), 1 deletions(-)

    diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
    index dd01bcb..bf6dede 100644
    --- a/virt/kvm/kvm_main.c
    +++ b/virt/kvm/kvm_main.c
    @@ -1056,6 +1056,14 @@ static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
    if (!(async || atomic))
    return false;

    + /*
    + * Fast pin a writable pfn only if it is a write fault request
    + * or the caller allows to map a writable pfn for a read fault
    + * request.
    + */
    + if (!(write_fault || writable))
    + return false;
    +
    npages = __get_user_pages_fast(addr, 1, 1, page);
    if (npages == 1) {
    *pfn = page_to_pfn(page[0]);
    @@ -1095,7 +1103,7 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
    return npages;

    /* map read fault as writable if possible */
    - if (unlikely(!write_fault)) {
    + if (unlikely(!write_fault) && writable) {
    struct page *wpage[1];

    npages = __get_user_pages_fast(addr, 1, 1, wpage);
    @@ -1111,6 +1119,20 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
    return npages;
    }

    +/*
    + * Pin guest page in memory and return its pfn.
    + * @addr: host virtual address which maps memory to the guest
    + * @atomic: whether this function can sleep
    + * @async: whether this function need to wait IO complete if the
    + * host page is not in the memory
    + * @write_fault: whether we should get a writable host page
    + * @writable: whether it allows to map a writable host page for !@write_fault
    + *
    + * The function will map a writable host page for these two cases:
    + * 1): @write_fault = true
    + * 2): @write_fault = false && @writable, @writable will tell the caller
    + * whether the mapping is writable.
    + */
    static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async,
    bool write_fault, bool *writable)
    {
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-08-07 12:41    [W:0.025 / U:1.412 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site