diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/swap.c | 44 |
1 files changed, 39 insertions, 5 deletions
@@ -432,6 +432,11 @@ static void activate_page_drain(int cpu) | |||
432 | pagevec_lru_move_fn(pvec, __activate_page, NULL); | 432 | pagevec_lru_move_fn(pvec, __activate_page, NULL); |
433 | } | 433 | } |
434 | 434 | ||
435 | static bool need_activate_page_drain(int cpu) | ||
436 | { | ||
437 | return pagevec_count(&per_cpu(activate_page_pvecs, cpu)) != 0; | ||
438 | } | ||
439 | |||
435 | void activate_page(struct page *page) | 440 | void activate_page(struct page *page) |
436 | { | 441 | { |
437 | if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { | 442 | if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { |
@@ -449,6 +454,11 @@ static inline void activate_page_drain(int cpu) | |||
449 | { | 454 | { |
450 | } | 455 | } |
451 | 456 | ||
457 | static bool need_activate_page_drain(int cpu) | ||
458 | { | ||
459 | return false; | ||
460 | } | ||
461 | |||
452 | void activate_page(struct page *page) | 462 | void activate_page(struct page *page) |
453 | { | 463 | { |
454 | struct zone *zone = page_zone(page); | 464 | struct zone *zone = page_zone(page); |
@@ -701,12 +711,36 @@ static void lru_add_drain_per_cpu(struct work_struct *dummy) | |||
701 | lru_add_drain(); | 711 | lru_add_drain(); |
702 | } | 712 | } |
703 | 713 | ||
704 | /* | 714 | static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); |
705 | * Returns 0 for success | 715 | |
706 | */ | 716 | void lru_add_drain_all(void) |
707 | int lru_add_drain_all(void) | ||
708 | { | 717 | { |
709 | return schedule_on_each_cpu(lru_add_drain_per_cpu); | 718 | static DEFINE_MUTEX(lock); |
719 | static struct cpumask has_work; | ||
720 | int cpu; | ||
721 | |||
722 | mutex_lock(&lock); | ||
723 | get_online_cpus(); | ||
724 | cpumask_clear(&has_work); | ||
725 | |||
726 | for_each_online_cpu(cpu) { | ||
727 | struct work_struct *work = &per_cpu(lru_add_drain_work, cpu); | ||
728 | |||
729 | if (pagevec_count(&per_cpu(lru_add_pvec, cpu)) || | ||
730 | pagevec_count(&per_cpu(lru_rotate_pvecs, cpu)) || | ||
731 | pagevec_count(&per_cpu(lru_deactivate_pvecs, cpu)) || | ||
732 | need_activate_page_drain(cpu)) { | ||
733 | INIT_WORK(work, lru_add_drain_per_cpu); | ||
734 | schedule_work_on(cpu, work); | ||
735 | cpumask_set_cpu(cpu, &has_work); | ||
736 | } | ||
737 | } | ||
738 | |||
739 | for_each_cpu(cpu, &has_work) | ||
740 | flush_work(&per_cpu(lru_add_drain_work, cpu)); | ||
741 | |||
742 | put_online_cpus(); | ||
743 | mutex_unlock(&lock); | ||
710 | } | 744 | } |
711 | 745 | ||
712 | /* | 746 | /* |