Message ID | 20180712233636.20629-7-ying.huang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jul 13, 2018 at 07:36:36AM +0800, Huang, Ying wrote: > From: Huang Ying <ying.huang@intel.com> > > In this patch, locking related code is shared between huge/normal code > path in put_swap_page() to reduce code duplication. And `free_entries > == 0` case is merged into more general `free_entries != > SWAPFILE_CLUSTER` case, because the new locking method makes it easy. Might be a bit easier to think about the two changes if they were split up. Agree with Dave's comment from patch 1, but otherwise the series looks ok to me. I like the nr_swap_entries macro, that's clever.
Daniel Jordan <daniel.m.jordan@oracle.com> writes: > On Fri, Jul 13, 2018 at 07:36:36AM +0800, Huang, Ying wrote: >> From: Huang Ying <ying.huang@intel.com> >> >> In this patch, locking related code is shared between huge/normal code >> path in put_swap_page() to reduce code duplication. And `free_entries >> == 0` case is merged into more general `free_entries != >> SWAPFILE_CLUSTER` case, because the new locking method makes it easy. > > Might be a bit easier to think about the two changes if they were split up. I just think the second change appears too trivial to be a separate patch. > Agree with Dave's comment from patch 1, but otherwise the series looks ok to > me. I like the nr_swap_entries macro, that's clever. Thanks! Best Regards, Huang, Ying
diff --git a/mm/swapfile.c b/mm/swapfile.c index bc488bf36c86..17dce780b4c8 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1280,8 +1280,8 @@ void put_swap_page(struct page *page, swp_entry_t entry) if (!si) return; + ci = lock_cluster_or_swap_info(si, offset); if (nr == SWAPFILE_CLUSTER) { - ci = lock_cluster(si, offset); VM_BUG_ON(!cluster_is_huge(ci)); map = si->swap_map + offset; for (i = 0; i < SWAPFILE_CLUSTER; i++) { @@ -1290,13 +1290,9 @@ void put_swap_page(struct page *page, swp_entry_t entry) if (val == SWAP_HAS_CACHE) free_entries++; } - if (!free_entries) { - for (i = 0; i < SWAPFILE_CLUSTER; i++) - map[i] &= ~SWAP_HAS_CACHE; - } cluster_clear_huge(ci); - unlock_cluster(ci); if (free_entries == SWAPFILE_CLUSTER) { + unlock_cluster_or_swap_info(si, ci); spin_lock(&si->lock); ci = lock_cluster(si, offset); memset(map, 0, SWAPFILE_CLUSTER); @@ -1307,12 +1303,16 @@ void put_swap_page(struct page *page, swp_entry_t entry) return; } } - if (nr == 1 || free_entries) { - for (i = 0; i < nr; i++, entry.val++) { - if (!__swap_entry_free(si, entry, SWAP_HAS_CACHE)) - free_swap_slot(entry); + for (i = 0; i < nr; i++, entry.val++) { + if (!__swap_entry_free_locked(si, offset + i, SWAP_HAS_CACHE)) { + unlock_cluster_or_swap_info(si, ci); + free_swap_slot(entry); + if (i == nr - 1) + return; + lock_cluster_or_swap_info(si, offset); } } + unlock_cluster_or_swap_info(si, ci); } #ifdef CONFIG_THP_SWAP