On 10/12/07, Jeremy Fitzhardinge <[EMAIL PROTECTED]> wrote: > [ Changes since last post: fixed up lguest ] > > Currently, the set_lazy_mode pv_op is overloaded with 5 functions: > 1. enter lazy cpu mode > 2. leave lazy cpu mode > 3. enter lazy mmu mode > 4. leave lazy mmu mode > 5. flush pending batched operations > > This complicates each paravirt backend, since it needs to deal with > all the possible state transitions, handling flushing, etc. In > particular, flushing is quite distinct from the other 4 functions, and > seems to just cause complication. > > This patch removes the set_lazy_mode operation, and adds "enter" and > "leave" lazy mode operations on mmu_ops and cpu_ops. All the logic > associated with enter and leaving lazy states is now in common code > (basically BUG_ONs to make sure that no mode is current when entering > a lazy mode, and make sure that the mode is current when leaving). > Also, flush is handled in a common way, by simply leaving and > re-entering the lazy mode. > > The result is that the Xen, lguest and VMI lazy mode implementations > are much simpler. > > Signed-off-by: Jeremy Fitzhardinge <[EMAIL PROTECTED]> > Cc: Andi Kleen <[EMAIL PROTECTED]> > Cc: Zach Amsden <[EMAIL PROTECTED]> > Cc: Rusty Russell <[EMAIL PROTECTED]> > Cc: Avi Kivity <[EMAIL PROTECTED]> > Cc: Anthony Liguory <[EMAIL PROTECTED]> > Cc: "Glauber de Oliveira Costa" <[EMAIL PROTECTED]> > Cc: "Nakajima, Jun" <[EMAIL PROTECTED]> > > --- > arch/i386/kernel/paravirt.c | 58 > +++++++++++++++++++++++++++++++++++++++---- > arch/i386/kernel/vmi.c | 45 +++++++++++++++++++-------------- > arch/i386/xen/enlighten.c | 44 ++++++++++---------------------- > arch/i386/xen/mmu.c | 2 - > arch/i386/xen/multicalls.h | 2 - > arch/i386/xen/xen-ops.h | 7 ----- > drivers/lguest/lguest.c | 34 ++++++++----------------- > include/asm-i386/paravirt.h | 52 ++++++++++++++++++++++++-------------- > 8 files changed, 140 insertions(+), 104 deletions(-) > > =================================================================== > --- a/arch/i386/kernel/paravirt.c > +++ b/arch/i386/kernel/paravirt.c > @@ -266,6 +266,49 @@ int paravirt_disable_iospace(void) > } > > return ret; > +} > + > +static DEFINE_PER_CPU(enum paravirt_lazy_mode, paravirt_lazy_mode) = > PARAVIRT_LAZY_NONE; > + > +static inline void enter_lazy(enum paravirt_lazy_mode mode) > +{ > + BUG_ON(x86_read_percpu(paravirt_lazy_mode) != PARAVIRT_LAZY_NONE); > + BUG_ON(preemptible()); Wouldn't it be better to WARN_ON, and simply not entering lazy mode? It does not sound like a fatal condition.
> +void paravirt_leave_lazy(enum paravirt_lazy_mode mode) > +{ > + BUG_ON(x86_read_percpu(paravirt_lazy_mode) != mode); > + BUG_ON(preemptible()); Although this one seems like a fatal condition ;-) > +void paravirt_enter_lazy_mmu(void) > +{ > + enter_lazy(PARAVIRT_LAZY_MMU); > +} > + > +void paravirt_leave_lazy_mmu(void) > +{ > + paravirt_leave_lazy(PARAVIRT_LAZY_MMU); > +} > + > +void paravirt_enter_lazy_cpu(void) > +{ > + enter_lazy(PARAVIRT_LAZY_CPU); > +} > + > +void paravirt_leave_lazy_cpu(void) > +{ > + paravirt_leave_lazy(PARAVIRT_LAZY_CPU); > +} > + > +enum paravirt_lazy_mode paravirt_get_lazy_mode(void) > +{ > + return x86_read_percpu(paravirt_lazy_mode); > } I am concerned that this is 32-bit specific. But hey: We could wrap it here, but the best solution may be just to define this macro for 64-bit, and make it everyone benefits. So yeah, this is a concern here, but I don't think anything should be changed in this patch to address it so... so... ok ;-) -- Glauber de Oliveira Costa. "Free as in Freedom" http://glommer.net "The less confident you are, the more serious you have to act." - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/