[virtio-dev] Re: [PATCH v7 3/6] mm: Use zone and order instead of free area in free_list manipulators

2019-09-06 Thread Pankaj Gupta


> 
> From: Alexander Duyck 
> 
> In order to enable the use of the zone from the list manipulator functions
> I will need access to the zone pointer. As it turns out most of the
> accessors were always just being directly passed >free_area[order]
> anyway so it would make sense to just fold that into the function itself
> and pass the zone and order as arguments instead of the free area.
> 
> In order to be able to reference the zone we need to move the declaration
> of the functions down so that we have the zone defined before we define the
> list manipulation functions.
> 
> Reviewed-by: Dan Williams 
> Signed-off-by: Alexander Duyck 
> ---
>  include/linux/mmzone.h |   70
>  ++--
>  mm/page_alloc.c|   30 -
>  2 files changed, 49 insertions(+), 51 deletions(-)
> 
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 125f300981c6..2ddf1f1971c0 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -100,29 +100,6 @@ struct free_area {
>   unsigned long   nr_free;
>  };
>  
> -/* Used for pages not on another list */
> -static inline void add_to_free_area(struct page *page, struct free_area
> *area,
> -  int migratetype)
> -{
> - list_add(>lru, >free_list[migratetype]);
> - area->nr_free++;
> -}
> -
> -/* Used for pages not on another list */
> -static inline void add_to_free_area_tail(struct page *page, struct free_area
> *area,
> -   int migratetype)
> -{
> - list_add_tail(>lru, >free_list[migratetype]);
> - area->nr_free++;
> -}
> -
> -/* Used for pages which are on another list */
> -static inline void move_to_free_area(struct page *page, struct free_area
> *area,
> -  int migratetype)
> -{
> - list_move(>lru, >free_list[migratetype]);
> -}
> -
>  static inline struct page *get_page_from_free_area(struct free_area *area,
>   int migratetype)
>  {
> @@ -130,15 +107,6 @@ static inline struct page
> *get_page_from_free_area(struct free_area *area,
>   struct page, lru);
>  }
>  
> -static inline void del_page_from_free_area(struct page *page,
> - struct free_area *area)
> -{
> - list_del(>lru);
> - __ClearPageBuddy(page);
> - set_page_private(page, 0);
> - area->nr_free--;
> -}
> -
>  static inline bool free_area_empty(struct free_area *area, int migratetype)
>  {
>   return list_empty(>free_list[migratetype]);
> @@ -796,6 +764,44 @@ static inline bool pgdat_is_empty(pg_data_t *pgdat)
>   return !pgdat->node_start_pfn && !pgdat->node_spanned_pages;
>  }
>  
> +/* Used for pages not on another list */
> +static inline void add_to_free_list(struct page *page, struct zone *zone,
> + unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_add(>lru, >free_list[migratetype]);
> + area->nr_free++;
> +}
> +
> +/* Used for pages not on another list */
> +static inline void add_to_free_list_tail(struct page *page, struct zone
> *zone,
> +  unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_add_tail(>lru, >free_list[migratetype]);
> + area->nr_free++;
> +}
> +
> +/* Used for pages which are on another list */
> +static inline void move_to_free_list(struct page *page, struct zone *zone,
> +  unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_move(>lru, >free_list[migratetype]);
> +}
> +
> +static inline void del_page_from_free_list(struct page *page, struct zone
> *zone,
> +unsigned int order)
> +{
> + list_del(>lru);
> + __ClearPageBuddy(page);
> + set_page_private(page, 0);
> + zone->free_area[order].nr_free--;
> +}
> +
>  #include 
>  
>  void build_all_zonelists(pg_data_t *pgdat);
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index a791f2baeeeb..f85dc1561b85 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -921,7 +921,6 @@ static inline void __free_one_page(struct page *page,
>   struct capture_control *capc = task_capc(zone);
>   unsigned long uninitialized_var(buddy_pfn);
>   unsigned long combined_pfn;
> - struct free_area *area;
>   unsigned int max_order;
>   struct page *buddy;
>  
> @@ -958,7 +957,7 @@ static inline void __free_one_page(struct page *page,
>   if (page_is_guard(buddy))
>   clear_page_guard(zone, buddy, order, migratetype);
>   else
> - del_page_from_free_area(buddy, >free_area[order]);
> + del_page_from_free_list(buddy, zone, order);
>   combined_pfn = buddy_pfn & pfn;
>   page = page + 

[virtio-dev] Re: [PATCH v7 3/6] mm: Use zone and order instead of free area in free_list manipulators

2019-09-06 Thread David Hildenbrand
On 04.09.19 17:10, Alexander Duyck wrote:
> From: Alexander Duyck 
> 
> In order to enable the use of the zone from the list manipulator functions
> I will need access to the zone pointer. As it turns out most of the
> accessors were always just being directly passed >free_area[order]
> anyway so it would make sense to just fold that into the function itself
> and pass the zone and order as arguments instead of the free area.
> 
> In order to be able to reference the zone we need to move the declaration
> of the functions down so that we have the zone defined before we define the
> list manipulation functions.
> 
> Reviewed-by: Dan Williams 
> Signed-off-by: Alexander Duyck 
> ---
>  include/linux/mmzone.h |   70 
> ++--
>  mm/page_alloc.c|   30 -
>  2 files changed, 49 insertions(+), 51 deletions(-)
> 
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 125f300981c6..2ddf1f1971c0 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -100,29 +100,6 @@ struct free_area {
>   unsigned long   nr_free;
>  };
>  
> -/* Used for pages not on another list */
> -static inline void add_to_free_area(struct page *page, struct free_area 
> *area,
> -  int migratetype)
> -{
> - list_add(>lru, >free_list[migratetype]);
> - area->nr_free++;
> -}
> -
> -/* Used for pages not on another list */
> -static inline void add_to_free_area_tail(struct page *page, struct free_area 
> *area,
> -   int migratetype)
> -{
> - list_add_tail(>lru, >free_list[migratetype]);
> - area->nr_free++;
> -}
> -
> -/* Used for pages which are on another list */
> -static inline void move_to_free_area(struct page *page, struct free_area 
> *area,
> -  int migratetype)
> -{
> - list_move(>lru, >free_list[migratetype]);
> -}
> -
>  static inline struct page *get_page_from_free_area(struct free_area *area,
>   int migratetype)
>  {
> @@ -130,15 +107,6 @@ static inline struct page 
> *get_page_from_free_area(struct free_area *area,
>   struct page, lru);
>  }
>  
> -static inline void del_page_from_free_area(struct page *page,
> - struct free_area *area)
> -{
> - list_del(>lru);
> - __ClearPageBuddy(page);
> - set_page_private(page, 0);
> - area->nr_free--;
> -}
> -
>  static inline bool free_area_empty(struct free_area *area, int migratetype)
>  {
>   return list_empty(>free_list[migratetype]);
> @@ -796,6 +764,44 @@ static inline bool pgdat_is_empty(pg_data_t *pgdat)
>   return !pgdat->node_start_pfn && !pgdat->node_spanned_pages;
>  }
>  
> +/* Used for pages not on another list */
> +static inline void add_to_free_list(struct page *page, struct zone *zone,
> + unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_add(>lru, >free_list[migratetype]);
> + area->nr_free++;
> +}
> +
> +/* Used for pages not on another list */
> +static inline void add_to_free_list_tail(struct page *page, struct zone 
> *zone,
> +  unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_add_tail(>lru, >free_list[migratetype]);
> + area->nr_free++;
> +}
> +
> +/* Used for pages which are on another list */
> +static inline void move_to_free_list(struct page *page, struct zone *zone,
> +  unsigned int order, int migratetype)
> +{
> + struct free_area *area = >free_area[order];
> +
> + list_move(>lru, >free_list[migratetype]);
> +}
> +
> +static inline void del_page_from_free_list(struct page *page, struct zone 
> *zone,
> +unsigned int order)
> +{
> + list_del(>lru);
> + __ClearPageBuddy(page);
> + set_page_private(page, 0);
> + zone->free_area[order].nr_free--;
> +}
> +
>  #include 
>  
>  void build_all_zonelists(pg_data_t *pgdat);
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index a791f2baeeeb..f85dc1561b85 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -921,7 +921,6 @@ static inline void __free_one_page(struct page *page,
>   struct capture_control *capc = task_capc(zone);
>   unsigned long uninitialized_var(buddy_pfn);
>   unsigned long combined_pfn;
> - struct free_area *area;
>   unsigned int max_order;
>   struct page *buddy;
>  
> @@ -958,7 +957,7 @@ static inline void __free_one_page(struct page *page,
>   if (page_is_guard(buddy))
>   clear_page_guard(zone, buddy, order, migratetype);
>   else
> - del_page_from_free_area(buddy, >free_area[order]);
> + del_page_from_free_list(buddy, zone, order);
>   combined_pfn =