diff for duplicates of <871stze481.fsf@yhuang-dev.intel.com> diff --git a/a/1.txt b/N1/1.txt index bfff9d3..584dcf7 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -5,11 +5,11 @@ Tim Chen <tim.c.chen@linux.intel.com> writes: >> >> A variation of get_swap_page(), get_huge_swap_page(), is added to >> allocate a swap cluster (HPAGE_PMD_NR swap slots) based on the swap ->> cluster allocation function.A A A fair simple algorithm is used, that is, +>> cluster allocation function. A fair simple algorithm is used, that is, >> only the first swap device in priority list will be tried to allocate ->> the swap cluster.A A The function will fail if the trying is not +>> the swap cluster. The function will fail if the trying is not >> successful, and the caller will fallback to allocate a single swap slot ->> instead.A A This works good enough for normal cases. +>> instead. This works good enough for normal cases. >> >> This will be used for the THP (Transparent Huge Page) swap support. >> Where get_huge_swap_page() will be used to allocate one swap cluster for @@ -17,7 +17,7 @@ Tim Chen <tim.c.chen@linux.intel.com> writes: >> >> Because of the algorithm adopted, if the difference of the number of the >> free swap clusters among multiple swap devices is significant, it is ->> possible that some THPs are split earlier than necessary.A A For example, +>> possible that some THPs are split earlier than necessary. For example, >> this could be caused by big size difference among multiple swap devices. >> >> Cc: Andrea Arcangeli <aarcange@redhat.com> @@ -28,28 +28,28 @@ Tim Chen <tim.c.chen@linux.intel.com> writes: >> Cc: Rik van Riel <riel@redhat.com> >> Signed-off-by: "Huang, Ying" <ying.huang@intel.com> >> --- ->> A include/linux/swap.h | 19 ++++++++++++++++++- ->> A mm/swap_slots.cA A A A A A |A A 5 +++-- ->> A mm/swapfile.cA A A A A A A A | 16 ++++++++++++---- ->> A 3 files changed, 33 insertions(+), 7 deletions(-) +>> include/linux/swap.h | 19 ++++++++++++++++++- +>> mm/swap_slots.c | 5 +++-- +>> mm/swapfile.c | 16 ++++++++++++---- +>> 3 files changed, 33 insertions(+), 7 deletions(-) >> >> diff --git a/include/linux/swap.h b/include/linux/swap.h >> index 278e1349a424..e3a7609a8989 100644 >> --- a/include/linux/swap.h >> +++ b/include/linux/swap.h >> @@ -388,7 +388,7 @@ static inline long get_nr_swap_pages(void) ->> A extern void si_swapinfo(struct sysinfo *); ->> A extern swp_entry_t get_swap_page(void); ->> A extern swp_entry_t get_swap_page_of_type(int); +>> extern void si_swapinfo(struct sysinfo *); +>> extern swp_entry_t get_swap_page(void); +>> extern swp_entry_t get_swap_page_of_type(int); >> -extern int get_swap_pages(int n, swp_entry_t swp_entries[]); >> +extern int get_swap_pages(int n, swp_entry_t swp_entries[], bool huge); ->> A extern int add_swap_count_continuation(swp_entry_t, gfp_t); ->> A extern void swap_shmem_alloc(swp_entry_t); ->> A extern int swap_duplicate(swp_entry_t); +>> extern int add_swap_count_continuation(swp_entry_t, gfp_t); +>> extern void swap_shmem_alloc(swp_entry_t); +>> extern int swap_duplicate(swp_entry_t); >> @@ -527,6 +527,23 @@ static inline swp_entry_t get_swap_page(void) ->> A ->> A #endif /* CONFIG_SWAP */ ->> A +>> +>> #endif /* CONFIG_SWAP */ +>> >> +#ifdef CONFIG_THP_SWAP_CLUSTER >> +static inline swp_entry_t get_huge_swap_page(void) >> +{ @@ -67,64 +67,64 @@ Tim Chen <tim.c.chen@linux.intel.com> writes: >> +} >> +#endif >> + ->> A #ifdef CONFIG_MEMCG ->> A static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg) ->> A { +>> #ifdef CONFIG_MEMCG +>> static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg) +>> { >> diff --git a/mm/swap_slots.c b/mm/swap_slots.c >> index 9b5bc86f96ad..075bb39e03c5 100644 >> --- a/mm/swap_slots.c >> +++ b/mm/swap_slots.c >> @@ -258,7 +258,8 @@ static int refill_swap_slots_cache(struct swap_slots_cache *cache) ->> A ->> A cache->cur = 0; ->> A if (swap_slot_cache_active) +>> +>> cache->cur = 0; +>> if (swap_slot_cache_active) >> - cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, cache->slots); >> + cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, cache->slots, ->> + A A A false); ->> A ->> A return cache->nr; ->> A } +>> + false); +>> +>> return cache->nr; +>> } >> @@ -334,7 +335,7 @@ swp_entry_t get_swap_page(void) ->> A return entry; ->> A } ->> A +>> return entry; +>> } +>> >> - get_swap_pages(1, &entry); >> + get_swap_pages(1, &entry, false); ->> A ->> A return entry; ->> A } +>> +>> return entry; +>> } >> diff --git a/mm/swapfile.c b/mm/swapfile.c >> index 91876c33114b..7241c937e52b 100644 >> --- a/mm/swapfile.c >> +++ b/mm/swapfile.c >> @@ -904,11 +904,12 @@ static unsigned long scan_swap_map(struct swap_info_struct *si, ->> A ->> A } ->> A +>> +>> } +>> >> -int get_swap_pages(int n_goal, swp_entry_t swp_entries[]) > > >> +int get_swap_pages(int n_goal, swp_entry_t swp_entries[], bool huge) ->> A { ->> A struct swap_info_struct *si, *next; ->> A long avail_pgs; ->> A int n_ret = 0; +>> { +>> struct swap_info_struct *si, *next; +>> long avail_pgs; +>> int n_ret = 0; >> + int nr_pages = huge_cluster_nr_entries(huge); ->> A ->> A avail_pgs = atomic_long_read(&nr_swap_pages); ->> A if (avail_pgs <= 0) +>> +>> avail_pgs = atomic_long_read(&nr_swap_pages); +>> if (avail_pgs <= 0) >> @@ -920,6 +921,10 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[]) ->> A if (n_goal > avail_pgs) ->> A n_goal = avail_pgs; ->> A +>> if (n_goal > avail_pgs) +>> n_goal = avail_pgs; +>> >> + n_goal *= nr_pages; > -> I think if (n_goal > 1) when huge is true,A +> I think if (n_goal > 1) when huge is true, > n_goal should be set to huge_cluster_nr_entries(huge) here > or we could have an invalid check below. We probably > should add a comment to get_swap_pages on how we treat -> n_goal when huge is true. A Maybe say we will always treat -> n_goal as SWAPFILE_CLUSTER when huge is true.A +> n_goal when huge is true. Maybe say we will always treat +> n_goal as SWAPFILE_CLUSTER when huge is true. Yes. The meaning of n_goal and n_ret isn't consistent between huge and normal swap entry allocation. I will revise the logic in the function @@ -133,15 +133,15 @@ to make them consistent. >> + if (avail_pgs < n_goal) >> + goto noswap; >> + ->> A atomic_long_sub(n_goal, &nr_swap_pages); ->> A ->> A spin_lock(&swap_avail_lock); +>> atomic_long_sub(n_goal, &nr_swap_pages); +>> +>> spin_lock(&swap_avail_lock); >> @@ -946,10 +951,13 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[]) ->> A spin_unlock(&si->lock); ->> A goto nextsi; ->> A } +>> spin_unlock(&si->lock); +>> goto nextsi; +>> } >> - n_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE, ->> - A A A A n_goal, swp_entries); +>> - n_goal, swp_entries); >> + if (likely(nr_pages == 1)) > > if (likely(!huge)) is probably more readable @@ -152,17 +152,11 @@ Best Regards, Huang, Ying >> + n_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE, ->> + A A A A n_goal, swp_entries); +>> + n_goal, swp_entries); >> + else >> + n_ret = swap_alloc_huge_cluster(si, swp_entries); ->> A spin_unlock(&si->lock); +>> spin_unlock(&si->lock); > > Thanks. > > Tim - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index dfa3929..c8a7750 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -5,11 +5,11 @@ "Subject\0Re: [PATCH -mm -v6 4/9] mm, THP, swap: Add get_huge_swap_page()\0" "Date\0Wed, 15 Mar 2017 09:08:46 +0800\0" "To\0Tim Chen <tim.c.chen@linux.intel.com>\0" - "Cc\0Huang" + "Cc\0Huang\\" Ying <ying.huang@intel.com> Andrew Morton <akpm@linux-foundation.org> - linux-mm@kvack.org - linux-kernel@vger.kernel.org + <linux-mm@kvack.org> + <linux-kernel@vger.kernel.org> Andrea Arcangeli <aarcange@redhat.com> Kirill A . Shutemov <kirill.shutemov@linux.intel.com> Hugh Dickins <hughd@google.com> @@ -25,11 +25,11 @@ ">> \n" ">> A variation of get_swap_page(), get_huge_swap_page(), is added to\n" ">> allocate a swap cluster (HPAGE_PMD_NR swap slots) based on the swap\n" - ">> cluster allocation function.A A A fair simple algorithm is used, that is,\n" + ">> cluster allocation function.\302\240\302\240A fair simple algorithm is used, that is,\n" ">> only the first swap device in priority list will be tried to allocate\n" - ">> the swap cluster.A A The function will fail if the trying is not\n" + ">> the swap cluster.\302\240\302\240The function will fail if the trying is not\n" ">> successful, and the caller will fallback to allocate a single swap slot\n" - ">> instead.A A This works good enough for normal cases.\n" + ">> instead.\302\240\302\240This works good enough for normal cases.\n" ">> \n" ">> This will be used for the THP (Transparent Huge Page) swap support.\n" ">> Where get_huge_swap_page() will be used to allocate one swap cluster for\n" @@ -37,7 +37,7 @@ ">> \n" ">> Because of the algorithm adopted, if the difference of the number of the\n" ">> free swap clusters among multiple swap devices is significant, it is\n" - ">> possible that some THPs are split earlier than necessary.A A For example,\n" + ">> possible that some THPs are split earlier than necessary.\302\240\302\240For example,\n" ">> this could be caused by big size difference among multiple swap devices.\n" ">> \n" ">> Cc: Andrea Arcangeli <aarcange@redhat.com>\n" @@ -48,28 +48,28 @@ ">> Cc: Rik van Riel <riel@redhat.com>\n" ">> Signed-off-by: \"Huang, Ying\" <ying.huang@intel.com>\n" ">> ---\n" - ">> A include/linux/swap.h | 19 ++++++++++++++++++-\n" - ">> A mm/swap_slots.cA A A A A A |A A 5 +++--\n" - ">> A mm/swapfile.cA A A A A A A A | 16 ++++++++++++----\n" - ">> A 3 files changed, 33 insertions(+), 7 deletions(-)\n" + ">> \302\240include/linux/swap.h | 19 ++++++++++++++++++-\n" + ">> \302\240mm/swap_slots.c\302\240\302\240\302\240\302\240\302\240\302\240|\302\240\302\2405 +++--\n" + ">> \302\240mm/swapfile.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240| 16 ++++++++++++----\n" + ">> \302\2403 files changed, 33 insertions(+), 7 deletions(-)\n" ">> \n" ">> diff --git a/include/linux/swap.h b/include/linux/swap.h\n" ">> index 278e1349a424..e3a7609a8989 100644\n" ">> --- a/include/linux/swap.h\n" ">> +++ b/include/linux/swap.h\n" ">> @@ -388,7 +388,7 @@ static inline long get_nr_swap_pages(void)\n" - ">> A extern void si_swapinfo(struct sysinfo *);\n" - ">> A extern swp_entry_t get_swap_page(void);\n" - ">> A extern swp_entry_t get_swap_page_of_type(int);\n" + ">> \302\240extern void si_swapinfo(struct sysinfo *);\n" + ">> \302\240extern swp_entry_t get_swap_page(void);\n" + ">> \302\240extern swp_entry_t get_swap_page_of_type(int);\n" ">> -extern int get_swap_pages(int n, swp_entry_t swp_entries[]);\n" ">> +extern int get_swap_pages(int n, swp_entry_t swp_entries[], bool huge);\n" - ">> A extern int add_swap_count_continuation(swp_entry_t, gfp_t);\n" - ">> A extern void swap_shmem_alloc(swp_entry_t);\n" - ">> A extern int swap_duplicate(swp_entry_t);\n" + ">> \302\240extern int add_swap_count_continuation(swp_entry_t, gfp_t);\n" + ">> \302\240extern void swap_shmem_alloc(swp_entry_t);\n" + ">> \302\240extern int swap_duplicate(swp_entry_t);\n" ">> @@ -527,6 +527,23 @@ static inline swp_entry_t get_swap_page(void)\n" - ">> A \n" - ">> A #endif /* CONFIG_SWAP */\n" - ">> A \n" + ">> \302\240\n" + ">> \302\240#endif /* CONFIG_SWAP */\n" + ">> \302\240\n" ">> +#ifdef CONFIG_THP_SWAP_CLUSTER\n" ">> +static inline swp_entry_t get_huge_swap_page(void)\n" ">> +{\n" @@ -87,64 +87,64 @@ ">> +}\n" ">> +#endif\n" ">> +\n" - ">> A #ifdef CONFIG_MEMCG\n" - ">> A static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)\n" - ">> A {\n" + ">> \302\240#ifdef CONFIG_MEMCG\n" + ">> \302\240static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)\n" + ">> \302\240{\n" ">> diff --git a/mm/swap_slots.c b/mm/swap_slots.c\n" ">> index 9b5bc86f96ad..075bb39e03c5 100644\n" ">> --- a/mm/swap_slots.c\n" ">> +++ b/mm/swap_slots.c\n" ">> @@ -258,7 +258,8 @@ static int refill_swap_slots_cache(struct swap_slots_cache *cache)\n" - ">> A \n" - ">> A \tcache->cur = 0;\n" - ">> A \tif (swap_slot_cache_active)\n" + ">> \302\240\n" + ">> \302\240\tcache->cur = 0;\n" + ">> \302\240\tif (swap_slot_cache_active)\n" ">> -\t\tcache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, cache->slots);\n" ">> +\t\tcache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, cache->slots,\n" - ">> +\t\t\t\t\tA A A false);\n" - ">> A \n" - ">> A \treturn cache->nr;\n" - ">> A }\n" + ">> +\t\t\t\t\t\302\240\302\240\302\240false);\n" + ">> \302\240\n" + ">> \302\240\treturn cache->nr;\n" + ">> \302\240}\n" ">> @@ -334,7 +335,7 @@ swp_entry_t get_swap_page(void)\n" - ">> A \t\t\treturn entry;\n" - ">> A \t}\n" - ">> A \n" + ">> \302\240\t\t\treturn entry;\n" + ">> \302\240\t}\n" + ">> \302\240\n" ">> -\tget_swap_pages(1, &entry);\n" ">> +\tget_swap_pages(1, &entry, false);\n" - ">> A \n" - ">> A \treturn entry;\n" - ">> A }\n" + ">> \302\240\n" + ">> \302\240\treturn entry;\n" + ">> \302\240}\n" ">> diff --git a/mm/swapfile.c b/mm/swapfile.c\n" ">> index 91876c33114b..7241c937e52b 100644\n" ">> --- a/mm/swapfile.c\n" ">> +++ b/mm/swapfile.c\n" ">> @@ -904,11 +904,12 @@ static unsigned long scan_swap_map(struct swap_info_struct *si,\n" - ">> A \n" - ">> A }\n" - ">> A \n" + ">> \302\240\n" + ">> \302\240}\n" + ">> \302\240\n" ">> -int get_swap_pages(int n_goal, swp_entry_t swp_entries[])\n" ">\n" ">\n" ">> +int get_swap_pages(int n_goal, swp_entry_t swp_entries[], bool huge)\n" - ">> A {\n" - ">> A \tstruct swap_info_struct *si, *next;\n" - ">> A \tlong avail_pgs;\n" - ">> A \tint n_ret = 0;\n" + ">> \302\240{\n" + ">> \302\240\tstruct swap_info_struct *si, *next;\n" + ">> \302\240\tlong avail_pgs;\n" + ">> \302\240\tint n_ret = 0;\n" ">> +\tint nr_pages = huge_cluster_nr_entries(huge);\n" - ">> A \n" - ">> A \tavail_pgs = atomic_long_read(&nr_swap_pages);\n" - ">> A \tif (avail_pgs <= 0)\n" + ">> \302\240\n" + ">> \302\240\tavail_pgs = atomic_long_read(&nr_swap_pages);\n" + ">> \302\240\tif (avail_pgs <= 0)\n" ">> @@ -920,6 +921,10 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[])\n" - ">> A \tif (n_goal > avail_pgs)\n" - ">> A \t\tn_goal = avail_pgs;\n" - ">> A \n" + ">> \302\240\tif (n_goal > avail_pgs)\n" + ">> \302\240\t\tn_goal = avail_pgs;\n" + ">> \302\240\n" ">> +\tn_goal *= nr_pages;\n" ">\n" - "> I think if (n_goal > 1) when huge is true,A \n" + "> I think if (n_goal > 1) when huge is true,\302\240\n" "> n_goal should be set to huge_cluster_nr_entries(huge) here\n" "> or we could have an invalid check below. We probably\n" "> should add a comment to get_swap_pages on how we treat\n" - "> n_goal when huge is true. A Maybe say we will always treat\n" - "> n_goal as SWAPFILE_CLUSTER when huge is true.A \n" + "> n_goal when huge is true. \302\240Maybe say we will always treat\n" + "> n_goal as SWAPFILE_CLUSTER when huge is true.\302\240\n" "\n" "Yes. The meaning of n_goal and n_ret isn't consistent between huge and\n" "normal swap entry allocation. I will revise the logic in the function\n" @@ -153,15 +153,15 @@ ">> +\tif (avail_pgs < n_goal)\n" ">> +\t\tgoto noswap;\n" ">> +\n" - ">> A \tatomic_long_sub(n_goal, &nr_swap_pages);\n" - ">> A \n" - ">> A \tspin_lock(&swap_avail_lock);\n" + ">> \302\240\tatomic_long_sub(n_goal, &nr_swap_pages);\n" + ">> \302\240\n" + ">> \302\240\tspin_lock(&swap_avail_lock);\n" ">> @@ -946,10 +951,13 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[])\n" - ">> A \t\t\tspin_unlock(&si->lock);\n" - ">> A \t\t\tgoto nextsi;\n" - ">> A \t\t}\n" + ">> \302\240\t\t\tspin_unlock(&si->lock);\n" + ">> \302\240\t\t\tgoto nextsi;\n" + ">> \302\240\t\t}\n" ">> -\t\tn_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE,\n" - ">> -\t\t\t\t\tA A A A n_goal, swp_entries);\n" + ">> -\t\t\t\t\t\302\240\302\240\302\240\302\240n_goal, swp_entries);\n" ">> +\t\tif (likely(nr_pages == 1))\n" ">\n" "> if (likely(!huge)) is probably more readable\n" @@ -172,19 +172,13 @@ "Huang, Ying\n" "\n" ">> +\t\t\tn_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE,\n" - ">> +\t\t\t\t\t\tA A A A n_goal, swp_entries);\n" + ">> +\t\t\t\t\t\t\302\240\302\240\302\240\302\240n_goal, swp_entries);\n" ">> +\t\telse\n" ">> +\t\t\tn_ret = swap_alloc_huge_cluster(si, swp_entries);\n" - ">> A \t\tspin_unlock(&si->lock);\n" + ">> \302\240\t\tspin_unlock(&si->lock);\n" ">\n" "> Thanks.\n" ">\n" - "> Tim\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + > Tim -440a3fbf62316220de690532f2f15e3edd3319df0c6be1418b9d247f792da1bb +47cb260752953458dbffbf9e042a434c6be1e27d848ebbf7f764da586708eb1c
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.