lkml.org 
[lkml]   [2009]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2 05/12] Handle asynchronous page fault in a PV guest.
    On 11/23/2009 04:06 PM, Gleb Natapov wrote:
    > Asynchronous page fault notifies vcpu that page it is trying to access
    > is swapped out by a host. In response guest puts a task that caused the
    > fault to sleep until page is swapped in again. When missing page is
    > brought back into the memory guest is notified and task resumes execution.
    >
    > +
    > +static void apf_task_wait(struct task_struct *tsk, u32 token)
    > +{
    > + u32 key = hash_32(token, KVM_TASK_SLEEP_HASHBITS);
    > + struct kvm_task_sleep_head *b =&async_pf_sleepers[key];
    > + struct kvm_task_sleep_node n, *e;
    > + DEFINE_WAIT(wait);
    > +
    > + spin_lock(&b->lock);
    > + e = _find_apf_task(b, token);
    > + if (e) {
    > + /* dummy entry exist -> wake up was delivered ahead of PF */
    > + hlist_del(&e->link);
    > + kfree(e);
    > + spin_unlock(&b->lock);
    > + return;
    > + }
    > +
    > + n.token = token;
    > + init_waitqueue_head(&n.wq);
    > + hlist_add_head(&n.link,&b->list);
    > + spin_unlock(&b->lock);
    > +
    > + for (;;) {
    > + prepare_to_wait(&n.wq,&wait, TASK_UNINTERRUPTIBLE);
    > + if (hlist_unhashed(&n.link))
    > + break;
    >

    This looks safe without b->lock, but please add a comment explaining why
    it is safe.

    > +int kvm_handle_pf(struct pt_regs *regs, unsigned long error_code)
    > +{
    > + u32 reason, token;
    > +
    > + if (!per_cpu(apf_reason, smp_processor_id()).enabled)
    > + return 0;
    > +
    > + reason = per_cpu(apf_reason, smp_processor_id()).reason;
    > + per_cpu(apf_reason, smp_processor_id()).reason = 0;
    >

    Use __get_cpu_var(), shorter.

    > @@ -270,11 +399,14 @@ static void __init kvm_smp_prepare_boot_cpu(void)
    >
    > void __init kvm_guest_init(void)
    > {
    > + int i;
    >

    \n

    > if (!kvm_para_available())
    > return;
    >
    > paravirt_ops_setup();
    > register_reboot_notifier(&kvm_pv_reboot_nb);
    > + for (i = 0; i< KVM_TASK_SLEEP_HASHSIZE; i++)
    > + spin_lock_init(&async_pf_sleepers[i].lock);
    > #ifdef CONFIG_SMP
    > smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
    > #else
    >


    --
    error compiling committee.c: too many arguments to function



    \
     
     \ /
      Last update: 2009-11-25 13:49    [W:0.023 / U:1.128 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site