Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1460049 > unrolled thread
| Started by | Johannes Weiner <hannes@cmpxchg.org> |
|---|---|
| First post | 2016-08-11 00:20 +0200 |
| Last post | 2016-08-17 00:00 +0200 |
| Articles | 8 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [Documentation] State of CPU controller in cgroup v2 Johannes Weiner <hannes@cmpxchg.org> - 2016-08-11 00:20 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Mike Galbraith <umgwanakikbuti@gmail.com> - 2016-08-11 08:30 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Johannes Weiner <hannes@cmpxchg.org> - 2016-08-13 00:20 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Mike Galbraith <umgwanakikbuti@gmail.com> - 2016-08-13 07:10 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Peter Zijlstra <peterz@infradead.org> - 2016-08-16 16:10 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Johannes Weiner <hannes@cmpxchg.org> - 2016-08-16 18:40 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Mike Galbraith <umgwanakikbuti@gmail.com> - 2016-08-17 11:40 +0200
Re: [Documentation] State of CPU controller in cgroup v2 Tejun Heo <tj@kernel.org> - 2016-08-17 00:00 +0200
| From | Johannes Weiner <hannes@cmpxchg.org> |
|---|---|
| Date | 2016-08-11 00:20 +0200 |
| Subject | Re: [Documentation] State of CPU controller in cgroup v2 |
| Message-ID | <s4K0W-2GI-15@gated-at.bofh.it> |
On Sat, Aug 06, 2016 at 11:04:51AM +0200, Mike Galbraith wrote: > On Fri, 2016-08-05 at 13:07 -0400, Tejun Heo wrote: > > It is true that the trees are semantically different from each other > > and the symmetric handling of tasks and cgroups is aesthetically > > pleasing. However, it isn't clear what the practical usefulness of > > a layout with direct competition between tasks and cgroups would be, > > considering that number and behavior of tasks are controlled by each > > application, and cgroups primarily deal with system level resource > > distribution; changes in the number of active threads would directly > > impact resource distribution. Real world use cases of such layouts > > could not be established during the discussions. > > You apparently intend to ignore any real world usages that don't work > with these new constraints. He didn't ignore these use cases. He offered alternatives like rgroup to allow manipulating threads from within the application, only in a way that does not interfere with cgroup2's common controller model. The complete lack of cohesiveness between v1 controllers prevents us from implementing even the most fundamental resource control that cloud fleets like Google's and Facebook's are facing, such as controlling buffered IO; attributing CPU cycles spent receiving packets, reclaiming memory in kswapd, encrypting the disk; attributing swap IO etc. That's why cgroup2 runs a tighter ship when it comes to the controllers: to make something much bigger work. Agreeing on something - in this case a common controller model - is necessarily going to take away some flexibility from how you approach a problem. What matters is whether the problem can still be solved. This argument that cgroup2 is not backward compatible is laughable. Of course it's going to be different, otherwise we wouldn't have had to version it. The question is not whether the exact same configurations and existing application design can be used in v1 and v2 - that's a strange onus to put on a versioned interface. The question is whether you can translate a solution from v1 to v2. Yeah, it might be a hassle depending on how specialized your setup is, but that's why we keep v1 around until the last user dies and allow you to freely mix and match v1 and v2 controllers within a single system to ease the transition. But this distinction between approach and application design, and the application's actual purpose is crucial. Every time this discussion came up, somebody says 'moving worker threads between different resource domains'. That's not a goal, though, that's a very specific means to an end, with no explanation of why it has to be done that way. When comparing the cgroup v1 and v2 interface, we should be discussing goals, not 'this is my favorite way to do it'. If you have an actual real-world goal that can be accomplished in v1 but not in v2 + rgroup, then that's what we should be talking about. Lastly, again - and this was the whole point of this document - the changes in cgroup2 are not gratuitous. They are driven by fundamental resource control problems faced by more comprehensive applications of cgroup. On the other hand, the opposition here mainly seems to be the inconvenience of switching some specialized setups from a v1-oriented way of solving a problem to a v2-oriented way. [ That, and a disturbing number of emotional outbursts against systemd, which has nothing to do with any of this. ] It's a really myopic line of argument. That being said, let's go through your points: > Priority and affinity are not process wide attributes, never have > been, but you're insisting that so they must become for the sake of > progress. Not really. It's just questionable whether the cgroup interface is the best way to manipulate these attributes, or whether existing interfaces like setpriority() and sched_setaffinity() should be extended to manipulate groups, like the rgroup proposal does. The problems of using the cgroup interface for this are extensively documented, including in the email you were replying to. > I mentioned a real world case of a thread pool servicing customer > accounts by doing something quite sane: hop into an account (cgroup), > do work therein, send bean count off to the $$ department, wash, rinse > repeat. That's real world users making real world cash registers go ka > -ching so real world people can pay their real world bills. Sure, but you're implying that this is the only way to run this real world cash register. I think it's entirely justified to re-evaluate this, given the myriad of much more fundamental problems that cgroup2 is solving by building on a common controller model. I'm not going down the rabbit hole again of arguing against an incomplete case description. Scale matters. Number of workers matter. Amount of work each thread does matters to evaluate transaction overhead. Task migration is an expensive operation etc. > I also mentioned breakage to cpusets: given exclusive set A and > exclusive subset B therein, there is one and only one spot where > affinity A exists... at the to be forbidden junction of A and B. Again, a means to an end rather than a goal - and a particularly suspicious one at that: why would a cgroup need to tell its *siblings* which cpus/nodes in cannot use? In the hierarchical model, it's clearly the task of the ancestor to allocate the resources downward. More details would be needed to properly discuss what we are trying to accomplish here. > As with the thread pool, process granularity makes it impossible for > any threaded application affinity to be managed via cpusets, such as > say stuffing realtime critical threads into a shielded cpuset, mundane > threads into another. There are any number of affinity usages that > will break. Ditto. It's not obvious why this needs to be the cgroup interface and couldn't instead be solved with extending sched_setaffinity() - again weighing that against the power of the common controller model that could be preserved this way. > Try as I may, I can't see anything progressive about enforcing process > granularity of per thread attributes. I do see regression potential > for users of these controllers, I could understand not being entirely happy about the trade-offs if you look at this from the perspective of a single controller in the entire resource control subsystem. But not seeing anything progressive in a common controller model? Have you read anything we have been writing? > and no viable means to even report them as being such. It will > likely be systemd flipping the V2 on switch, not the kernel, not the > user. Regression reports would thus presumably be deflected > to... those who want this. Sweet. There it is...
[toc] | [next] | [standalone]
| From | Mike Galbraith <umgwanakikbuti@gmail.com> |
|---|---|
| Date | 2016-08-11 08:30 +0200 |
| Message-ID | <s4RF7-81z-5@gated-at.bofh.it> |
| In reply to | #1460049 |
On Wed, 2016-08-10 at 18:09 -0400, Johannes Weiner wrote: > The complete lack of cohesiveness between v1 controllers prevents us > from implementing even the most fundamental resource control that > cloud fleets like Google's and Facebook's are facing, such as > controlling buffered IO; attributing CPU cycles spent receiving > packets, reclaiming memory in kswapd, encrypting the disk; attributing > swap IO etc. That's why cgroup2 runs a tighter ship when it comes to > the controllers: to make something much bigger work. Where is the gun wielding thug forcing people to place tasks where v2 now explicitly forbids them? > Agreeing on something - in this case a common controller model - is > necessarily going to take away some flexibility from how you approach > a problem. What matters is whether the problem can still be solved. What annoys me about this more than the seemingly gratuitous breakage is that the decision is passed to third parties who have nothing to lose, and have done quite a bit of breaking lately. > This argument that cgroup2 is not backward compatible is laughable. Fine, you're entitled to your sense of humor. I have one to, I find it laughable that threaded applications can only sit there like a lump of mud simply because they share more than applications written as a gaggle of tasks. "Threads are like.. so yesterday, the future belongs to the process" tickles my funny-bone. Whatever, to each his own. ... > Lastly, again - and this was the whole point of this document - the > changes in cgroup2 are not gratuitous. They are driven by fundamental > resource control problems faced by more comprehensive applications of > cgroup. On the other hand, the opposition here mainly seems to be the > inconvenience of switching some specialized setups from a v1-oriented > way of solving a problem to a v2-oriented way. > > [ That, and a disturbing number of emotional outbursts against > systemd, which has nothing to do with any of this. ] > > It's a really myopic line of argument. And I think the myopia is on the other side of my monitor, whatever. > That being said, let's go through your points: > > > Priority and affinity are not process wide attributes, never have > > been, but you're insisting that so they must become for the sake of > > progress. > > Not really. > > It's just questionable whether the cgroup interface is the best way to > manipulate these attributes, or whether existing interfaces like > setpriority() and sched_setaffinity() should be extended to manipulate > groups, like the rgroup proposal does. The problems of using the > cgroup interface for this are extensively documented, including in the > email you were replying to. > > > I mentioned a real world case of a thread pool servicing customer > > accounts by doing something quite sane: hop into an account (cgroup), > > do work therein, send bean count off to the $$ department, wash, rinse > > repeat. That's real world users making real world cash registers go ka > > -ching so real world people can pay their real world bills. > > Sure, but you're implying that this is the only way to run this real > world cash register. I implied no such thing. Of course it can be done differently, all they have to do is rip out these archaic thread thingies. Apologies for dripping sarcasm all over your monitor, but this annoys me far more that it should any casual user of cgroups. Perhaps I shouldn't care about the users (suse customers) who will step in this eventually, but I do. > I'm not going down the rabbit hole again of arguing against an > incomplete case description. Scale matters. Number of workers > matter. Amount of work each thread does matters to evaluate > transaction overhead. Task migration is an expensive operation etc. > > > I also mentioned breakage to cpusets: given exclusive set A and > > exclusive subset B therein, there is one and only one spot where > > affinity A exists... at the to be forbidden junction of A and B. > > Again, a means to an end rather than a goal I don't believe I described a means to an end, I believe I described affinity bits going missing. > - and a particularly > suspicious one at that: why would a cgroup need to tell its *siblings* > which cpus/nodes in cannot use? In the hierarchical model, it's > clearly the task of the ancestor to allocate the resources downward. > > More details would be needed to properly discuss what we are trying to > accomplish here. > > > As with the thread pool, process granularity makes it impossible for > > any threaded application affinity to be managed via cpusets, such as > > say stuffing realtime critical threads into a shielded cpuset, mundane > > threads into another. There are any number of affinity usages that > > will break. > > Ditto. It's not obvious why this needs to be the cgroup interface and > couldn't instead be solved with extending sched_setaffinity() - again > weighing that against the power of the common controller model that > could be preserved this way. Wow. Well sure, anything that becomes broken can be replaced by something else. Hell, people can just stop using cgroups entirely, and the way issues become non-issues with the wave of a hand makes me suspect that some users are going to be forced to do just that. -Mike
[toc] | [prev] | [next] | [standalone]
| From | Johannes Weiner <hannes@cmpxchg.org> |
|---|---|
| Date | 2016-08-13 00:20 +0200 |
| Message-ID | <s5sY1-7K5-9@gated-at.bofh.it> |
| In reply to | #1460196 |
On Thu, Aug 11, 2016 at 08:25:06AM +0200, Mike Galbraith wrote: > On Wed, 2016-08-10 at 18:09 -0400, Johannes Weiner wrote: > > The complete lack of cohesiveness between v1 controllers prevents us > > from implementing even the most fundamental resource control that > > cloud fleets like Google's and Facebook's are facing, such as > > controlling buffered IO; attributing CPU cycles spent receiving > > packets, reclaiming memory in kswapd, encrypting the disk; attributing > > swap IO etc. That's why cgroup2 runs a tighter ship when it comes to > > the controllers: to make something much bigger work. > > Where is the gun wielding thug forcing people to place tasks where v2 > now explicitly forbids them? The problems with supporting this are well-documented. Please see R-2 in Documentation/cgroup-v2.txt. > > Agreeing on something - in this case a common controller model - is > > necessarily going to take away some flexibility from how you approach > > a problem. What matters is whether the problem can still be solved. > > What annoys me about this more than the seemingly gratuitous breakage > is that the decision is passed to third parties who have nothing to > lose, and have done quite a bit of breaking lately. Mike, there is no connection between what you are quoting and what you are replying to here. We cannot have a technical discussion when you enter it with your mind fully made up, repeat the same inflammatory talking points over and over - some of them trivially false, some a gross misrepresentation of what we have been trying to do - and are completely unwilling to even entertain the idea that there might be problems outside of the one-controller-scope you are looking at. But to address your point: there is no 'breakage' here. Or in your words: there is no gun wielding thug forcing people to upgrade to v2. If v1 does everything your specific setup needs, nobody forces you to upgrade. We are fairly confident that the majority of users *will* upgrade, simply because v2 solves so many basic resource control problems that v1 is inherently incapable of solving. There is a positive incentive, but we are trying not to create negative ones. And even if you run a systemd distribution, and systemd switches to v2, it's trivially easy to pry the CPU controller from its hands and maintain your setup exactly as-is using the current CPU controller. This is really not a technical argument. > > This argument that cgroup2 is not backward compatible is laughable. > > Fine, you're entitled to your sense of humor. I have one to, I find it > laughable that threaded applications can only sit there like a lump of > mud simply because they share more than applications written as a > gaggle of tasks. "Threads are like.. so yesterday, the future belongs > to the process" tickles my funny-bone. Whatever, to each his own. Who are you quoting here? This is such a grotesque misrepresentation of what we have been saying and implementing, it's not even funny. In reality, the rgroup extension for setpriority() was directly based on your and PeterZ's feedback regarding thread control. Except that, unlike cgroup1's approach to threads, which might work in some setups but suffers immensely from the global nature of the vfs interface once you have to cooperate with other applications and system management*, rgroup was proposed as a much more generic and robust interface to do hierarchical resource control from inside the application. * This doesn't have to be systemd, btw. We have used cgroups to isolate system services, maintenance jobs, cron jobs etc. from our applications way before systemd, and it's been a pita to coordinate the system managing applications and the applications managing its workers using the same globally scoped vfs interface. > > > I mentioned a real world case of a thread pool servicing customer > > > accounts by doing something quite sane: hop into an account (cgroup), > > > do work therein, send bean count off to the $$ department, wash, rinse > > > repeat. That's real world users making real world cash registers go ka > > > -ching so real world people can pay their real world bills. > > > > Sure, but you're implying that this is the only way to run this real > > world cash register. > > I implied no such thing. Of course it can be done differently, all > they have to do is rip out these archaic thread thingies. > > Apologies for dripping sarcasm all over your monitor, but this annoys > me far more that it should any casual user of cgroups. Perhaps I > shouldn't care about the users (suse customers) who will step in this > eventually, but I do. https://yourlogicalfallacyis.com/black-or-white https://yourlogicalfallacyis.com/strawman https://yourlogicalfallacyis.com/appeal-to-emotion Can you please try to stay objective? > > > As with the thread pool, process granularity makes it impossible for > > > any threaded application affinity to be managed via cpusets, such as > > > say stuffing realtime critical threads into a shielded cpuset, mundane > > > threads into another. There are any number of affinity usages that > > > will break. > > > > Ditto. It's not obvious why this needs to be the cgroup interface and > > couldn't instead be solved with extending sched_setaffinity() - again > > weighing that against the power of the common controller model that > > could be preserved this way. > > Wow. Well sure, anything that becomes broken can be replaced by > something else. Hell, people can just stop using cgroups entirely, and > the way issues become non-issues with the wave of a hand makes me > suspect that some users are going to be forced to do just that. We are not the ones doing the handwaving. We have reacted with code and with repeated attempts to restart a grounded technical discussion on this issue, and were met time and again with polemics, categorical dismissal of the problems we are facing in the cloud, and a flatout refusal to even consider a different approach to resource control. It's great that cgroup1 works for some of your customers, and they are free to keep using it, but there is only so much you can build with a handful of loose shoestrings, and we are badly hitting the design limitations of that model. We have tried to work in your direction and proposed interfaces/processes to support the different things people are (ab)using cgroup1 for right now, but at some point you have to acknowledge that cgroup2 is the result of problems we have run into with cgroup1 and that, consequently, not everything from cgroup1 can be retained as-is. Only when that happens can we properly discuss cgroup2's current design choices and whether it could be done better. Ignoring the real problems that cgroup2 is solving will not remove the demand for it. It only squanders your chance to help shape it in the interest of the particular group of users you feel most obligated to.
[toc] | [prev] | [next] | [standalone]
| From | Mike Galbraith <umgwanakikbuti@gmail.com> |
|---|---|
| Date | 2016-08-13 07:10 +0200 |
| Message-ID | <s5zmN-4B7-1@gated-at.bofh.it> |
| In reply to | #1461497 |
On Fri, 2016-08-12 at 18:17 -0400, Johannes Weiner wrote: > > > This argument that cgroup2 is not backward compatible is laughable. > > > > Fine, you're entitled to your sense of humor. I have one to, I find it > > laughable that threaded applications can only sit there like a lump of > > mud simply because they share more than applications written as a > > gaggle of tasks. "Threads are like.. so yesterday, the future belongs > > to the process" tickles my funny-bone. Whatever, to each his own. > > Who are you quoting here? This is such a grotesque misrepresentation > of what we have been saying and implementing, it's not even funny. Agreed, it's not funny to me either. Excluding threaded applications from doing.. anything.. implies to me that either someone thinks same do not need resource management facilities due to some magical property of threading itself, or someone doesn't realize that an application thread is a task, ie one and the same things which can be doing one and the same job. No matter how I turn it, what I see is nonsense. > https://yourlogicalfallacyis.com/black-or-white > https://yourlogicalfallacyis.com/strawman > https://yourlogicalfallacyis.com/appeal-to-emotion Nope, plain ole sarcasm, an expression of shock and awe. > It's great that cgroup1 works for some of your customers, and they are > free to keep using it. If no third party can flush my customers investment down the toilet, I can cease to care. Please don't CC me in future, you're unlikely to convince me that v2 is remotely sane, nor do you need to. Lucky you. -Mike
[toc] | [prev] | [next] | [standalone]
| From | Peter Zijlstra <peterz@infradead.org> |
|---|---|
| Date | 2016-08-16 16:10 +0200 |
| Message-ID | <s6Ne2-46v-19@gated-at.bofh.it> |
| In reply to | #1460049 |
On Wed, Aug 10, 2016 at 06:09:44PM -0400, Johannes Weiner wrote: > [ That, and a disturbing number of emotional outbursts against > systemd, which has nothing to do with any of this. ] Oh, so I'm entirely dreaming this then: https://github.com/systemd/systemd/pull/3905 Completely unrelated. Also, the argument there seems unfair at best, you don't need cpu-v2 for buffered write control, you only need memcg and block co-mounted.
[toc] | [prev] | [next] | [standalone]
| From | Johannes Weiner <hannes@cmpxchg.org> |
|---|---|
| Date | 2016-08-16 18:40 +0200 |
| Message-ID | <s6Pzc-5pz-19@gated-at.bofh.it> |
| In reply to | #1463837 |
On Tue, Aug 16, 2016 at 04:07:38PM +0200, Peter Zijlstra wrote: > On Wed, Aug 10, 2016 at 06:09:44PM -0400, Johannes Weiner wrote: > > > [ That, and a disturbing number of emotional outbursts against > > systemd, which has nothing to do with any of this. ] > > Oh, so I'm entirely dreaming this then: > > https://github.com/systemd/systemd/pull/3905 > > Completely unrelated. Yes and no. We certainly do use systemd (kind of hard not to at this point if you're using any major distribution), and we do feed back the changes we make to it upstream. But this is updating systemd to work with the resource control design choices we made in the kernel, not the other way round. As I wrote to Mike before, we have been running into these resource control issues way before systemd, when we used a combination of libcgroup and custom hacks to coordinate the jobs on the system. The cgroup2 design choices fell out of experiences with those setups. Neither the problem statement nor the proposed solutions depend on systemd, which is why I had hoped we could focus these cgroup2 debates around the broader resource control issues we are trying to address, rather than get hung up on one contentious user of the interface. > Also, the argument there seems unfair at best, you don't need cpu-v2 for > buffered write control, you only need memcg and block co-mounted. Yes, memcg and block agreeing is enough for that case. But I mentioned a whole bunch of these examples, to make the broader case for a common controller model.
[toc] | [prev] | [next] | [standalone]
| From | Mike Galbraith <umgwanakikbuti@gmail.com> |
|---|---|
| Date | 2016-08-17 11:40 +0200 |
| Message-ID | <s75uh-7zL-3@gated-at.bofh.it> |
| In reply to | #1463931 |
On Tue, 2016-08-16 at 12:30 -0400, Johannes Weiner wrote: > On Tue, Aug 16, 2016 at 04:07:38PM +0200, Peter Zijlstra wrote: > > Also, the argument there seems unfair at best, you don't need cpu-v2 for > > buffered write control, you only need memcg and block co-mounted. > > Yes, memcg and block agreeing is enough for that case. But I mentioned > a whole bunch of these examples, to make the broader case for a common > controller model. The core issue I have with that model is that it defines context=mm, and declares context=task to be invalid, while in reality, both views are perfectly valid, useful, and in use. That redefinition of context is demonstrably harmful when applied to scheduler related controllers, rendering a substantial portion of to be managed objects completely unmanageable. You (collectively) know that full well. AFAIKT, there is only one viable option, and that is to continue to allow both. Whether you like the duality or not (who would), it's deeply embedded in what's under the controllers, and won't go away. I'll now go try a little harder while you ponder (or pop) this thought bubble, see if I can set a new personal best at the art of ignoring. (CC did not help btw, your bad if you don't like bubble content) -Mike
[toc] | [prev] | [next] | [standalone]
| From | Tejun Heo <tj@kernel.org> |
|---|---|
| Date | 2016-08-17 00:00 +0200 |
| Message-ID | <s6UyS-8k-17@gated-at.bofh.it> |
| In reply to | #1463837 |
Hello, Peter. On Tue, Aug 16, 2016 at 04:07:38PM +0200, Peter Zijlstra wrote: > On Wed, Aug 10, 2016 at 06:09:44PM -0400, Johannes Weiner wrote: > > > [ That, and a disturbing number of emotional outbursts against > > systemd, which has nothing to do with any of this. ] > > Oh, so I'm entirely dreaming this then: > > https://github.com/systemd/systemd/pull/3905 > > Completely unrelated. We use centos in the fleet and are trying to control resources in base system which of course requires writeback control and thus cgroup v2. I'm working to solve the use cases people are facing and systemd is a piece of the puzzle. There is no big conspiracy. As Johannes and Chris already pointed out, systemd is a user of cgroup v2, a pretty important one at this point. While I of course care about it having a proper support for cgroup v2, systemd is just picking up the changes in cgroup v2. cgroup v2 design wouldn't be different without systemd. We'll just have something else playing its role in resource management. > Also, the argument there seems unfair at best, you don't need cpu-v2 for > buffered write control, you only need memcg and block co-mounted. ( Everything I'm gonna write below has already been extensively documented in the posted documentation. I'm gonna repeat the points for completeness but if we're gonna start an actually technical discussion, let's please start from the documentation instead of jumping off of an one liner and trying to rebuild the entire argument each time. I'm not sure what you exactly meant by the above sentence and assuming that you're saying that there are no new capabilities gained by cpu controller being on the v2 hierarchy and thus the cpu controller doesn't need to be on cgroup v2? If I'm mistaken, please let me know. ) Just co-mounting isn't enough as it still leaves the problems with anonymous consumption, different handling of threads belonging to different cgroups, and whether it's acceptable to always require blkio to use memory controller. cgroup v2 is what we got after working through all these issues. While it is true that cpu controller doesn't need to be on cgroup v2 for writeback control to work, it misses the point about the larger design issues identified during writeback control work, which can be easily applied to the cpu controller - e.g. accounting cpu cycles spent for packet reception, memory reclaim, IO encryption and so on. In addition, it is an unnecessary inconvenience for users who want writeback control to require the complication of mixed v1 and v2 hierarchies when their requirements can be easily served by v2, especially considering that the only blocked part is trivial changes to expose cpu controller interface on v2 and that enabling it on v2 doesn't preclude it from being used on a v1 hierarchy if necessary. Thanks. -- tejun
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web