Re: [PATCH 3/3] mm/mmu_notifier: contextual information for event triggering invalidation

From: kbuild test robot
Date: Thu Dec 06 2018 - 16:22:00 EST


Hi Jérôme,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v4.20-rc5]
[cannot apply to next-20181206]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/jglisse-redhat-com/mmu-notifier-contextual-informations/20181207-031930
config: x86_64-randconfig-x017-201848 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All errors (new ones prefixed by >>):

fs///proc/task_mmu.c: In function 'clear_refs_write':
fs///proc/task_mmu.c:1099:29: error: storage size of 'range' isn't known
struct mmu_notifier_range range;
^~~~~
>> fs///proc/task_mmu.c:1147:18: error: 'MMU_NOTIFY_SOFT_DIRTY' undeclared (first use in this function); did you mean 'CLEAR_REFS_SOFT_DIRTY'?
range.event = MMU_NOTIFY_SOFT_DIRTY;
^~~~~~~~~~~~~~~~~~~~~
CLEAR_REFS_SOFT_DIRTY
fs///proc/task_mmu.c:1147:18: note: each undeclared identifier is reported only once for each function it appears in
fs///proc/task_mmu.c:1099:29: warning: unused variable 'range' [-Wunused-variable]
struct mmu_notifier_range range;
^~~~~

vim +1147 fs///proc/task_mmu.c

1069
1070 static ssize_t clear_refs_write(struct file *file, const char __user *buf,
1071 size_t count, loff_t *ppos)
1072 {
1073 struct task_struct *task;
1074 char buffer[PROC_NUMBUF];
1075 struct mm_struct *mm;
1076 struct vm_area_struct *vma;
1077 enum clear_refs_types type;
1078 struct mmu_gather tlb;
1079 int itype;
1080 int rv;
1081
1082 memset(buffer, 0, sizeof(buffer));
1083 if (count > sizeof(buffer) - 1)
1084 count = sizeof(buffer) - 1;
1085 if (copy_from_user(buffer, buf, count))
1086 return -EFAULT;
1087 rv = kstrtoint(strstrip(buffer), 10, &itype);
1088 if (rv < 0)
1089 return rv;
1090 type = (enum clear_refs_types)itype;
1091 if (type < CLEAR_REFS_ALL || type >= CLEAR_REFS_LAST)
1092 return -EINVAL;
1093
1094 task = get_proc_task(file_inode(file));
1095 if (!task)
1096 return -ESRCH;
1097 mm = get_task_mm(task);
1098 if (mm) {
> 1099 struct mmu_notifier_range range;
1100 struct clear_refs_private cp = {
1101 .type = type,
1102 };
1103 struct mm_walk clear_refs_walk = {
1104 .pmd_entry = clear_refs_pte_range,
1105 .test_walk = clear_refs_test_walk,
1106 .mm = mm,
1107 .private = &cp,
1108 };
1109
1110 if (type == CLEAR_REFS_MM_HIWATER_RSS) {
1111 if (down_write_killable(&mm->mmap_sem)) {
1112 count = -EINTR;
1113 goto out_mm;
1114 }
1115
1116 /*
1117 * Writing 5 to /proc/pid/clear_refs resets the peak
1118 * resident set size to this mm's current rss value.
1119 */
1120 reset_mm_hiwater_rss(mm);
1121 up_write(&mm->mmap_sem);
1122 goto out_mm;
1123 }
1124
1125 down_read(&mm->mmap_sem);
1126 tlb_gather_mmu(&tlb, mm, 0, -1);
1127 if (type == CLEAR_REFS_SOFT_DIRTY) {
1128 for (vma = mm->mmap; vma; vma = vma->vm_next) {
1129 if (!(vma->vm_flags & VM_SOFTDIRTY))
1130 continue;
1131 up_read(&mm->mmap_sem);
1132 if (down_write_killable(&mm->mmap_sem)) {
1133 count = -EINTR;
1134 goto out_mm;
1135 }
1136 for (vma = mm->mmap; vma; vma = vma->vm_next) {
1137 vma->vm_flags &= ~VM_SOFTDIRTY;
1138 vma_set_page_prot(vma);
1139 }
1140 downgrade_write(&mm->mmap_sem);
1141 break;
1142 }
1143
1144 range.start = 0;
1145 range.end = -1UL;
1146 range.mm = mm;
> 1147 range.event = MMU_NOTIFY_SOFT_DIRTY;
1148 mmu_notifier_invalidate_range_start(&range);
1149 }
1150 walk_page_range(0, mm->highest_vm_end, &clear_refs_walk);
1151 if (type == CLEAR_REFS_SOFT_DIRTY)
1152 mmu_notifier_invalidate_range_end(&range);
1153 tlb_finish_mmu(&tlb, 0, -1);
1154 up_read(&mm->mmap_sem);
1155 out_mm:
1156 mmput(mm);
1157 }
1158 put_task_struct(task);
1159
1160 return count;
1161 }
1162

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

Attachment: .config.gz
Description: application/gzip