Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/bouyer-xenpvh]: src/sys/arch Move softint and preemtion-related function...



details:   https://anonhg.NetBSD.org/src/rev/dd4d1c186f2b
branches:  bouyer-xenpvh
changeset: 930671:dd4d1c186f2b
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Sat Apr 11 18:26:06 2020 +0000

description:
Move softint and preemtion-related functions out of x86/x86/intr.c to
  its own file, x86/x86/x86_softintr.c
Add x86/x86/x86_softintr.c for native and XenPV
Make sure XenPV also check ci_ioending, which is used for softints.
Switch XenPV to fast softints and allow kernel preemption.
kpreempt_disable() before calling pmap_changeprot_local()
run  xen_wallclock_time() and xen_global_systime_ns() at splshed() to
  avoid being interrupted.

XXX amd64 lock stubs are racy for XPENDING

diffstat:

 sys/arch/amd64/amd64/lock_stubs.S |    7 +-
 sys/arch/amd64/amd64/spl.S        |   24 +-
 sys/arch/i386/i386/spl.S          |   24 +-
 sys/arch/x86/conf/files.x86       |    3 +-
 sys/arch/x86/include/intr.h       |    7 +-
 sys/arch/x86/x86/intr.c           |  161 +-------------------
 sys/arch/x86/x86/x86_machdep.c    |    8 +-
 sys/arch/x86/x86/x86_softintr.c   |  289 ++++++++++++++++++++++++++++++++++++++
 sys/arch/xen/conf/files.xen       |    3 +-
 sys/arch/xen/include/intrdefs.h   |    7 +-
 sys/arch/xen/x86/xen_ipi.c        |   16 +-
 sys/arch/xen/x86/xenfunc.c        |   12 +-
 sys/arch/xen/xen/clock.c          |   11 +-
 13 files changed, 367 insertions(+), 205 deletions(-)

diffs (truncated from 1098 to 300 lines):

diff -r 4703054c7fe3 -r dd4d1c186f2b sys/arch/amd64/amd64/lock_stubs.S
--- a/sys/arch/amd64/amd64/lock_stubs.S Sat Apr 11 12:01:42 2020 +0000
+++ b/sys/arch/amd64/amd64/lock_stubs.S Sat Apr 11 18:26:06 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lock_stubs.S,v 1.35 2019/12/08 20:00:56 ad Exp $       */
+/*     $NetBSD: lock_stubs.S,v 1.35.6.1 2020/04/11 18:26:06 bouyer Exp $       */
 
 /*
  * Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -126,15 +126,12 @@
        jnz     1f
        cmpl    CPU_INFO_ILEVEL(%r8), %edi
        jae     1f
-#if !defined(XENPV)
        movl    CPU_INFO_IUNMASK(%r8,%rdi,4), %esi
        CLI(ax)
        testl   CPU_INFO_IPENDING(%r8), %esi
        jnz     _C_LABEL(Xspllower)
-#endif
 #if defined(XEN)
        movl    CPU_INFO_XUNMASK(%r8,%rdi,4), %esi
-       CLI(ax)
        testl   CPU_INFO_XPENDING(%r8), %esi
        jnz     _C_LABEL(Xspllower)
 #endif
@@ -155,14 +152,12 @@
        cmpl    %edx,%ecx                       /* new level is lower? */
        jae     2f
 1:
-#if !defined(XENPV)
        movl    CPU_INFO_IPENDING(%rsi),%eax
        testl   %eax,CPU_INFO_IUNMASK(%rsi,%rcx,4)/* deferred interrupts? */
        jnz     3f
        movl    %eax,%ebx
        cmpxchg8b CPU_INFO_ISTATE(%rsi)         /* swap in new ilevel */
        jnz     4f
-#endif
 #if defined(XEN)
        movl    CPU_INFO_XPENDING(%rsi),%eax
        testl   %eax,CPU_INFO_XUNMASK(%rsi,%rcx,4)/* deferred interrupts? */
diff -r 4703054c7fe3 -r dd4d1c186f2b sys/arch/amd64/amd64/spl.S
--- a/sys/arch/amd64/amd64/spl.S        Sat Apr 11 12:01:42 2020 +0000
+++ b/sys/arch/amd64/amd64/spl.S        Sat Apr 11 18:26:06 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: spl.S,v 1.43.4.4 2020/04/11 10:11:30 bouyer Exp $      */
+/*     $NetBSD: spl.S,v 1.43.4.5 2020/04/11 18:26:06 bouyer Exp $      */
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -91,7 +91,6 @@
        ret
 END(splraise)
 
-#ifndef XENPV
 /*
  * Xsoftintr()
  *
@@ -148,11 +147,11 @@
        movq    PCB_RSP0(%rdx),%rsp
 
        /* dispatch */
-       sti
+       STI(di)
        movq    %r15,%rdi               /* interrupted LWP */
        movl    IS_MAXLEVEL(%rax),%esi  /* ipl to run at */
        call    _C_LABEL(softint_dispatch)/* run handlers */
-       cli
+       CLI(di)
 
        /* restore old context */
        movq    L_PCB(%r15),%rcx
@@ -174,7 +173,7 @@
  */
 ENTRY(softintr_ret)
        incl    CPUVAR(MTX_COUNT)       /* re-adjust after mi_switch */
-       cli
+       CLI(ax)         /* %rax not used by Xspllower/Xdoreti */
        jmp     *%r13                   /* back to Xspllower/Xdoreti */
 END(softintr_ret)
 
@@ -196,11 +195,11 @@
  */
 IDTVEC(recurse_preempt)
        movl    $IPL_PREEMPT,CPUVAR(ILEVEL)
-       sti
+       STI(di)
        xorq    %rdi,%rdi
        KMSAN_INIT_ARG(8)
        call    _C_LABEL(kpreempt)
-       cli
+       CLI(di)
        jmp     *%r13                   /* back to Xspllower */
 IDTVEC_END(recurse_preempt)
 
@@ -211,20 +210,19 @@
  */
 IDTVEC(resume_preempt)
        movl    $IPL_PREEMPT,CPUVAR(ILEVEL)
-       sti
+       STI(ax)
        testq   $SEL_RPL,TF_CS(%rsp)
        jnz     1f
        movq    TF_RIP(%rsp),%rdi
        KMSAN_INIT_ARG(8)
        call    _C_LABEL(kpreempt)      /* from kernel */
-       cli
+       CLI(ax)
        jmp     *%r13                   /* back to Xdoreti */
 1:
        call    _C_LABEL(preempt)       /* from user */
-       cli
+       CLI(ax)
        jmp     *%r13                   /* back to Xdoreti */
 IDTVEC_END(resume_preempt)
-#endif /* XEN */
 
 /*
  * void spllower(int s);
@@ -336,7 +334,6 @@
        movl    %edi,%ebx
        leaq    1f(%rip),%r13           /* address to resume loop at */
 1:
-#if !defined(XENPV)
        movl    %ebx,%eax               /* get cpl */
        movl    CPUVAR(IUNMASK)(,%rax,4),%eax
        CLI(si)
@@ -346,7 +343,6 @@
        btrl    %eax,CPUVAR(IPENDING)
        movq    CPUVAR(ISOURCES)(,%rax,8),%rax
        jmp     *IS_RECURSE(%rax)
-#endif
 2:
 #if defined(XEN)
        movl    %ebx,%eax               /* get cpl */
@@ -382,7 +378,6 @@
        decl    CPUVAR(IDEPTH)
        leaq    1f(%rip),%r13
 1:
-#if !defined(XENPV)
        movl    %ebx,%eax
        movl    CPUVAR(IUNMASK)(,%rax,4),%eax
        CLI(si)
@@ -392,7 +387,6 @@
        btrl    %eax,CPUVAR(IPENDING)
        movq    CPUVAR(ISOURCES)(,%rax,8),%rax
        jmp     *IS_RESUME(%rax)
-#endif
 2:
 #if defined(XEN)
        movl    %ebx,%eax
diff -r 4703054c7fe3 -r dd4d1c186f2b sys/arch/i386/i386/spl.S
--- a/sys/arch/i386/i386/spl.S  Sat Apr 11 12:01:42 2020 +0000
+++ b/sys/arch/i386/i386/spl.S  Sat Apr 11 18:26:06 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: spl.S,v 1.50.4.3 2020/04/11 12:01:42 bouyer Exp $      */
+/*     $NetBSD: spl.S,v 1.50.4.4 2020/04/11 18:26:07 bouyer Exp $      */
 
 /*
  * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.3 2020/04/11 12:01:42 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.4 2020/04/11 18:26:07 bouyer Exp $");
 
 #include "opt_ddb.h"
 #include "opt_spldebug.h"
@@ -213,7 +213,6 @@
        jz      .Lspllower_panic
 #endif /* XENPV */
 #endif /* defined(DEBUG) */
-#if !defined(XENPV)
        movl    %ebx,%eax                       /* get cpl */
        movl    CPUVAR(IUNMASK)(,%eax,4),%eax
        andl    CPUVAR(IPENDING),%eax           /* any non-masked bits left? */
@@ -222,7 +221,6 @@
        btrl    %eax,CPUVAR(IPENDING)
        movl    CPUVAR(ISOURCES)(,%eax,4),%eax
        jmp     *IS_RECURSE(%eax)
-#endif
 2:
 #if defined(XEN)
        movl    %ebx,%eax                       /* get cpl */
@@ -361,7 +359,6 @@
 #endif
 IDTVEC_END(doreti)
 
-#ifndef XENPV
 /*
  * Xsoftintr()
  *
@@ -379,6 +376,7 @@
        pushl   %esi
        pushl   %edi
        movl    $IPL_HIGH,CPUVAR(ILEVEL)
+       STI(%esi)
        movl    CPUVAR(CURLWP),%esi
        movl    IS_LWP(%eax),%edi       /* switch to handler LWP */
        movl    %edi,CPUVAR(CURLWP)
@@ -387,12 +385,11 @@
        movl    %esp,PCB_ESP(%ecx)
        movl    %ebp,PCB_EBP(%ecx)
        movl    PCB_ESP0(%edx),%esp     /* onto new stack */
-       sti
        pushl   IS_MAXLEVEL(%eax)       /* ipl to run at */
        pushl   %esi
        call    _C_LABEL(softint_dispatch)/* run handlers */
        addl    $8,%esp
-       cli
+       CLI(%ecx)
        movl    L_PCB(%esi),%ecx
        movl    PCB_ESP(%ecx),%esp
        xchgl   %esi,CPUVAR(CURLWP)     /* must be globally visible */
@@ -412,7 +409,7 @@
  */
 ENTRY(softintr_ret)
        incl    CPUVAR(MTX_COUNT)       /* re-adjust after mi_switch */
-       cli
+       CLI(%eax)
        jmp     *%esi                   /* back to splx/doreti */
 END(softintr_ret)
 
@@ -434,11 +431,11 @@
  */
 IDTVEC(recurse_preempt)
        movl    $IPL_PREEMPT,CPUVAR(ILEVEL)
-       sti
+       STI(%eax)
        pushl   $0
        call    _C_LABEL(kpreempt)
        addl    $4,%esp
-       cli
+       CLI(%eax)
        jmp     *%esi
 IDTVEC_END(recurse_preempt)
 
@@ -449,18 +446,17 @@
  */
 IDTVEC(resume_preempt)
        movl    $IPL_PREEMPT,CPUVAR(ILEVEL)
-       sti
+       STI(%eax)
        testb   $CHK_UPL,TF_CS(%esp)
        jnz     1f
        movl    TF_EIP(%esp),%eax
        pushl   %eax
        call    _C_LABEL(kpreempt)              /* from kernel */
        addl    $4,%esp
-       cli
+       CLI(%eax)
        jmp     *%esi
 1:
        call    _C_LABEL(preempt)               /* from user */
-       cli
+       CLI(%eax)
        jmp     *%esi
 IDTVEC_END(resume_preempt)
-#endif /* !XENPV */
diff -r 4703054c7fe3 -r dd4d1c186f2b sys/arch/x86/conf/files.x86
--- a/sys/arch/x86/conf/files.x86       Sat Apr 11 12:01:42 2020 +0000
+++ b/sys/arch/x86/conf/files.x86       Sat Apr 11 18:26:06 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.x86,v 1.107 2019/02/15 08:54:01 nonaka Exp $
+#      $NetBSD: files.x86,v 1.107.10.1 2020/04/11 18:26:07 bouyer Exp $
 
 # options for MP configuration through the MP spec
 defflag opt_mpbios.h MPBIOS MPDEBUG MPBIOS_SCANPCI
@@ -93,6 +93,7 @@
 file   arch/x86/x86/identcpu.c         machdep
 file   arch/x86/x86/i8259.c            machdep
 file   arch/x86/x86/intr.c             machdep
+file   arch/x86/x86/x86_softintr.c     machdep
 file   arch/x86/x86/kgdb_machdep.c     kgdb
 file   arch/x86/x86/nmi.c              machdep
 file   arch/x86/x86/idt.c              machdep
diff -r 4703054c7fe3 -r dd4d1c186f2b sys/arch/x86/include/intr.h
--- a/sys/arch/x86/include/intr.h       Sat Apr 11 12:01:42 2020 +0000
+++ b/sys/arch/x86/include/intr.h       Sat Apr 11 18:26:06 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: intr.h,v 1.61.6.1 2020/04/10 14:42:00 bouyer Exp $     */
+/*     $NetBSD: intr.h,v 1.61.6.2 2020/04/11 18:26:07 bouyer Exp $     */
 
 /*-
  * Copyright (c) 1998, 2001, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
@@ -32,12 +32,10 @@
 #ifndef _X86_INTR_H_
 #define _X86_INTR_H_
 
-#if !defined(XENPV)
 #define        __HAVE_FAST_SOFTINTS
 #if !defined(NO_PREEMPTION)
 #define        __HAVE_PREEMPTION
 #endif /* !defined(NO_PREEMPTION) */
-#endif /*  !defined(XENPV) */
 
 #ifdef _KERNEL
 #include <sys/types.h>
@@ -239,6 +237,9 @@
 struct intrsource *intr_allocate_io_intrsource(const char *);



Home | Main Index | Thread Index | Old Index