On Thu, Jun 14, 2012 at 03:48:12AM +0200, Ariane van der Steldt wrote:
> Hi,
> 
> This diff implements yielding in the vm system, with the intention to
> make expensive system calls preempt every once in a while, to allow
> userland system calls to progress.
> 
> It's a very conservative application at the moment, only interleaving
> during memory unmapping.  If this works, we can start adding the
> mechanic to other expensive system calls not just in uvm, but anywhere
> the kernel is kept locked for long stretches of time.
> 

FWIW, few years ago I did a lot of tests and munmap() was by far
the longest kernel code path. IIRC the second was ffs w/ softdeps.

> Technically the diff is incomplete, since it does not consider the very
> big problem of the biglock.  And that's because the biglock lacks a
> __mp_lock_is_contended() call: if we hold the biglock and another cpu
> wants the biglock, ideally it will inform us so we can sidestep and
> temporarily grant access.

I've read the diff, but I still don't understand this part. Why
wouldn't the naive approch work for MP as well? I mean, on UP
systems we do:

        for (;;) {
                one_cycle_of_heavy_stuff();
                preemp();
        }

and preemp() would check for a flag set in the clock interrupt and
possibly call mi_switch() to run another process. On MP systems,
mi_switch() would release the kernel lock, wouldn't it? If so,
other processes can invoke syscalls. In this case I don't see the
difference between MP and UP.

-- Alexandre

Reply via email to