I understand why interrupts use the doreti mechanism.  I don't understand
    why the syscall interface traps have to use it.  As far as I can tell,
    the cpl stuff does not have to be checked at all, the spl does not have
    to be set to 0 (it damn well better already be 0!), pending interrupts
    should not have to be checked because interrupts are operating just fine
    and any code that raises the spl will have dropped it prior to returning,
    So really only astpending needs to be checked... which can be done inside
    syscall() rather then doreti.

    What am I doing?  I'm experimenting with trying to remove the MP lock 
    from the syscall path (in exception.s and trap.c).  I added a per-syscall
    flag to tell syscall() whether any given syscall is MP safe or not,
    and if the syscall IS MP safe then the entire nominal path can be run
    without obtaining the MP lock.

    Alfred tried to do this several months ago but the SMP code was still
    too messy.  The SMP code is still messy, but there has been lots of
    cleanup between then and now.

    Yes, I have, in fact, successfully taken the MP lock out of the entire 
    syscall path (ok ok, I get the lock for things like ktrace and other
    non-critical-path items).  I'm running a buildworld right now and it
    hasn't crashed yet!

    This is surprising because it is almost 4:00 a.m. and the blessed thing
    actually rebooted normally the first time after I hacked in the changes.

    On a 2-way SMP P-III 450 a single process timing getuid() calls results 
    in about 1.06 uS (instead of 1.6 uS) per call, and when I have two
    processes timing they can each do it in 1.3 uS (instead of 4.8 uS with
    the MP lock).  Hoya!  Even the syscalls that need the MP lock gain a
    little.

    It was all very straightforward except for the doreti stuff that
    the two syscall gates in i386/i386/excep4tion.s return through.
    Now, I know I MUST be missing something... but the friggin system
    is working!  No lockups or anything.  I'm confident that if I *AM* 
    missing something it will be relatively easy to fix.   For the doreti
    stuff I, well, I ripped it out and replaced it with a few pops and an
    iret.  

    So question #1:  Why is my system still working, what I did has *got*
    to be illegal!  The darned thing is doing a buildworld as I type...
    still no crash.  It isn't getting stuck.  Nothing, nada.  Normal
    boring operation.  Not even a cool panic!

    I also have a second question.  As far as I can tell, the fuword() and
    copyin() functions are SMP safe (don't need the MP lock).  As far as I
    can tell if they cause a fault the fault trap will obtain the MP lock
    as necessary.  Anyone know for sure?

    (Note: I haven't tried taking copyout() or suword() out of the MP lock
    yet, I'm much less certain about them being MP safe).

    No patches available yet, I want to refine this a little more before
    I present it.  So far it's quite clean.

                                        -Matt
                                        Matthew Dillon 
                                        <[EMAIL PROTECTED]>



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to