6 ms·
Evolution of the x86 context switch in Linux (2018)
- filereaper 8y agoEnjoyed this article, anybody know the significance of adding the do..while(0) loop within the macro starting Linux 1.3? Was curious if it guards against some C pre-processor issues. /** include/asm-i386/system.h */ #define switch_to(tsk) do { [...] } while (0)
- akuma73 8y agoGood answer here: https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for https://stackoverflow.com/questions/257418/do-while-0-what-i...
- berti 8y agoJust to add more context, this is a very common cpp (c pre-processor) idiom. You'll find it in most non-trivial C projects somewhere.
- pantalaimon 8y agoAbbreviating the C Preprocessor as cpp is very confusing imho.
- Someone 8y agoIt enables you to invoke the macro as if it were an expression statement consisting of a function call, regardless of where it appears. For details, see http://c-faq.com/cpp/multistmt.html http://c-faq.com/cpp/multistmt.html:
- loeg 8y agoIn particular, a single statement. I'm sure the link covers it, but: if (foo) MULTI_LINE_MACRO; Breaks without some wrapper like if (1) { A; B; } or do { A; B; } while (0): if (foo) A; B; // oops, unconditional (e.g., "goto fail")
- heinrichhartman 8y agoI really like how good the article looks when printed. I enjoy reading long, in-depth articles much more when I can read them in print. Unfortunately many blog posts need a lot of tweaking until I can get an acceptable print result. This one looks good enough without any trickery. Thanks to the author, for caring about the paper people. : )
- Groxx 8y agoout of curiosity, since it changes how the page prints and I haven't experimented much: have you tried printing while in the browser's "reading" mode? Or does that tend to be worse?
- ezconnect 8y agoNot OP,but if it looks good on "reading" mode it prints nicely. Plus you can adjust font size and print width to conform to your taste.
- glonq 8y agoVery thorough. Nice job.
- Upvoter33 8y agoThis is really well done, bravo.
- souprock 8y agoAn addition to "Linux 2.2 (1999)" is: introduced meltdown vulnerability. That was the then-unknown cost of software context switching. Later, with Red Hat's 4g4g kernels that Linus rejected, the problem would go away for people who installed Red Hat's version of the OS on systems with many gigabytes of memory.
- bogomipz 8y agoCan you elaborate? How does relying on pure TSS for context switching prevent meltdown? What were the 4g4g kernels? Might you have any literature and/or on those?
- DSingularity 8y agoSeparate address space for kernel and user. Hardware will use TSS to switch address space as needed for syscalls.
- bogomipz 8y agoDo you the reason why Linus rejected this idea?
- souprock 8y agoThe main reason seemed to be the relatively bad performance of the hardware task switch (loading segment registers and the page table base) that would be required for any system call. Of course, that turns out to be the fix for meltdown, unless you have the process-context identifiers (PCID) available on Haswell chips and newer. The meltdown fix for older CPUs, such as the Pentium III and Intel Core, is roughly the same as the 4g4g kernel changes. BTW, the 4g4g kernels were created for a different reason. The kernel needed more virtual address space for itself, and thus couldn't share with user code. This was for a time when people were trying to run 32-bit kernels on systems with 32 gigabytes of RAM.
- bogomipz 8y ago
- dekhn 8y agoI recall reading a paper comparing Linux and Solaris context switch times in ~98 and Linux was 10-100X faster. Solaris did something incredibly slow and safe.
- shereadsthenews 8y agoReal context switches on Solaris were very slow which is why they had LWP. But Linux process context switches were also faster than Sun's LWP switches.
- bogomipz 8y agoCan someone say why is using the TSS still mandatory with software-based task switching? Is this a requirement imposed by x86? In looking at the OS dev wiki I see the following: >"The TSS is primarily suited for hardware multitasking, where each individual process has its own TSS. In Software multitasking, one or two TSS's are also generally used, as they allow for entering Ring 0 code after an interrupt." Would you not be able to enter Ring0 after an interrupt with a TSS entry? Is this why it is still required?
- amluto 8y agoNice article! If you want to have lots of fun, you could look at switch_mm() on a modern kernel :)
- MichaelMoser123 8y agoanyone knows what Ingo Molnar is doing these days?
- moosingin3space 8y agoA ton of stuff related to eBPF, last I saw.