All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Gleb Natapov <gleb@redhat.com>
Cc: Li Zhong <zhong@linux.vnet.ibm.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	linux-next list <linux-next@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	sasha.levin@oracle.com, avi@redhat.com
Subject: Re: [RFC PATCH v3] Add rcu user eqs exception hooks for async page fault
Date: Tue, 4 Dec 2012 06:28:08 -0800	[thread overview]
Message-ID: <20121204142808.GQ2605@linux.vnet.ibm.com> (raw)
In-Reply-To: <20121204130251.GJ19514@redhat.com>

On Tue, Dec 04, 2012 at 03:02:51PM +0200, Gleb Natapov wrote:
> On Tue, Dec 04, 2012 at 10:36:02AM +0800, Li Zhong wrote:
> > On Mon, 2012-12-03 at 11:57 +0200, Gleb Natapov wrote:
> > > Please regenerate the patch against
> > > git://git.kernel.org/pub/scm/virt/kvm/kvm.git queue.
> > 
> > Done.
> > 
> > By the way, the included file <asm/rcu.h> is replaced with
> > <asm/context_tracking.h> in latest next tree(91d1aa43 from rcu tree). 
> > 
> > Seems if they are merged, there won't be conflicts, but we need change
> > the including file name after that. I don't know how to handle this kind
> > of thing... 
> > 
> Either merge rcu/next into kvm/next before sending to Linus, or waiting
> for -rc1 and ask Linus to pull this one patch separately.

I just sent a pull request for 91d1aa43 to -tip, so hopefully things will
resolve reasonably.

							Thanx, Paul

> > Thanks, Zhong
> > 
> > > 
> > > On Fri, Nov 30, 2012 at 05:18:41PM +0800, Li Zhong wrote:
> > > > This patch adds user eqs exception hooks for async page fault page not
> > > > present code path, to exit the user eqs and re-enter it as necessary. 
> > > > 
> > > > Async page fault is different from other exceptions that it may be
> > > > triggered from idle process, so we still need rcu_irq_enter() and
> > > > rcu_irq_exit() to exit cpu idle eqs when needed, to protect the code
> > > > that needs use rcu.
> > > > 
> > > > As Frederic pointed out it would be safest and simplest to protect the
> > > > whole kvm_async_pf_task_wait(). Otherwise, "we need to check all the
> > > > code there deeply for potential RCU uses and ensure it will never be
> > > > extended later to use RCU.".
> > > > 
> > > > However, We'd better re-enter the cpu idle eqs if we get the exception
> > > > in cpu idle eqs, by calling rcu_irq_exit() before native_safe_halt(). 
> > > > 
> > > > So the patch does what Frederic suggested for rcu_irq_*() API usage
> > > > here, except that I moved the rcu_irq_*() pair originally in
> > > > do_async_page_fault() into kvm_async_pf_task_wait(). 
> > > > 
> > > > That's because, I think it's better to have rcu_irq_*() pairs to be in
> > > > one function ( rcu_irq_exit() after rcu_irq_enter() ), especially here,
> > > > kvm_async_pf_task_wait() has other callers, which might cause
> > > > rcu_irq_exit() be called without a matching rcu_irq_enter() before it,
> > > > which is illegal if the cpu happens to be in rcu idle state. 
> > > > 
> > > > Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
> > > > ---
> > > >  arch/x86/kernel/kvm.c | 12 ++++++++++--
> > > >  1 file changed, 10 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> > > > index 4180a87..342b00b 100644
> > > > --- a/arch/x86/kernel/kvm.c
> > > > +++ b/arch/x86/kernel/kvm.c
> > > > @@ -42,6 +42,7 @@
> > > >  #include <asm/apic.h>
> > > >  #include <asm/apicdef.h>
> > > >  #include <asm/hypervisor.h>
> > > > +#include <asm/rcu.h>
> > > >  
> > > >  static int kvmapf = 1;
> > > >  
> > > > @@ -112,6 +113,8 @@ void kvm_async_pf_task_wait(u32 token)
> > > >  	DEFINE_WAIT(wait);
> > > >  	int cpu, idle;
> > > >  
> > > > +	rcu_irq_enter();
> > > > +
> > > >  	cpu = get_cpu();
> > > >  	idle = idle_cpu(cpu);
> > > >  	put_cpu();
> > > > @@ -123,6 +126,8 @@ void kvm_async_pf_task_wait(u32 token)
> > > >  		hlist_del(&e->link);
> > > >  		kfree(e);
> > > >  		spin_unlock(&b->lock);
> > > > +
> > > > +		rcu_irq_exit();
> > > >  		return;
> > > >  	}
> > > >  
> > > > @@ -147,13 +152,16 @@ void kvm_async_pf_task_wait(u32 token)
> > > >  			/*
> > > >  			 * We cannot reschedule. So halt.
> > > >  			 */
> > > > +			rcu_irq_exit();
> > > >  			native_safe_halt();
> > > > +			rcu_irq_enter();
> > > >  			local_irq_disable();
> > > >  		}
> > > >  	}
> > > >  	if (!n.halted)
> > > >  		finish_wait(&n.wq, &wait);
> > > >  
> > > > +	rcu_irq_exit();
> > > >  	return;
> > > >  }
> > > >  EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);
> > > > @@ -247,10 +255,10 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code)
> > > >  		break;
> > > >  	case KVM_PV_REASON_PAGE_NOT_PRESENT:
> > > >  		/* page is swapped out by the host. */
> > > > -		rcu_irq_enter();
> > > > +		exception_enter(regs);
> > > >  		exit_idle();
> > > >  		kvm_async_pf_task_wait((u32)read_cr2());
> > > > -		rcu_irq_exit();
> > > > +		exception_exit(regs);
> > > >  		break;
> > > >  	case KVM_PV_REASON_PAGE_READY:
> > > >  		rcu_irq_enter();
> > > > -- 
> > > > 1.7.11.4
> > > 
> > > --
> > > 			Gleb.
> > > --
> > > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > > the body of a message to majordomo@vger.kernel.org
> > > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > > Please read the FAQ at  http://www.tux.org/lkml/
> > > 
> > 
> 
> --
> 			Gleb.
> 

  reply	other threads:[~2012-12-04 14:28 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-27  5:15 [RFC PATCH] Fix abnormal rcu dynticks_nesting values related to async page fault Li Zhong
2012-11-27  5:58 ` [PATCH rcu] use new nesting value for rcu_dyntick trace in rcu_eqs_enter_common Li Zhong
2012-11-27 15:18   ` Paul E. McKenney
2012-11-27 13:07 ` [RFC PATCH] Fix abnormal rcu dynticks_nesting values related to async page fault Gleb Natapov
2012-11-27 14:01   ` Sasha Levin
2012-11-27 15:25     ` Paul E. McKenney
2012-11-27 15:34   ` Frederic Weisbecker
2012-11-27 14:38 ` Frederic Weisbecker
2012-11-27 15:44   ` Gleb Natapov
2012-11-27 15:56     ` Frederic Weisbecker
2012-11-27 16:19       ` Paul E. McKenney
2012-11-27 16:48         ` Frederic Weisbecker
2012-11-27 16:59           ` Paul E. McKenney
2012-11-27 16:39       ` Gleb Natapov
2012-11-27 16:51         ` Frederic Weisbecker
2012-11-27 17:00           ` Gleb Natapov
2012-11-27 17:30             ` Frederic Weisbecker
2012-11-27 17:47               ` Gleb Natapov
2012-11-27 18:12                 ` Frederic Weisbecker
2012-11-27 19:27                   ` Gleb Natapov
2012-11-27 22:53                     ` Frederic Weisbecker
2012-11-27 22:54                       ` Frederic Weisbecker
2012-11-27 15:39 ` Frederic Weisbecker
2012-11-27 16:16   ` Paul E. McKenney
2012-11-27 16:31     ` Frederic Weisbecker
2012-11-27 16:29 ` Frederic Weisbecker
2012-11-28  8:18   ` [RFC PATCH v2] Add rcu user eqs exception hooks for " Li Zhong
2012-11-28 12:55     ` Frederic Weisbecker
2012-11-28 13:53       ` Gleb Natapov
2012-11-28 14:25         ` Frederic Weisbecker
2012-11-29 11:07           ` Gleb Natapov
2012-11-29 14:47             ` Frederic Weisbecker
2012-11-30  9:18               ` [RFC PATCH v3] " Li Zhong
2012-11-30 10:26                 ` Gleb Natapov
2012-12-03  2:08                   ` Li Zhong
2012-12-03  8:30                     ` Gleb Natapov
2012-12-03  9:57                 ` Gleb Natapov
2012-12-04  2:35                   ` [ PATCH] " Li Zhong
2012-12-18 13:25                     ` Gleb Natapov
2012-12-04  2:36                   ` [RFC PATCH v3] " Li Zhong
2012-12-04  5:11                     ` Gleb Natapov
2012-12-04  5:40                       ` Li Zhong
2012-12-04 13:02                     ` Gleb Natapov
2012-12-04 14:28                       ` Paul E. McKenney [this message]
2012-11-29  1:49       ` [RFC PATCH v2] " Li Zhong
2012-11-29 14:40         ` Frederic Weisbecker
2012-11-29 17:25           ` Gleb Natapov
2012-11-30  8:36             ` Li Zhong
2012-11-30 10:08               ` Gleb Natapov
2012-11-27 16:43 ` [RFC PATCH] Fix abnormal rcu dynticks_nesting values related to " Frederic Weisbecker

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=20121204142808.GQ2605@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=avi@redhat.com \
    --cc=fweisbec@gmail.com \
    --cc=gleb@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=sasha.levin@oracle.com \
    --cc=zhong@linux.vnet.ibm.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.