[LITMUS^RT] prop/sched-domains

Glenn Elliott gelliott at cs.unc.edu
Wed Feb 5 03:05:52 CET 2014


Hi Everyone,

I’ve always found working with clusters in Litmus to be a little clunky.  Here’s an example of how it manifests: rtspin takes two parameters, cluster ID and cluster size.  liblitmus uses this information to automatically set up CPU affinity masks and set rt_task::cpu.  Unfortunately, liblitmus’s algorithm breaks when the CPUs within a cluster are NOT enumerated adjacently.  For example, this happens on UNC’s Ludwig system, where CPUs 0 and 4 share an L2 cache.  liblitmus incorrectly assumes that it is CPUs 0 and 1 that share the L2.  (Generally speaking, I think the algorithm is broken on systems where there are multiple levels of shared caches.)

liblitmus could be made more intelligent by examining cache information in /sys.  However, working directly with /sys is a royal pain-in-the-sys when using C’s file APIs.  Further, liblitmus must still rely on the user to give it cluster ID and cluster size information.  It would be much nicer if a user just had to specify a cluster ID (sched domain ID).  This is much cleaner.

With this in mind, I have a few patches that I’d like to contribute to make working with clusters a bit easier.  I’ve pushed a branch to github called "prop/sched-domains”.  What do these patches do?  It updates the plugins to export information about their clusters (aka scheduling domains) to /proc/litmus.

New directories:
* /proc/litmus/cpus
* /proc/litmus/domains

New files:
* /proc/litmus/cpus/<CPU #>: There is one file for each CPU (except the release master).  The files take the name of the CPU for which they express information.  That is, the file for CPU 0 is just “0”.  The contents of the file is a bitmask of the domains that schedule that CPU.  Suppose you are using C-EDF to make the following CPU clusters: {CPU 0, 1, 2, 3} and {4, 5, 6, 7}.  Files /proc/litmus/cpus/0..3 would contain the mask “00001”, indicating that these CPUs are managed by the first cluster (cluster 0).  /proc/litmus/cpus/4..7 contain the mask “00002”, indicating that they are managed by the second cluster (cluster 1).
* /proc/litmus/domains/<DOMAIN #>: There is one file for each scheduling domain.  The file name is the domain ID.  The contents of the file is a bitmask of the CPUs scheduled by that domain.  For example, for cluster 0 from earlier, it’s mask would be “0000f”, indicating that it manages CPUs 0 - 3.  For cluster 1, it’s mask would be “000f0”.  Note, these bitmasks do NOT include the release master.  Further, when cluster size is 1 and release master is active, no file gets set up for the empty-set domain, and the domains are enumerated transparently (there’s no gap in the cluster numbering scheme).

I like this interface because its:
1) Clean.
2) Supports arbitrary clusters.
3) Provides a path forward for working with containers (every container could have its own file in /proc/litmus/domains/).  (Not that anyone is planning on starting container work anytime soon…)

I plan to submit a patch for liblitmus to use this information rather than its current fragile algorithm.  I’d also like to do away with the rt_task::cpu field and replace it with a domain ID.  I understand the historical reasons for this interface, but it’s really kludgy to have to find a CPU to assign to that field when you’re doing cluster scheduling.  liblitmus has some routines to make it less painful, but it’s still ugly.

One last gripe: I’d also like to do away with the restriction that a task must have set its CPU mask to match its cluster prior to entering real-time mode.  What’s the point?  Why can’t scheduler just migrate the task automatically?  More frustratingly, the plugins silently reject the task in admit_task()—nothing gets printk()’ed.

Comments and suggestions for improving the patches are welcome.

Here’s a link for the branch: https://github.com/LITMUS-RT/litmus-rt/compare/prop;sched-domains
(Note: The branch is based off of the staging branch.)

Thanks,
Glenn



More information about the litmus-dev mailing list