On 12/20/2016 10:18 AM, Michal Hocko wrote: > On Mon 12-12-16 13:59:07, Jia He wrote: >> In commit b9f00e147f27 ("mm, page_alloc: reduce branches in >> zone_statistics"), it reconstructed codes to reduce the branch miss rate. >> Compared with the original logic, it assumed if !(flag & __GFP_OTHER_NODE) >> z->node would not be equal to preferred_zone->node. That seems to be >> incorrect. > > I am sorry but I have hard time following the changelog. It is clear > that you are trying to fix a missed NUMA_{HIT,OTHER} accounting > but it is not really clear when such thing happens. You are adding > preferred_zone->node check. preferred_zone is the first zone in the > requested zonelist. So for the most allocations it is a node from the > local node. But if something request an explicit numa node (without > __GFP_OTHER_NODE which would be the majority I suspect) then we could > indeed end up accounting that as a NUMA_MISS, NUMA_FOREIGN so the > referenced patch indeed caused an unintended change of accounting AFAIU. Since I could not quite wrap my head around all possible combinations, I've got lazy and employed cbmc, inspired by [1] (test file attached if anyone wants to play with it) and tried to test whether both commit b9f00e147f27, and Jia He's patch are equivalent to pre-b9f00e147f27. The tool found counter examples for both cases (there might be more scenarios, but it only reports the first one it hits). Note that decoding the output is not exactly trivial... [1] http://paulmck.livejournal.com/38997.html ============== Counterexample for commit b9f00e147f27 vs pre-b9f00e147f27: numa_node_id() == 1 preferred_zone on node 0 allocated from zone on node 1 without __GFP_OTHER_NODE pre-b9f00e147f27: allocated zone (node 1) increased NUMA_MISS and NUMA_LOCAL preferred zone (node 0) increased NUMA_FOREIGN (that looks correct to me) b9f00e147f27: allocated zone (node 1) got NUMA_HIT and NUMA_LOCAL there's no NUMA_FOREIGN (that's wrong wrt HIT and FOREIGN) ============== Counterexample for Jia He's patch vs pre-b9f00e147f27: numa_node_id() == 0 preferred_zone on node 0 allocated from zone on node 1 without __GFP_OTHER_NODE pre-b9f00e147f27: allocated zone (node 1) increased NUMA_MISS and NUMA_OTHER preferred zone (node 0) increased NUMA_FOREIGN (that looks correct to me) Jia He's patch: allocated zone (node 1) increased NUMA_MISS preferred zone (node 0) increased NUMA_FOREIGN (it's missing NUMA_OTHER)