kernel_lock() profiling results
I've written a small patch that measures the duration how long the kernel-lock is owned.
The main results:
- compiling:
* nearly 60% of all callers release the lock after less than 1024 CPU cycles.
* a few callers own the lock very long, e.g. sys_bdflush for more than 10 milliseconds (>0.01 seconds).
- serving web pages with apache:
* only 17% need less than 1024 CPU cycles
* 55% need less than 2048 CPU cycles.
The patch and a list of all functions which owned the lock for more then 1.5 milliseconds is at
http://www.colorfullife.com/manfreds/kernel_lock/
OTHO, 2048 cpu cycles is about as long as __cpu_user() needs for 700 bytes if source,dest are currently not in the cache (I've tested it with a 16 MB move from user mode). The memmove will be even slower with faster CPU's (i.e. with a higher cpu clock/bus clock multiplier)
My question:
Shouldn't we change file_read_actor() [mm/filemap.c, the function which copies data from the page cache to user mode]:
we could release the kernel lock if we copy more than 1024 bytes. (we currently do that only if the user mode memory is not paged in.)
Manfred
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
Hi,
Quoted 4 lines · Manfred Spraul
Shouldn't we change
file_read_actor()[mm/filemap.c, the function which copies data from the page cache to user mode]:
we could release the kernel lock if we copy more than 1024 bytes. (we currently do that only if the user mode memory is not paged in.)
ftp://ftp.uk.linux.org/pub/linux/sct/performance
contains a patch Dave Miller and I put together to drop the kernel lock during a number of key user mode copies.
--Stephen
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
Quoted 4 lines · Stephen C. Tweedie
ftp://ftp.uk.linux.org/pub/linux/sct/performance
contains a patch Dave Miller and I put together to drop the kernel lock during a number of key user mode copies.
1) Andrea noticed that 'unlock_kernel()' only releases the kernel lock if the lock was obtained once.
He added two new functions: one stores the current lock depth, releases the lock and sets current->lock_depth =-1.
The other reverses that.
I think we need these functions:
* it's save to call the functions without the kernel_lock held.
* the unlock is effective for recursive calls.
2) Here's a excerpt from an email I wrote a few days ago:
Quoted 15 lines
I've modified
uaccess.h, and I have now a list of all functions which called copy_to/from_user() for more than 512 bytes (apache, make clean; make fs; find/usr/bin)*
read_file_actor()
*ext2_file_write()
*block_read()
*copy_mount_options()<< really rare
*proc_file_read()<< rare??
*pipe_write()
*pipe_read()
* 2*vt_ioctl() << could be remote gdb.
*tcp_do_sendmsg()
*copy_strings()<< only duringfork()?
Quoted 9 lines
Additionally, the following functions could also release the kernel lock:
*padzero()inbinfmt_elf:
This function clears up to 4096 bytes user memory. The average should be 2048.
*update_vm_mapping():
the function can wait inwait_on_page(), we should break nothing
*get_free_page():
ifGFP_WAIT, formemset(,0,PAGE_SIZE)
I didn't use NFS, knfsd, other fs except ext2.
--
Manfred
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
Hi,
Quoted 2 lines · Manfred Spraul
1) Andrea noticed that '
unlock_kernel()' only releases the kernel lock if the lock was obtained once.
Yes, but in all the places we are currently doing the copy_*_user, we only hold the lock once. In general we might want to do a true save/restore of lock_depth for a new, self-unlocking copy_*_user, but right now the droplock diffs still do the right thing the simple way.
--Stephen
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
Quoted 2 lines · Stephen C. Tweedie
save/restore of
lock_depthfor a new, self-unlocking copy_*_user, but right now the droplock diffs still do the right thing the simple way.
I wouldn't call it the "right thing". It's also not simpler according to me since to make sure that the unlock_kernel is really dropping the kernel_flag spinlock you must check all entry paths and verify that lock_depth is 0 at such time.
Andrea Arcangeli
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/