Ping? Anybody willing to review?
Thanks, Corinna On Jan 26 12:13, Corinna Vinschen wrote: > From: Corinna Vinschen <[email protected]> > > The only implementation of an RLIMIT using Windows job objects, > RLIMIT_AS, doesn't really work as desired. The way it uses nested jobs > fails if a soft limit is supposed to be raised again, thus working > rather like a hard limit only. > > This patch series takes a new approach. > > Considering two kinds of rlimits, soft and hard limits, and two kinds of > scopes, per-process and per-user. Especially the per-user scope is kind > of tricky when implementing this as job objects. For all practical > purposes, we can only include Cygwin processes and native subprocesses > into per-user jobs, and only Cygwin processes into per-process jobs. > > So here's what this patch is doing now: > > When a new Cygwin process tree is started, the root process of that tree > creates two per-user nested jobs, one for the hard limits, the next one > for the soft limits. The per-user job objects are globally defined. > Processes can become job members across multiple Windows sessions. If > another Cygwin process tree is started, the root process of that tree > finds that the per-user jobs already exist and just assignes itself to > both jobs. > > The same happens after a user context switch changing the real uid, i. e., > in spawn/exec when calling CreateProcessAsUser. > > User limits are just set in those job objects across the board. > > Per-process limits are implemented by adding two more job objects for > hard and soft limit and assigning the process to these jobs. These job > objects are session local and they are only created when the process > calls setrlimit. They are setup so that child processes breakaway from > these jobs automatically. The job objects are not inherited, but > recreated on fork/exec per PID for child processes. This localizes the > rlimits to a process and changes to per-process rlimits in a parent > process don't affect the per-process limits in an already started child, > only in children forked or execed later on. > > I hope I explained this sufficiently. > > For the time being, we have exactly one per-process limit, RLIMIT_AS, > and exactly one new(!) per-user limit, RLIMIT_NPROC. > > Questions and comments welcome! > > > Corinna > > > > Corinna Vinschen (3): > Cygwin: getrlimit/setrlimit: generalize setting rlimits > Cygwin: getrlimit/setrlimit: implement RLIMIT_NPROC > Cygwin: improve PCA workaround > > winsup/cygwin/dcrt0.cc | 4 + > winsup/cygwin/fork.cc | 16 ++ > winsup/cygwin/globals.cc | 1 + > winsup/cygwin/include/cygwin/version.h | 3 +- > winsup/cygwin/include/sys/resource.h | 3 +- > winsup/cygwin/local_includes/child_info.h | 10 +- > winsup/cygwin/local_includes/cygheap.h | 1 - > winsup/cygwin/local_includes/ntdll.h | 1 + > winsup/cygwin/resource.cc | 303 ++++++++++++++++++---- > winsup/cygwin/spawn.cc | 44 +--- > 10 files changed, 300 insertions(+), 86 deletions(-) > > -- > 2.52.0
