]> Zhao Yanbai Git Server - minix.git/commit
VFS: worker thread model overhaul 52/952/2
authorDavid van Moolenbroek <david@minix3.org>
Fri, 30 Aug 2013 12:00:50 +0000 (14:00 +0200)
committerLionel Sambuc <lionel@minix3.org>
Tue, 18 Feb 2014 10:25:03 +0000 (11:25 +0100)
commit723e51327fe8b8c5a99378f9787924c35d1e8947
tree5197905f87b0cc4d01fbf4f16a9a6af444d3acbc
parent4f6b382c412cd548669a0d64008fee56a1903b31
VFS: worker thread model overhaul

The main purpose of this patch is to fix handling of unpause calls
from PM while another call is ongoing. The solution to this problem
sparked a full revision of the threading model, consisting of a large
number of related changes:

- all active worker threads are now always associated with a process,
  and every process has at most one active thread working for it;
- the process lock is always held by a process's worker thread;
- a process can now have both normal work and postponed PM work
  associated to it;
- timer expiry and non-postponed PM work is done from the main thread;
- filp garbage collection is done from a thread associated with VFS;
- reboot calls from PM are now done from a thread associated with PM;
- the DS events handler is protected from starting multiple threads;
- support for a system worker thread has been removed;
- the deadlock recovery thread has been replaced by a parameter to the
  worker_start() function; the number of worker threads has
  consequently been increased by one;
- saving and restoring of global but per-thread variables is now
  centralized in worker_suspend() and worker_resume(); err_code is now
  saved and restored in all cases;
- the concept of jobs has been removed, and job_m_in now points to a
  message stored in the worker thread structure instead;
- the PM lock has been removed;
- the separate exec lock has been replaced by a lock on the VM
  process, which was already being locked for exec calls anyway;
- PM_UNPAUSE is now processed as a postponed PM request, from a thread
  associated with the target process;
- the FP_DROP_WORK flag has been removed, since it is no longer more
  than just an optimization and only applied to processes operating on
  a pipe when getting killed;
- assignment to "fp" now takes place only when obtaining new work in
  the main thread or a worker thread, when resuming execution of a
  thread, and in the special case of exiting processes during reboot;
- there are no longer special cases where the yield() call is used to
  force a thread to run.

Change-Id: I7a97b9b95c2450454a9b5318dfa0e6150d4e6858
34 files changed:
servers/vfs/README
servers/vfs/comm.c
servers/vfs/const.h
servers/vfs/coredump.c
servers/vfs/device.c
servers/vfs/dmap.c
servers/vfs/exec.c
servers/vfs/filedes.c
servers/vfs/fproc.h
servers/vfs/fs.h
servers/vfs/gcov.c
servers/vfs/glo.h
servers/vfs/job.h [deleted file]
servers/vfs/link.c
servers/vfs/lock.c
servers/vfs/main.c
servers/vfs/misc.c
servers/vfs/mount.c
servers/vfs/open.c
servers/vfs/path.c
servers/vfs/pipe.c
servers/vfs/protect.c
servers/vfs/proto.h
servers/vfs/read.c
servers/vfs/request.c
servers/vfs/select.c
servers/vfs/stadir.c
servers/vfs/table.c
servers/vfs/threads.h
servers/vfs/time.c
servers/vfs/utility.c
servers/vfs/vmnt.c
servers/vfs/vnode.c
servers/vfs/worker.c