freebsd-skq/sys/kern
Kirk McKusick 3a7053cb60 Prevent large files from monopolizing the system buffers. Keep
track of the number of dirty buffers held by a vnode. When a
bdwrite is done on a buffer, check the existing number of dirty
buffers associated with its vnode. If the number rises above
vfs.dirtybufthresh (currently 90% of vfs.hidirtybuffers), one
of the other (hopefully older) dirty buffers associated with
the vnode is written (using bawrite). In the event that this
approach fails to curb the growth in it the vnode's number of
dirty buffers (due to soft updates rollback dependencies),
the more drastic approach of doing a VOP_FSYNC on the vnode
is used. This code primarily affects very large and actively
written files such as snapshots. This change should eliminate
hanging when taking snapshots or doing background fsck on
very large filesystems.

Hopefully, one day it will be possible to cache filesystem
metadata in the VM cache as is done with file data. As it
stands, only the buffer cache can be used which limits total
metadata storage to about 20Mb no matter how much memory is
available on the system. This rather small memory gets badly
thrashed causing a lot of extra I/O. For example, taking a
snapshot of a 1Tb filesystem minimally requires about 35,000
write operations, but because of the cache thrashing (we only
have about 350 buffers at our disposal) ends up doing about
237,540 I/O's thus taking twenty-five minutes instead of four
if it could run entirely in the cache.

Reported by:	Attila Nagy <bra@fsn.hu>
Sponsored by:   DARPA & NAI Labs.
2003-02-25 06:44:42 +00:00
..
bus_if.m Add two interfaces to allow for busses to report the pnpinfo for 2002-10-07 05:06:38 +00:00
clock_if.m
device_if.m
genassym.sh
imgact_aout.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
imgact_elf32.c Improve the way that an elf image activator for an alternate word size is 2003-01-04 22:07:48 +00:00
imgact_elf64.c Improve the way that an elf image activator for an alternate word size is 2003-01-04 22:07:48 +00:00
imgact_elf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
imgact_gzip.c Correct typos, mostly s/ a / an / where appropriate. Some whitespace cleanup, 2003-01-01 18:49:04 +00:00
imgact_shell.c Correct typos, mostly s/ a / an / where appropriate. Some whitespace cleanup, 2003-01-01 18:49:04 +00:00
inflate.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
init_main.c Use the proc lock to protect p_realtimer instead of Giant, and obtain 2003-02-17 10:03:02 +00:00
init_sysent.c Add a timeout parameter to kse_release. 2003-02-20 08:18:15 +00:00
kern_acct.c Remove the PL_SHAREMOD flag from struct plimit, which could have been 2003-02-20 04:18:42 +00:00
kern_acl.c Bow to the whining masses and change a union back into void *. Retain 2003-01-13 00:33:17 +00:00
kern_alq.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_clock.c Remove a never true condition. 2003-02-25 05:14:18 +00:00
kern_condvar.c - Call sched_sleep() instead of rolling our own in cv_waitq_add(). 2003-01-26 04:00:39 +00:00
kern_conf.c NO_GEOM cleanup: 2003-02-21 19:00:48 +00:00
kern_context.c Add getcontext, setcontext, and swapcontext as system calls. 2002-11-16 06:35:53 +00:00
kern_descrip.c Don't NULL out p_fd until after closefd() has been called. This isn't 2003-02-24 05:46:55 +00:00
kern_environment.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_event.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_exec.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_exit.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_fork.c Remove the PL_SHAREMOD flag from struct plimit, which could have been 2003-02-20 04:18:42 +00:00
kern_idle.c - Create a new scheduler api that is defined in sys/sched.h 2002-10-12 05:32:24 +00:00
kern_intr.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_jail.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_kse.c Remove a bogus comment. 2003-02-25 05:17:18 +00:00
kern_kthread.c Some kernel threads try to do significant work, and the default KSTACK_PAGES 2002-10-02 07:44:29 +00:00
kern_ktr.c Add a /a modifier to the show ktr ddb command, which prints the whole trace 2003-02-22 23:30:37 +00:00
kern_ktrace.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_linker.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_lock.c - Add an interlock argument to BUF_LOCK and BUF_TIMELOCK. 2003-02-25 03:37:48 +00:00
kern_lockf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_mac.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_malloc.c o Allow "buckets" in mb_alloc to be differently sized (according to 2003-02-20 04:26:58 +00:00
kern_mib.c - Provide backwards compatibility for kern.fallback_elf_brand. 2003-01-05 03:48:14 +00:00
kern_module.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_mtxpool.c
kern_mutex.c There's absolutely no need for a struct-within-a-struct, so move the 2003-01-21 20:33:27 +00:00
kern_ntptime.c Explicitly have the timecounter init happen after the cpu_initclocks is 2003-01-06 01:01:08 +00:00
kern_physio.c Close the remaining user address mapping races for physical 2003-01-20 17:46:48 +00:00
kern_poll.c
kern_proc.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_prot.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_resource.c Remove the PL_SHAREMOD flag from struct plimit, which could have been 2003-02-20 04:18:42 +00:00
kern_sema.c
kern_shutdown.c style. 2003-02-14 12:44:48 +00:00
kern_sig.c - Add a new function, thread_signal_add(), that is called from postsig to 2003-02-17 09:58:11 +00:00
kern_subr.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
kern_switch.c Update comments to reflect new KSE code. 2003-02-19 13:36:51 +00:00
kern_sx.c
kern_synch.c Move a bunch of flags from the KSE to the thread. 2003-02-17 09:55:10 +00:00
kern_syscalls.c
kern_sysctl.c Don't panic when enumerating SYSCTL_NODE() nodes without any children 2003-02-22 17:58:06 +00:00
kern_tc.c Move timecounters notion of frequency to 64 bits. 2003-01-29 11:29:22 +00:00
kern_thread.c Remove a bogus comment. 2003-02-25 05:17:18 +00:00
kern_time.c OK, I was too sleepy there... 2003-02-23 13:45:55 +00:00
kern_timeout.c Under DIAGNOSTIC, only report expensive timeouts if they are more expensive 2003-02-01 10:06:40 +00:00
kern_uuid.c SMP locking for ifnet list. 2002-12-22 05:35:03 +00:00
kern_xxx.c
ksched.c Move a bunch of flags from the KSE to the thread. 2003-02-17 09:55:10 +00:00
link_elf_obj.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
link_elf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
linker_if.m
Make.tags.inc
Makefile
makesyscalls.sh The syscall names are string constants, so make them consts. 2002-10-29 15:47:06 +00:00
md4c.c
md5c.c We have memset() and memcpy() in the kernel now, so we don't need to 2002-10-20 22:33:42 +00:00
p1003_1b.c Use copyout to access user memory. 2003-01-07 20:10:04 +00:00
posix4_mib.c Rework the sysconf(3) interaction with aio: 2002-11-17 04:15:34 +00:00
sched_4bsd.c Update comments to reflect new KSE code. 2003-02-19 13:36:51 +00:00
sched_ule.c Move a bunch of flags from the KSE to the thread. 2003-02-17 09:55:10 +00:00
subr_acl_posix1e.c Bow to the whining masses and change a union back into void *. Retain 2003-01-13 00:33:17 +00:00
subr_autoconf.c
subr_blist.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
subr_bus.c Fix comment about what we do when there are no listeners. 2003-01-19 00:34:17 +00:00
subr_clist.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
subr_clock.c Split the global timezone structure into two integer fields to 2003-02-03 19:49:35 +00:00
subr_devstat.c Use strlcpy() instead of strncpy() to copy NUL terminated strings 2002-10-17 20:03:38 +00:00
subr_disk.c NO_GEOM cleanup: remove #ifdef 2003-01-30 12:36:30 +00:00
subr_eventhandler.c
subr_hints.c
subr_kobj.c
subr_log.c Make the msg_size, msg_bufx and msg_bufr memebers of struct msgbuf 2002-11-14 16:11:12 +00:00
subr_mbuf.c o Allow "buckets" in mb_alloc to be differently sized (according to 2003-02-20 04:26:58 +00:00
subr_mchain.c The "m = m->m_next" that was removed in the revision 1.12 was necessary 2003-02-19 10:12:42 +00:00
subr_module.c
subr_param.c
subr_pcpu.c
subr_power.c
subr_prf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
subr_prof.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
subr_rman.c Implement rman_get_device 2003-02-12 07:00:59 +00:00
subr_rtc.c Split the global timezone structure into two integer fields to 2003-02-03 19:49:35 +00:00
subr_sbuf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
subr_scanf.c Fix mis-indentation. 2002-10-02 09:09:25 +00:00
subr_smp.c Move a bunch of flags from the KSE to the thread. 2003-02-17 09:55:10 +00:00
subr_taskqueue.c
subr_trap.c - Add a new function, thread_signal_add(), that is called from postsig to 2003-02-17 09:58:11 +00:00
subr_turnstile.c There's absolutely no need for a struct-within-a-struct, so move the 2003-01-21 20:33:27 +00:00
subr_witness.c Initiate de-orbit burn for USE_PCI_BIOS_FOR_READ_WRITE. This has been 2003-02-18 03:36:49 +00:00
subr_xxx.c Cleanup of the d_mmap_t interface. 2003-02-25 03:21:22 +00:00
sys_generic.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
sys_pipe.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
sys_process.c Add a missing PROC_UNLOCK in ptrace() for the PT_IO case. 2002-10-16 16:28:33 +00:00
sys_socket.c Remove duplicate includes. 2003-02-20 03:26:11 +00:00
syscalls.c Add a timeout parameter to kse_release. 2003-02-20 08:18:15 +00:00
syscalls.master Add a timeout parameter to kse_release. 2003-02-20 08:18:15 +00:00
sysv_ipc.c It is possible for an active aio to prevent shared memory from being 2003-01-13 23:04:32 +00:00
sysv_msg.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
sysv_sem.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
sysv_shm.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
tty_compat.c
tty_conf.c
tty_cons.c Change the console interface to pass a "struct consdev *" instead of a 2003-02-20 20:54:45 +00:00
tty_pty.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
tty_subr.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
tty_tty.c NODEVFS cleanup: Unifdef. 2003-01-30 12:51:32 +00:00
tty.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
uipc_accf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
uipc_cow.c Change iov_base's type from char *' to the standard void *'. All 2002-10-11 14:58:34 +00:00
uipc_domain.c
uipc_jumbo.c Remove duplicate includes. 2003-02-20 03:26:11 +00:00
uipc_mbuf2.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
uipc_mbuf.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
uipc_proto.c
uipc_sem.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
uipc_sockbuf.c Missing M_TRYWAIT from so_upcall third argument. 2003-02-21 22:23:40 +00:00
uipc_socket2.c Missing M_TRYWAIT from so_upcall third argument. 2003-02-21 22:23:40 +00:00
uipc_socket.c Remove duplicate includes. 2003-02-20 03:26:11 +00:00
uipc_syscalls.c Sync new socket nonblocking/async state with file flags in accept(). 2003-02-23 23:00:28 +00:00
uipc_usrreq.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_acl.c Bow to the whining masses and change a union back into void *. Retain 2003-01-13 00:33:17 +00:00
vfs_aio.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_bio.c Prevent large files from monopolizing the system buffers. Keep 2003-02-25 06:44:42 +00:00
vfs_cache.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_cluster.c - Add an interlock argument to BUF_LOCK and BUF_TIMELOCK. 2003-02-25 03:37:48 +00:00
vfs_default.c - Add an interlock argument to BUF_LOCK and BUF_TIMELOCK. 2003-02-25 03:37:48 +00:00
vfs_export.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_extattr.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_init.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_lookup.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_mount.c Export the name of the device used to mount the root file system as 2003-02-22 05:01:12 +00:00
vfs_subr.c Prevent large files from monopolizing the system buffers. Keep 2003-02-25 06:44:42 +00:00
vfs_syscalls.c Back out M_* changes, per decision of the TRB. 2003-02-19 05:47:46 +00:00
vfs_vnops.c Do not allow kqueues to be passed via unix domain sockets. 2003-02-15 06:04:55 +00:00
vnode_if.src Temporarily introduce a new VOP_SPECSTRATEGY operation while I try 2003-01-04 22:10:36 +00:00