tree: git://git.cmpxchg.org/linux-mmotm.git master head: 51e69b1d3de18116a5dceb6b144444dfdf136dc7 commit: 77ecf9bc0e3d673d4d561cedc1d01c7a84ef90b7 [171/351] mm, vmacache: hash addresses based on pmd config: arm-allnoconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 77ecf9bc0e3d673d4d561cedc1d01c7a84ef90b7 # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=arm All error/warnings (new ones prefixed by >>): mm/vmacache.c: In function 'vmacache_update': >> mm/vmacache.c:14:39: error: 'PMD_SHIFT' undeclared (first use in this function); did you mean 'PUD_SHIFT'? #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) ^ >> mm/vmacache.c:71:26: note: in expansion of macro 'VMACACHE_HASH' current->vmacache.vmas[VMACACHE_HASH(addr)] = newvma; ^~~~~~~~~~~~~ mm/vmacache.c:14:39: note: each undeclared identifier is reported only once for each function it appears in #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) ^ >> mm/vmacache.c:71:26: note: in expansion of macro 'VMACACHE_HASH' current->vmacache.vmas[VMACACHE_HASH(addr)] = newvma; ^~~~~~~~~~~~~ mm/vmacache.c: In function 'vmacache_find': >> mm/vmacache.c:14:39: error: 'PMD_SHIFT' undeclared (first use in this function); did you mean 'PUD_SHIFT'? #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) ^ mm/vmacache.c:96:12: note: in expansion of macro 'VMACACHE_HASH' int idx = VMACACHE_HASH(addr); ^~~~~~~~~~~~~ mm/vmacache.c: In function 'vmacache_find_exact': >> mm/vmacache.c:127:26: error: 'addr' undeclared (first use in this function) int idx = VMACACHE_HASH(addr); ^ mm/vmacache.c:14:31: note: in definition of macro 'VMACACHE_HASH' #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) ^~~~ >> mm/vmacache.c:14:39: error: 'PMD_SHIFT' undeclared (first use in this function); did you mean 'PUD_SHIFT'? #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) ^ mm/vmacache.c:127:12: note: in expansion of macro 'VMACACHE_HASH' int idx = VMACACHE_HASH(addr); ^~~~~~~~~~~~~ vim +14 mm/vmacache.c 9 10 /* 11 * Hash based on the pmd of addr. Provides a good hit rate for workloads with 12 * spatial locality. 13 */ > 14 #define VMACACHE_HASH(addr) ((addr >> PMD_SHIFT) & VMACACHE_MASK) 15 16 /* 17 * Flush vma caches for threads that share a given mm. 18 * 19 * The operation is safe because the caller holds the mmap_sem 20 * exclusively and other threads accessing the vma cache will 21 * have mmap_sem held at least for read, so no extra locking 22 * is required to maintain the vma cache. 23 */ 24 void vmacache_flush_all(struct mm_struct *mm) 25 { 26 struct task_struct *g, *p; 27 28 count_vm_vmacache_event(VMACACHE_FULL_FLUSHES); 29 30 /* 31 * Single threaded tasks need not iterate the entire 32 * list of process. We can avoid the flushing as well 33 * since the mm's seqnum was increased and don't have 34 * to worry about other threads' seqnum. Current's 35 * flush will occur upon the next lookup. 36 */ 37 if (atomic_read(&mm->mm_users) == 1) 38 return; 39 40 rcu_read_lock(); 41 for_each_process_thread(g, p) { 42 /* 43 * Only flush the vmacache pointers as the 44 * mm seqnum is already set and curr's will 45 * be set upon invalidation when the next 46 * lookup is done. 47 */ 48 if (mm == p->mm) 49 vmacache_flush(p); 50 } 51 rcu_read_unlock(); 52 } 53 54 /* 55 * This task may be accessing a foreign mm via (for example) 56 * get_user_pages()->find_vma(). The vmacache is task-local and this 57 * task's vmacache pertains to a different mm (ie, its own). There is 58 * nothing we can do here. 59 * 60 * Also handle the case where a kernel thread has adopted this mm via use_mm(). 61 * That kernel thread's vmacache is not applicable to this mm. 62 */ 63 static inline bool vmacache_valid_mm(struct mm_struct *mm) 64 { 65 return current->mm == mm && !(current->flags & PF_KTHREAD); 66 } 67 68 void vmacache_update(unsigned long addr, struct vm_area_struct *newvma) 69 { 70 if (vmacache_valid_mm(newvma->vm_mm)) > 71 current->vmacache.vmas[VMACACHE_HASH(addr)] = newvma; 72 } 73 74 static bool vmacache_valid(struct mm_struct *mm) 75 { 76 struct task_struct *curr; 77 78 if (!vmacache_valid_mm(mm)) 79 return false; 80 81 curr = current; 82 if (mm->vmacache_seqnum != curr->vmacache.seqnum) { 83 /* 84 * First attempt will always be invalid, initialize 85 * the new cache for this task here. 86 */ 87 curr->vmacache.seqnum = mm->vmacache_seqnum; 88 vmacache_flush(curr); 89 return false; 90 } 91 return true; 92 } 93 94 struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr) 95 { 96 int idx = VMACACHE_HASH(addr); 97 int i; 98 99 count_vm_vmacache_event(VMACACHE_FIND_CALLS); 100 101 if (!vmacache_valid(mm)) 102 return NULL; 103 104 for (i = 0; i < VMACACHE_SIZE; i++) { 105 struct vm_area_struct *vma = current->vmacache.vmas[idx]; 106 107 if (vma) { 108 if (WARN_ON_ONCE(vma->vm_mm != mm)) 109 break; 110 if (vma->vm_start <= addr && vma->vm_end > addr) { 111 count_vm_vmacache_event(VMACACHE_FIND_HITS); 112 return vma; 113 } 114 } 115 if (++idx == VMACACHE_SIZE) 116 idx = 0; 117 } 118 119 return NULL; 120 } 121 122 #ifndef CONFIG_MMU 123 struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm, 124 unsigned long start, 125 unsigned long end) 126 { > 127 int idx = VMACACHE_HASH(addr); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip