[josef-btrfs:blk-iolatency 7/13] mm/memory.c:2497:2: note: in expansion of macro 'if'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



tree:   https://git.kernel.org/pub/scm/linux/kernel/git/josef/btrfs-next.git blk-iolatency
head:   657e770d4d6e3b03c3d4b96e427b30d6f766e2e2
commit: 90f955bbc57765617e3e99f784f3239c3d8f0360 [7/13] memcontrol: schedule throttling if we are congested
config: x86_64-randconfig-x018-201820 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        git checkout 90f955bbc57765617e3e99f784f3239c3d8f0360
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   In file included from include/linux/kernel.h:10:0,
                    from include/linux/list.h:9,
                    from include/linux/smp.h:12,
                    from include/linux/kernel_stat.h:5,
                    from mm/memory.c:41:
   mm/memory.c: In function 'wp_page_copy':
   mm/memory.c:2497:6: error: implicit declaration of function 'mem_cgroup_try_charge_delay'; did you mean 'mem_cgroup_try_charge_swap'? [-Werror=implicit-function-declaration]
     if (mem_cgroup_try_charge_delay(new_page, mm, GFP_KERNEL, &memcg, false))
         ^
   include/linux/compiler.h:58:30: note: in definition of macro '__trace_if'
     if (__builtin_constant_p(!!(cond)) ? !!(cond) :   \
                                 ^~~~
>> mm/memory.c:2497:2: note: in expansion of macro 'if'
     if (mem_cgroup_try_charge_delay(new_page, mm, GFP_KERNEL, &memcg, false))
     ^~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 include/linux/kasan-checks.h:kasan_check_read
   Cyclomatic Complexity 1 include/linux/kasan-checks.h:kasan_check_write
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:__set_bit
   Cyclomatic Complexity 3 arch/x86/include/asm/bitops.h:clear_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_set_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_set_bit_lock
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls64
   Cyclomatic Complexity 1 include/linux/bitops.h:fls_long
   Cyclomatic Complexity 1 include/linux/log2.h:__rounddown_pow_of_two
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 2 arch/x86/include/asm/jump_label.h:arch_static_branch
   Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_false
   Cyclomatic Complexity 2 include/linux/string.h:kbasename
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_dec
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_dec_and_test
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic64_64.h:arch_atomic64_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic64_64.h:arch_atomic64_add
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic64_64.h:arch_atomic64_sub
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic64_64.h:arch_atomic64_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic64_64.h:arch_atomic64_dec
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_read
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic64_read
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_inc
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic64_inc
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_dec
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic64_dec
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic64_add
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic64_sub
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_dec_and_test
   Cyclomatic Complexity 1 include/asm-generic/atomic-long.h:atomic_long_read
   Cyclomatic Complexity 1 include/asm-generic/atomic-long.h:atomic_long_inc
   Cyclomatic Complexity 1 include/asm-generic/atomic-long.h:atomic_long_dec
   Cyclomatic Complexity 1 include/asm-generic/atomic-long.h:atomic_long_add
   Cyclomatic Complexity 1 include/asm-generic/atomic-long.h:atomic_long_sub
   Cyclomatic Complexity 1 include/linux/smp.h:up_smp_call_function
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 2 arch/x86/include/asm/page_64.h:__phys_addr_nodebug
   Cyclomatic Complexity 1 arch/x86/include/asm/page_64.h:clear_page
   Cyclomatic Complexity 1 arch/x86/include/asm/page.h:copy_user_page
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_pgd_val
   Cyclomatic Complexity 1 include/asm-generic/pgtable-nop4d.h:pgd_none
   Cyclomatic Complexity 1 include/asm-generic/pgtable-nop4d.h:pgd_bad
   Cyclomatic Complexity 1 include/asm-generic/pgtable-nop4d.h:pgd_clear
   Cyclomatic Complexity 1 include/asm-generic/pgtable-nop4d.h:p4d_offset
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_p4d_val
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_pud_val
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_pmd_val
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:p4d_pfn_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:p4d_flags_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:p4d_flags
   Cyclomatic Complexity 2 arch/x86/include/asm/pgtable_types.h:pud_pfn_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:pud_flags_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:pud_flags
   Cyclomatic Complexity 2 arch/x86/include/asm/pgtable_types.h:pmd_pfn_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:pmd_flags_mask
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:pmd_flags
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_make_pte
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:native_pte_val
   Cyclomatic Complexity 1 arch/x86/include/asm/pgtable_types.h:pte_flags
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:paravirt_alloc_pte
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:paravirt_alloc_pmd
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:paravirt_alloc_pud
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:__pte
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pte_val
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:__pgd
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pgd_val
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:ptep_modify_prot_start
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:ptep_modify_prot_commit
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:set_pte_at
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:set_pmd
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:__pmd
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pmd_val
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:set_pud
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:__pud
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pud_val
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pud_clear
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:set_p4d
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:p4d_clear
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pte_clear
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:pmd_clear
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_enter_lazy_mmu_mode
   Cyclomatic Complexity 1 arch/x86/include/asm/paravirt.h:arch_leave_lazy_mmu_mode
   Cyclomatic Complexity 1 arch/x86/include/asm/special_insns.h:__read_pkru
   Cyclomatic Complexity 1 include/linux/err.h:IS_ERR
   Cyclomatic Complexity 2 include/linux/thread_info.h:test_ti_thread_flag
   Cyclomatic Complexity 1 include/linux/thread_info.h:check_object_size
   Cyclomatic Complexity 1 arch/x86/include/asm/preempt.h:should_resched
   Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock

vim +/if +2497 mm/memory.c

  2452	
  2453	/*
  2454	 * Handle the case of a page which we actually need to copy to a new page.
  2455	 *
  2456	 * Called with mmap_sem locked and the old page referenced, but
  2457	 * without the ptl held.
  2458	 *
  2459	 * High level logic flow:
  2460	 *
  2461	 * - Allocate a page, copy the content of the old page to the new one.
  2462	 * - Handle book keeping and accounting - cgroups, mmu-notifiers, etc.
  2463	 * - Take the PTL. If the pte changed, bail out and release the allocated page
  2464	 * - If the pte is still the way we remember it, update the page table and all
  2465	 *   relevant references. This includes dropping the reference the page-table
  2466	 *   held to the old page, as well as updating the rmap.
  2467	 * - In any case, unlock the PTL and drop the reference we took to the old page.
  2468	 */
  2469	static int wp_page_copy(struct vm_fault *vmf)
  2470	{
  2471		struct vm_area_struct *vma = vmf->vma;
  2472		struct mm_struct *mm = vma->vm_mm;
  2473		struct page *old_page = vmf->page;
  2474		struct page *new_page = NULL;
  2475		pte_t entry;
  2476		int page_copied = 0;
  2477		const unsigned long mmun_start = vmf->address & PAGE_MASK;
  2478		const unsigned long mmun_end = mmun_start + PAGE_SIZE;
  2479		struct mem_cgroup *memcg;
  2480	
  2481		if (unlikely(anon_vma_prepare(vma)))
  2482			goto oom;
  2483	
  2484		if (is_zero_pfn(pte_pfn(vmf->orig_pte))) {
  2485			new_page = alloc_zeroed_user_highpage_movable(vma,
  2486								      vmf->address);
  2487			if (!new_page)
  2488				goto oom;
  2489		} else {
  2490			new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma,
  2491					vmf->address);
  2492			if (!new_page)
  2493				goto oom;
  2494			cow_user_page(new_page, old_page, vmf->address, vma);
  2495		}
  2496	
> 2497		if (mem_cgroup_try_charge_delay(new_page, mm, GFP_KERNEL, &memcg, false))
  2498			goto oom_free_new;
  2499	
  2500		__SetPageUptodate(new_page);
  2501	
  2502		mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end);
  2503	
  2504		/*
  2505		 * Re-check the pte - we dropped the lock
  2506		 */
  2507		vmf->pte = pte_offset_map_lock(mm, vmf->pmd, vmf->address, &vmf->ptl);
  2508		if (likely(pte_same(*vmf->pte, vmf->orig_pte))) {
  2509			if (old_page) {
  2510				if (!PageAnon(old_page)) {
  2511					dec_mm_counter_fast(mm,
  2512							mm_counter_file(old_page));
  2513					inc_mm_counter_fast(mm, MM_ANONPAGES);
  2514				}
  2515			} else {
  2516				inc_mm_counter_fast(mm, MM_ANONPAGES);
  2517			}
  2518			flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte));
  2519			entry = mk_pte(new_page, vma->vm_page_prot);
  2520			entry = maybe_mkwrite(pte_mkdirty(entry), vma);
  2521			/*
  2522			 * Clear the pte entry and flush it first, before updating the
  2523			 * pte with the new entry. This will avoid a race condition
  2524			 * seen in the presence of one thread doing SMC and another
  2525			 * thread doing COW.
  2526			 */
  2527			ptep_clear_flush_notify(vma, vmf->address, vmf->pte);
  2528			page_add_new_anon_rmap(new_page, vma, vmf->address, false);
  2529			mem_cgroup_commit_charge(new_page, memcg, false, false);
  2530			lru_cache_add_active_or_unevictable(new_page, vma);
  2531			/*
  2532			 * We call the notify macro here because, when using secondary
  2533			 * mmu page tables (such as kvm shadow page tables), we want the
  2534			 * new page to be mapped directly into the secondary page table.
  2535			 */
  2536			set_pte_at_notify(mm, vmf->address, vmf->pte, entry);
  2537			update_mmu_cache(vma, vmf->address, vmf->pte);
  2538			if (old_page) {
  2539				/*
  2540				 * Only after switching the pte to the new page may
  2541				 * we remove the mapcount here. Otherwise another
  2542				 * process may come and find the rmap count decremented
  2543				 * before the pte is switched to the new page, and
  2544				 * "reuse" the old page writing into it while our pte
  2545				 * here still points into it and can be read by other
  2546				 * threads.
  2547				 *
  2548				 * The critical issue is to order this
  2549				 * page_remove_rmap with the ptp_clear_flush above.
  2550				 * Those stores are ordered by (if nothing else,)
  2551				 * the barrier present in the atomic_add_negative
  2552				 * in page_remove_rmap.
  2553				 *
  2554				 * Then the TLB flush in ptep_clear_flush ensures that
  2555				 * no process can access the old page before the
  2556				 * decremented mapcount is visible. And the old page
  2557				 * cannot be reused until after the decremented
  2558				 * mapcount is visible. So transitively, TLBs to
  2559				 * old page will be flushed before it can be reused.
  2560				 */
  2561				page_remove_rmap(old_page, false);
  2562			}
  2563	
  2564			/* Free the old page.. */
  2565			new_page = old_page;
  2566			page_copied = 1;
  2567		} else {
  2568			mem_cgroup_cancel_charge(new_page, memcg, false);
  2569		}
  2570	
  2571		if (new_page)
  2572			put_page(new_page);
  2573	
  2574		pte_unmap_unlock(vmf->pte, vmf->ptl);
  2575		/*
  2576		 * No need to double call mmu_notifier->invalidate_range() callback as
  2577		 * the above ptep_clear_flush_notify() did already call it.
  2578		 */
  2579		mmu_notifier_invalidate_range_only_end(mm, mmun_start, mmun_end);
  2580		if (old_page) {
  2581			/*
  2582			 * Don't let another task, with possibly unlocked vma,
  2583			 * keep the mlocked page.
  2584			 */
  2585			if (page_copied && (vma->vm_flags & VM_LOCKED)) {
  2586				lock_page(old_page);	/* LRU manipulation */
  2587				if (PageMlocked(old_page))
  2588					munlock_vma_page(old_page);
  2589				unlock_page(old_page);
  2590			}
  2591			put_page(old_page);
  2592		}
  2593		return page_copied ? VM_FAULT_WRITE : 0;
  2594	oom_free_new:
  2595		put_page(new_page);
  2596	oom:
  2597		if (old_page)
  2598			put_page(old_page);
  2599		return VM_FAULT_OOM;
  2600	}
  2601	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux