lkml.org 
[lkml]   [2018]   [Sep]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRE: [RFC][PATCH 3/5] [PATCH 3/5] kvm-ept-idle: HVA indexed EPT read
    Date
    kvm_get_kvm() kvm_put_kvm()

    -----Original Message-----
    From: Nikita Leshenko [mailto:nikita.leshchenko@oracle.com]
    Sent: Tuesday, September 4, 2018 3:57 PM
    To: Wu, Fengguang <fengguang.wu@intel.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>; Linux Memory Management List <linux-mm@kvack.org>; Peng, DongX <dongx.peng@intel.com>; Liu, Jingqi <jingqi.liu@intel.com>; Dong, Eddie <eddie.dong@intel.com>; Hansen, Dave <dave.hansen@intel.com>; Huang, Ying <ying.huang@intel.com>; Brendan Gregg <bgregg@netflix.com>; kvm@vger.kernel.org; LKML <linux-kernel@vger.kernel.org>
    Subject: Re: [RFC][PATCH 3/5] [PATCH 3/5] kvm-ept-idle: HVA indexed EPT read

    On 1 Sep 2018, at 13:28, Fengguang Wu <fengguang.wu@intel.com> wrote:
    > +static ssize_t ept_idle_read(struct file *file, char *buf,
    > + size_t count, loff_t *ppos)
    > +{
    > + struct task_struct *task = file->private_data;
    > + struct ept_idle_ctrl *eic;
    > + unsigned long hva_start = *ppos << BITMAP_BYTE2PVA_SHIFT;
    > + unsigned long hva_end = hva_start + (count << BITMAP_BYTE2PVA_SHIFT);
    > + int ret;
    > +
    > + if (*ppos % IDLE_BITMAP_CHUNK_SIZE ||
    > + count % IDLE_BITMAP_CHUNK_SIZE)
    > + return -EINVAL;
    > +
    > + eic = kzalloc(sizeof(*eic), GFP_KERNEL);
    > + if (!eic)
    > + return -EBUSY;
    > +
    > + eic->buf = buf;
    > + eic->buf_size = count;
    > + eic->kvm = task_kvm(task);
    > + if (!eic->kvm) {
    > + ret = -EINVAL;
    > + goto out_free;
    > + }
    I think you need to increment the refcount while using kvm, otherwise kvm can be destroyed from another thread while you're walking it.

    -Nikita
    > +
    > + ret = ept_idle_walk_hva_range(eic, hva_start, hva_end);
    > + if (ret)
    > + goto out_free;
    > +
    > + ret = eic->bytes_copied;
    > + *ppos += ret;
    > +out_free:
    > + kfree(eic);
    > +
    > + return ret;
    > +}

    \
     
     \ /
      Last update: 2018-09-04 10:12    [W:4.993 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site