diff options
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r-- | mm/swap_state.c | 41 |
1 files changed, 7 insertions, 34 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c index ed91091d1e68..05b6803f0cce 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -39,10 +39,6 @@ struct address_space *swapper_spaces[MAX_SWAPFILES]; | |||
39 | static unsigned int nr_swapper_spaces[MAX_SWAPFILES]; | 39 | static unsigned int nr_swapper_spaces[MAX_SWAPFILES]; |
40 | bool swap_vma_readahead = true; | 40 | bool swap_vma_readahead = true; |
41 | 41 | ||
42 | #define SWAP_RA_MAX_ORDER_DEFAULT 3 | ||
43 | |||
44 | static int swap_ra_max_order = SWAP_RA_MAX_ORDER_DEFAULT; | ||
45 | |||
46 | #define SWAP_RA_WIN_SHIFT (PAGE_SHIFT / 2) | 42 | #define SWAP_RA_WIN_SHIFT (PAGE_SHIFT / 2) |
47 | #define SWAP_RA_HITS_MASK ((1UL << SWAP_RA_WIN_SHIFT) - 1) | 43 | #define SWAP_RA_HITS_MASK ((1UL << SWAP_RA_WIN_SHIFT) - 1) |
48 | #define SWAP_RA_HITS_MAX SWAP_RA_HITS_MASK | 44 | #define SWAP_RA_HITS_MAX SWAP_RA_HITS_MASK |
@@ -664,6 +660,13 @@ struct page *swap_readahead_detect(struct vm_fault *vmf, | |||
664 | pte_t *tpte; | 660 | pte_t *tpte; |
665 | #endif | 661 | #endif |
666 | 662 | ||
663 | max_win = 1 << min_t(unsigned int, READ_ONCE(page_cluster), | ||
664 | SWAP_RA_ORDER_CEILING); | ||
665 | if (max_win == 1) { | ||
666 | swap_ra->win = 1; | ||
667 | return NULL; | ||
668 | } | ||
669 | |||
667 | faddr = vmf->address; | 670 | faddr = vmf->address; |
668 | entry = pte_to_swp_entry(vmf->orig_pte); | 671 | entry = pte_to_swp_entry(vmf->orig_pte); |
669 | if ((unlikely(non_swap_entry(entry)))) | 672 | if ((unlikely(non_swap_entry(entry)))) |
@@ -672,12 +675,6 @@ struct page *swap_readahead_detect(struct vm_fault *vmf, | |||
672 | if (page) | 675 | if (page) |
673 | return page; | 676 | return page; |
674 | 677 | ||
675 | max_win = 1 << READ_ONCE(swap_ra_max_order); | ||
676 | if (max_win == 1) { | ||
677 | swap_ra->win = 1; | ||
678 | return NULL; | ||
679 | } | ||
680 | |||
681 | fpfn = PFN_DOWN(faddr); | 678 | fpfn = PFN_DOWN(faddr); |
682 | swap_ra_info = GET_SWAP_RA_VAL(vma); | 679 | swap_ra_info = GET_SWAP_RA_VAL(vma); |
683 | pfn = PFN_DOWN(SWAP_RA_ADDR(swap_ra_info)); | 680 | pfn = PFN_DOWN(SWAP_RA_ADDR(swap_ra_info)); |
@@ -786,32 +783,8 @@ static struct kobj_attribute vma_ra_enabled_attr = | |||
786 | __ATTR(vma_ra_enabled, 0644, vma_ra_enabled_show, | 783 | __ATTR(vma_ra_enabled, 0644, vma_ra_enabled_show, |
787 | vma_ra_enabled_store); | 784 | vma_ra_enabled_store); |
788 | 785 | ||
789 | static ssize_t vma_ra_max_order_show(struct kobject *kobj, | ||
790 | struct kobj_attribute *attr, char *buf) | ||
791 | { | ||
792 | return sprintf(buf, "%d\n", swap_ra_max_order); | ||
793 | } | ||
794 | static ssize_t vma_ra_max_order_store(struct kobject *kobj, | ||
795 | struct kobj_attribute *attr, | ||
796 | const char *buf, size_t count) | ||
797 | { | ||
798 | int err, v; | ||
799 | |||
800 | err = kstrtoint(buf, 10, &v); | ||
801 | if (err || v > SWAP_RA_ORDER_CEILING || v <= 0) | ||
802 | return -EINVAL; | ||
803 | |||
804 | swap_ra_max_order = v; | ||
805 | |||
806 | return count; | ||
807 | } | ||
808 | static struct kobj_attribute vma_ra_max_order_attr = | ||
809 | __ATTR(vma_ra_max_order, 0644, vma_ra_max_order_show, | ||
810 | vma_ra_max_order_store); | ||
811 | |||
812 | static struct attribute *swap_attrs[] = { | 786 | static struct attribute *swap_attrs[] = { |
813 | &vma_ra_enabled_attr.attr, | 787 | &vma_ra_enabled_attr.attr, |
814 | &vma_ra_max_order_attr.attr, | ||
815 | NULL, | 788 | NULL, |
816 | }; | 789 | }; |
817 | 790 | ||