On 2/28/19 12:33 AM, Andrey Ryabinin wrote: > We have common pattern to access lru_lock from a page pointer: > zone_lru_lock(page_zone(page)) > > Which is silly, because it unfolds to this: > &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)]->zone_pgdat->lru_lock > while we can simply do > &NODE_DATA(page_to_nid(page))->lru_lock > Hi Andrey, Nice. I like it so much that I immediately want to tweak it. :) > Remove zone_lru_lock() function, since it's only complicate things. > Use 'page_pgdat(page)->lru_lock' pattern instead. Here, I think the zone_lru_lock() is actually a nice way to add a touch of clarity at the call sites. How about, see below: [snip] > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 2fd4247262e9..22423763c0bd 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -788,10 +788,6 @@ typedef struct pglist_data { > > #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) > #define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid)) > -static inline spinlock_t *zone_lru_lock(struct zone *zone) > -{ > - return &zone->zone_pgdat->lru_lock; > -} > Instead of removing that function, let's change it, and add another (since you have two cases: either a page* or a pgdat* is available), and move it to where it can compile, like this: diff --git a/include/linux/mm.h b/include/linux/mm.h index 80bb6408fe73..cea3437f5d68 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1167,6 +1167,16 @@ static inline pg_data_t *page_pgdat(const struct page *page) return NODE_DATA(page_to_nid(page)); } +static inline spinlock_t *zone_lru_lock(pg_data_t *pgdat) +{ + return &pgdat->lru_lock; +} + +static inline spinlock_t *zone_lru_lock_from_page(struct page *page) +{ + return zone_lru_lock(page_pgdat(page)); +} + #ifdef SECTION_IN_PAGE_FLAGS static inline void set_page_section(struct page *page, unsigned long section) { diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 842f9189537b..e03042fe1d88 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -728,11 +728,6 @@ typedef struct pglist_data { #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) #define node_end_pfn(nid) pgdat_end_pfn(NODE_DATA(nid)) -static inline spinlock_t *zone_lru_lock(struct zone *zone) -{ - return &zone->zone_pgdat->lru_lock; -} - static inline struct lruvec *node_lruvec(struct pglist_data *pgdat) { return &pgdat->lruvec; Like it? thanks, -- John Hubbard NVIDIA