Messages in this thread | | | Subject | Re: [PATCH 0/2 x86] fix some page faults in nmi if kmemcheck is enabled | From | Li Zhong <> | Date | Thu, 23 Feb 2012 17:53:48 +0800 |
| |
On Tue, 2012-02-21 at 11:17 +0100, Peter Zijlstra wrote: > On Tue, 2012-02-21 at 09:42 +0800, Li Zhong wrote: > > > > Hell no, these are some of the ugliest patches I've seen in a while. Not > > > to mention that their changelogs are utter crap since they don't even > > > explain why they're doing what they're doing. > > > > > Hi Peter, > > > > I agree that the fix is ugly. I'm willing to change if there are some > > better ways. > > There are always better ways..
Hi Peter,
I will think further about it, and would appreciate it if you could give some good ideas.
> > > The problem here is: > > 1. It seems x86 doesn't allow page faults in nmi, and there are checks > > in the code, like WARN_ON_ONCE(in_nmi()). > > I bet that's not x86 only..
Maybe, I found this problem on x86, didn't check other archs.
However, from Documentation/kmemcheck.txt, seems kmemcheck only supports x86.
> > > 2. If CONFIG_KMEMCHECK is enabled, the pages allocated through slab will > > be marked as non-present, to capture uninitialized memory access. More > > information in Documentation/kmemcheck.txt . > > So then kmemcheck is buggy, since the nmiaction structure is initialized > in register_nmi_handler(), so it should most definitely not be marked > non-present. >
I'm not sure whether I understand it correctly. Do you mean that nmiaction is initialized in register_nmi_handler(), which indicates it will be used in nmi, so it shouldn't be marked non-present?
But for kmemcheck, why need it know the information that page fault is not allowed in nmi?
Or maybe I misunderstand your point here?
> > 3. From the log, there are some memories accessed in nmi, which are in > > pages marked as non-present by kmemcheck, as they are allocated by > > something like kmalloc(). > > So figure out why and fix that instead of writing ugly ass patches that > seemingly work around the problem without actually thinking about it. >
I think the reason is that kmalloc ( or kzalloc ... ) uses malloc_sizes slab caches to allocate memory. The malloc_sizes slab caches is set up without SLAB_NOTRACK flag, then kmemcheck marks the pages non-present to do its check in page fault handling code. I think we shouldn't disable kmemechek for the general malloc_sizes caches.
Thanks, Zhong
| |