.. | .. |
---|
668 | 668 | { |
---|
669 | 669 | int nid; |
---|
670 | 670 | |
---|
| 671 | + assert_spin_locked(&p->lock); |
---|
671 | 672 | for_each_node(nid) |
---|
672 | 673 | plist_del(&p->avail_lists[nid], &swap_avail_heads[nid]); |
---|
673 | 674 | } |
---|
674 | 675 | |
---|
675 | 676 | static void del_from_avail_list(struct swap_info_struct *p) |
---|
676 | 677 | { |
---|
| 678 | + bool skip = false; |
---|
| 679 | + |
---|
| 680 | + trace_android_vh_del_from_avail_list(p, &skip); |
---|
| 681 | + if (skip) |
---|
| 682 | + return; |
---|
| 683 | + |
---|
677 | 684 | spin_lock(&swap_avail_lock); |
---|
678 | 685 | __del_from_avail_list(p); |
---|
679 | 686 | spin_unlock(&swap_avail_lock); |
---|
.. | .. |
---|
699 | 706 | static void add_to_avail_list(struct swap_info_struct *p) |
---|
700 | 707 | { |
---|
701 | 708 | int nid; |
---|
| 709 | + bool skip = false; |
---|
| 710 | + |
---|
| 711 | + trace_android_vh_add_to_avail_list(p, &skip); |
---|
| 712 | + if (skip) |
---|
| 713 | + return; |
---|
702 | 714 | |
---|
703 | 715 | spin_lock(&swap_avail_lock); |
---|
704 | 716 | for_each_node(nid) { |
---|
.. | .. |
---|
1111 | 1123 | goto check_out; |
---|
1112 | 1124 | pr_debug("scan_swap_map of si %d failed to find offset\n", |
---|
1113 | 1125 | si->type); |
---|
| 1126 | + cond_resched(); |
---|
1114 | 1127 | |
---|
1115 | 1128 | spin_lock(&swap_avail_lock); |
---|
1116 | 1129 | nextsi: |
---|
.. | .. |
---|
2629 | 2642 | spin_unlock(&swap_lock); |
---|
2630 | 2643 | goto out_dput; |
---|
2631 | 2644 | } |
---|
2632 | | - del_from_avail_list(p); |
---|
2633 | 2645 | spin_lock(&p->lock); |
---|
| 2646 | + del_from_avail_list(p); |
---|
2634 | 2647 | if (p->prio < 0) { |
---|
2635 | 2648 | struct swap_info_struct *si = p; |
---|
2636 | 2649 | int nid; |
---|
.. | .. |
---|
3392 | 3405 | if (swap_flags & SWAP_FLAG_PREFER) |
---|
3393 | 3406 | prio = |
---|
3394 | 3407 | (swap_flags & SWAP_FLAG_PRIO_MASK) >> SWAP_FLAG_PRIO_SHIFT; |
---|
| 3408 | + |
---|
| 3409 | + trace_android_vh_swap_avail_heads_init(swap_avail_heads); |
---|
3395 | 3410 | enable_swap_info(p, prio, swap_map, cluster_info, frontswap_map); |
---|
3396 | 3411 | |
---|
3397 | 3412 | trace_android_vh_init_swap_info_struct(p, swap_avail_heads); |
---|
.. | .. |
---|
3846 | 3861 | { |
---|
3847 | 3862 | struct swap_info_struct *si, *next; |
---|
3848 | 3863 | int nid = page_to_nid(page); |
---|
| 3864 | + bool skip = false; |
---|
3849 | 3865 | |
---|
3850 | 3866 | if (!(gfp_mask & __GFP_IO)) |
---|
3851 | 3867 | return; |
---|
.. | .. |
---|
3860 | 3876 | if (current->throttle_queue) |
---|
3861 | 3877 | return; |
---|
3862 | 3878 | |
---|
| 3879 | + trace_android_vh___cgroup_throttle_swaprate(nid, &skip); |
---|
| 3880 | + if (skip) |
---|
| 3881 | + return; |
---|
| 3882 | + |
---|
3863 | 3883 | spin_lock(&swap_avail_lock); |
---|
3864 | 3884 | plist_for_each_entry_safe(si, next, &swap_avail_heads[nid], |
---|
3865 | 3885 | avail_lists[nid]) { |
---|