lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20101006104132.GS11145@redhat.com>
Date:	Wed, 6 Oct 2010 12:41:32 +0200
From:	Gleb Natapov <gleb@...hat.com>
To:	Marcelo Tosatti <mtosatti@...hat.com>
Cc:	kvm@...r.kernel.org, linux-mm@...ck.org,
	linux-kernel@...r.kernel.org, avi@...hat.com, mingo@...e.hu,
	a.p.zijlstra@...llo.nl, tglx@...utronix.de, hpa@...or.com,
	riel@...hat.com, cl@...ux-foundation.org
Subject: Re: [PATCH v6 10/12] Handle async PF in non preemptable context

On Tue, Oct 05, 2010 at 04:51:50PM -0300, Marcelo Tosatti wrote:
> On Mon, Oct 04, 2010 at 05:56:32PM +0200, Gleb Natapov wrote:
> > If async page fault is received by idle task or when preemp_count is
> > not zero guest cannot reschedule, so do sti; hlt and wait for page to be
> > ready. vcpu can still process interrupts while it waits for the page to
> > be ready.
> > 
> > Acked-by: Rik van Riel <riel@...hat.com>
> > Signed-off-by: Gleb Natapov <gleb@...hat.com>
> > ---
> >  arch/x86/kernel/kvm.c |   40 ++++++++++++++++++++++++++++++++++------
> >  1 files changed, 34 insertions(+), 6 deletions(-)
> > 
> > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> > index 36fb3e4..f73946f 100644
> > --- a/arch/x86/kernel/kvm.c
> > +++ b/arch/x86/kernel/kvm.c
> > @@ -37,6 +37,7 @@
> >  #include <asm/cpu.h>
> >  #include <asm/traps.h>
> >  #include <asm/desc.h>
> > +#include <asm/tlbflush.h>
> >  
> >  #define MMU_QUEUE_SIZE 1024
> >  
> > @@ -78,6 +79,8 @@ struct kvm_task_sleep_node {
> >  	wait_queue_head_t wq;
> >  	u32 token;
> >  	int cpu;
> > +	bool halted;
> > +	struct mm_struct *mm;
> >  };
> >  
> >  static struct kvm_task_sleep_head {
> > @@ -106,6 +109,11 @@ void kvm_async_pf_task_wait(u32 token)
> >  	struct kvm_task_sleep_head *b = &async_pf_sleepers[key];
> >  	struct kvm_task_sleep_node n, *e;
> >  	DEFINE_WAIT(wait);
> > +	int cpu, idle;
> > +
> > +	cpu = get_cpu();
> > +	idle = idle_cpu(cpu);
> > +	put_cpu();
> >  
> >  	spin_lock(&b->lock);
> >  	e = _find_apf_task(b, token);
> > @@ -119,19 +127,33 @@ void kvm_async_pf_task_wait(u32 token)
> >  
> >  	n.token = token;
> >  	n.cpu = smp_processor_id();
> > +	n.mm = current->active_mm;
> > +	n.halted = idle || preempt_count() > 1;
> > +	atomic_inc(&n.mm->mm_count);
> 
> Can't see why this reference is needed.
I thought that if kernel thread does fault on behalf of some
process mm can go away while kernel thread is sleeping. But it looks
like kernel thread increase reference to mm it runs with by himself, so
may be this is redundant (but not harmful).

--
			Gleb.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ