On 4/8/11 6:23 AM, Andriy Gapon wrote:
on 08/04/2011 00:32 John Baldwin said the following:
Author: jhb
Date: Thu Apr  7 21:32:25 2011
New Revision: 220430
URL: http://svn.freebsd.org/changeset/base/220430

Log:
   If a system call does not request a full interrupt return, use a fast
   path via the sysretq instruction to return from the system call.  This was
   removed in 190620 and not quite fully restored in 195486.  This resolves
   most of the performance regression in system call microbenchmarks between
   7 and 8 on amd64.

   Reviewed by: kib
   MFC after:   1 week

I think that this commit (plus r220431) has broken something in my environment.
After updating to the most recent head I started to get semi-random problems in
various areas:
- named would consistently fail to start, but with different errors (assertions)
- ^Z and fg result in a process getting SIGSEGV
- X sometimes fails to start complaining about failed VT switch

Reverting just these two commits restores sanity.

Just in case, my processor is AMD (arch is obviously amd64).

I think I've found this (I got a bunch of weird core dumps overnight, too). The problem is that ast() can context switch in which case PCB_FULL_IRET might get set, but this code would still do the fast path after ast() returned. I fixed it to recheck the PCB_FULL_IRET flag after returning from ast() and that has fixed the core dumps I was seeing overnight. I also fixed a bug where PCB_FULL_IRET wasn't updated in some of the ia32 compat code, a typo in a comment, and trimmed an extra mov from the doreti path:

Index: amd64/exception.S
===================================================================
--- amd64/exception.S   (revision 221092)
+++ amd64/exception.S   (working copy)
@@ -382,10 +382,10 @@
        FAKE_MCOUNT(TF_RIP(%rsp))
        movq    %rsp,%rdi
        call    syscall
-       movq    PCPU(CURPCB),%rax
+1:     movq    PCPU(CURPCB),%rax
        testl   $PCB_FULL_IRET,PCB_FLAGS(%rax)
-       jne     3f
-1:     /* Check for and handle AST's on return to userland. */
+       jnz     3f
+       /* Check for and handle AST's on return to userland. */
        cli
        movq    PCPU(CURTHREAD),%rax
        testl   $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax)
@@ -661,7 +661,7 @@
 doreti_ast:
        /*
         * Check for ASTs atomically with returning.  Disabling CPU
-        * interrupts provides sufficient locking eve in the SMP case,
+        * interrupts provides sufficient locking even in the SMP case,
         * since we will be informed of any new ASTs by an IPI.
         */
        cli
@@ -682,8 +682,7 @@
         */
 doreti_exit:
        MEXITCOUNT
-       movq    PCPU(CURTHREAD),%r8
-       movq    TD_PCB(%r8),%r8
+       movq    PCPU(CURPCB),%r8

        /*
         * Do not reload segment registers for kernel.
Index: ia32/ia32_exception.S
===================================================================
--- ia32/ia32_exception.S       (revision 221079)
+++ ia32/ia32_exception.S       (working copy)
@@ -46,7 +46,7 @@
        subq    $TF_ERR,%rsp            /* skip over tf_trapno */
        movq    %rdi,TF_RDI(%rsp)
        movq    PCPU(CURPCB),%rdi
-       movb    $0,PCB_FULL_IRET(%rdi)
+       andl    $~PCB_FULL_IRET,PCB_FLAGS(%rdi)
        movw    %fs,TF_FS(%rsp)
        movw    %gs,TF_GS(%rsp)
        movw    %es,TF_ES(%rsp)

--
John Baldwin
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to