On Tue, Dec 03, 2019 at 10:58:41AM -0500, Daniel Jordan wrote: > [resending in modified form since this didn't seem to reach the lists] > > Hi, > > padata has been undergoing some surgery lately[0] and now seems ready for > another enhancement: splitting up and multithreading CPU-intensive kernel work. > > I'm planning to send an RFC for this, but I wanted to post some thoughts on the > design and a work-in-progress branch first to see if the direction looks ok. > > Quoting from an earlier series[1], this is the problem I'm trying to solve: > > A single CPU can spend an excessive amount of time in the kernel operating > on large amounts of data. Often these situations arise during initialization- > and destruction-related tasks, where the data involved scales with system > size. These long-running jobs can slow startup and shutdown of applications > and the system itself while extra CPUs sit idle. > > There are several paths where this problem exists, but here are three to start: > > - struct page initialization (at boot-time, during memory hotplug, and for > persistent memory) > - VFIO page pinning (kvm guest initialization) > - fallocating a HugeTLB page (database initialization) > > padata is a general mechanism for parallel work and so seems natural for this > functionality[2], but now it can only manage a series of small, ordered jobs. > > The coming RFC will bring enhancements to split up a large job among a set of > helper threads according to the user's wishes, load balance the work between > them, set concurrency limits to control the overall number of helpers in the > system and per NUMA node, and run extra helper threads beyond the first at a > low priority level so as not to disturb other activity on the system for the > sake of an optimization. (While extra helpers are run at low priority for most > of the job, their priority is raised one by one at job end to match the > caller's to avoid starvation on a busy system.) > > The existing padata interfaces and features will remain, but serialization > becomes optional because these sorts of jobs don't need it. > > The advantage to enhancing padata rather than having the multithreading stand > alone is that there would be one central place in the kernel to manage the > number of helper threads that run at any given time. A machine's idle CPU > resources can be harnessed yet controlled (the low priority idea) to provide > the right amount of multithreading for the system. > > Here's a work-in-progress branch with some of this already done in the last > five patches. > > git://oss.oracle.com/git/linux-dmjordan.git padata-mt-wip > https://oss.oracle.com/git/gitweb.cgi?p=linux-dmjordan.git;a=shortlog;h=refs/heads/padata-mt-wip > > Thoughts? Questions? I'm ok with this. Please consider to add yourself as a Co-Maintainer, I guess you know the code in between much better than I do :)