CC: kbuild-all(a)lists.01.org In-Reply-To: <20210426184201.4177978-6-krisman@collabora.com> References: <20210426184201.4177978-6-krisman@collabora.com> TO: Gabriel Krisman Bertazi Hi Gabriel, [FYI, it's a private test report for your RFC patch.] [auto build test WARNING on pcmoore-audit/next] [also build test WARNING on ext4/dev linus/master v5.12] [cannot apply to ext3/fsnotify next-20210426] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Gabriel-Krisman-Bertazi/File-system-wide-monitoring/20210427-024627 base: https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git next :::::: branch date: 3 hours ago :::::: commit date: 3 hours ago config: arc-randconfig-m031-20210426 (attached as .config) compiler: arceb-elf-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot Reported-by: Dan Carpenter New smatch warnings: fs/notify/ring.c:24 fsnotify_ring_peek_first_event() warn: should 'group->ring_buffer.nr_pages << 13' be a 64 bit type? fs/notify/ring.c:57 fsnotify_ring_buffer_consume_event() warn: should 'group->ring_buffer.nr_pages << 13' be a 64 bit type? fs/notify/ring.c:74 fsnotify_ring_alloc_event_slot() warn: should 'group->ring_buffer.nr_pages << 13' be a 64 bit type? fs/notify/ring.c:139 fsnotify_ring_commit_slot() warn: should 'group->ring_buffer.nr_pages << 13' be a 64 bit type? Old smatch warnings: arch/arc/include/asm/thread_info.h:65 current_thread_info() error: uninitialized symbol 'sp'. vim +24 fs/notify/ring.c 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 21 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 22 struct fsnotify_event *fsnotify_ring_peek_first_event(struct fsnotify_group *group) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 23 { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 @24 u64 ring_size = group->ring_buffer.nr_pages << PAGE_SHIFT; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 25 struct fsnotify_event *fsn; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 26 char *kaddr; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 27 u64 tail; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 28 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 29 assert_spin_locked(&group->notification_lock); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 30 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 31 again: 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 32 tail = group->ring_buffer.tail; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 33 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 34 if ((PAGE_SIZE - (tail & (PAGE_SIZE-1))) < sizeof(struct fsnotify_event)) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 35 group->ring_buffer.tail = NEXT_PAGE(tail, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 36 goto again; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 37 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 38 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 39 kaddr = kmap_atomic(group->ring_buffer.pages[tail / PAGE_SIZE]); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 40 if (!kaddr) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 41 return NULL; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 42 fsn = (struct fsnotify_event *) (kaddr + (tail & (PAGE_SIZE-1))); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 43 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 44 if (fsn->slot_len == INVALID_RING_SLOT) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 45 group->ring_buffer.tail = NEXT_PAGE(tail, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 46 kunmap_atomic(kaddr); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 47 goto again; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 48 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 49 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 50 /* will be unmapped when entry is consumed. */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 51 return fsn; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 52 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 53 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 54 void fsnotify_ring_buffer_consume_event(struct fsnotify_group *group, 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 55 struct fsnotify_event *event) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 56 { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 @57 u64 ring_size = group->ring_buffer.nr_pages << PAGE_SHIFT; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 58 u64 new_tail = NEXT_SLOT(group->ring_buffer.tail, event->slot_len, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 59 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 60 kunmap_atomic(event); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 61 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 62 pr_debug("%s: group=%p tail=%llx->%llx ring_size=%llu\n", __func__, 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 63 group, group->ring_buffer.tail, new_tail, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 64 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 65 WRITE_ONCE(group->ring_buffer.tail, new_tail); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 66 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 67 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 68 struct fsnotify_event *fsnotify_ring_alloc_event_slot(struct fsnotify_group *group, 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 69 size_t size) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 70 __acquires(&group->notification_lock) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 71 { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 72 struct fsnotify_event *fsn; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 73 u64 head, tail; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 @74 u64 ring_size = group->ring_buffer.nr_pages << PAGE_SHIFT; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 75 u64 new_head; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 76 void *kaddr; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 77 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 78 if (WARN_ON(!(group->flags & FSN_SUBMISSION_RING_BUFFER) || size > PAGE_SIZE)) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 79 return ERR_PTR(-EINVAL); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 80 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 81 pr_debug("%s: start group=%p ring_size=%llu, requested=%lu\n", __func__, group, 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 82 ring_size, size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 83 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 84 spin_lock(&group->notification_lock); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 85 again: 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 86 head = group->ring_buffer.head; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 87 tail = group->ring_buffer.tail; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 88 new_head = NEXT_SLOT(head, size, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 89 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 90 /* head would catch up to tail, corrupting an entry. */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 91 if ((head < tail && new_head > tail) || (head > new_head && new_head > tail)) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 92 fsn = ERR_PTR(-ENOMEM); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 93 goto err; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 94 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 95 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 96 /* 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 97 * Not event a skip message fits in the page. We can detect the 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 98 * lack of space. Move on to the next page. 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 99 */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 100 if ((PAGE_SIZE - (head & (PAGE_SIZE-1))) < sizeof(struct fsnotify_event)) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 101 /* Start again on next page */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 102 group->ring_buffer.head = NEXT_PAGE(head, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 103 goto again; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 104 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 105 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 106 kaddr = kmap_atomic(group->ring_buffer.pages[head / PAGE_SIZE]); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 107 if (!kaddr) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 108 fsn = ERR_PTR(-EFAULT); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 109 goto err; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 110 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 111 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 112 fsn = (struct fsnotify_event *) (kaddr + (head & (PAGE_SIZE-1))); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 113 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 114 if ((head >> PAGE_SHIFT) != (new_head >> PAGE_SHIFT)) { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 115 /* 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 116 * No room in the current page. Add a fake entry 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 117 * consuming the end the page to avoid splitting event 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 118 * structure. 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 119 */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 120 fsn->slot_len = INVALID_RING_SLOT; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 121 kunmap_atomic(kaddr); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 122 /* Start again on the next page */ 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 123 group->ring_buffer.head = NEXT_PAGE(head, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 124 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 125 goto again; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 126 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 127 fsn->slot_len = size; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 128 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 129 return fsn; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 130 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 131 err: 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 132 spin_unlock(&group->notification_lock); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 133 return fsn; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 134 } 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 135 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 136 void fsnotify_ring_commit_slot(struct fsnotify_group *group, struct fsnotify_event *fsn) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 137 __releases(&group->notification_lock) 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 138 { 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 @139 u64 ring_size = group->ring_buffer.nr_pages << PAGE_SHIFT; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 140 u64 head = group->ring_buffer.head; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 141 u64 new_head = NEXT_SLOT(head, fsn->slot_len, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 142 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 143 pr_debug("%s: group=%p head=%llx->%llx ring_size=%llu\n", __func__, 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 144 group, head, new_head, ring_size); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 145 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 146 kunmap_atomic(fsn); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 147 group->ring_buffer.head = new_head; 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 148 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 149 spin_unlock(&group->notification_lock); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 150 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 151 wake_up(&group->notification_waitq); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 152 kill_fasync(&group->fsn_fa, SIGIO, POLL_IN); 0b550d36bb2ec4 Gabriel Krisman Bertazi 2021-04-26 153 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org