CC: kbuild-all(a)lists.01.org In-Reply-To: <20210106010201.37864-17-wqu@suse.com> References: <20210106010201.37864-17-wqu@suse.com> TO: Qu Wenruo TO: linux-btrfs(a)vger.kernel.org Hi Qu, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on kdave/for-next] [also build test WARNING on v5.11-rc2 next-20210104] [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/Qu-Wenruo/btrfs-add-read-only-support-for-subpage-sector-size/20210106-090847 base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next :::::: branch date: 3 hours ago :::::: commit date: 3 hours ago config: m68k-randconfig-s032-20210106 (attached as .config) compiler: m68k-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.3-208-g46a52ca4-dirty # https://github.com/0day-ci/linux/commit/c0f229c17f975112f926038d70649bb2e479bfe3 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Qu-Wenruo/btrfs-add-read-only-support-for-subpage-sector-size/20210106-090847 git checkout c0f229c17f975112f926038d70649bb2e479bfe3 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=m68k If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot "sparse warnings: (new ones prefixed by >>)" fs/btrfs/extent_io.c:5061:25: sparse: sparse: context imbalance in 'btrfs_release_extent_buffer_pages' - different lock contexts for basic block >> fs/btrfs/extent_io.c:6271:9: sparse: sparse: context imbalance in 'try_release_subpage_extent_buffer' - different lock contexts for basic block vim +/try_release_subpage_extent_buffer +6271 fs/btrfs/extent_io.c 6af118ce51b52ce Chris Mason 2008-07-22 6262 c0f229c17f97511 Qu Wenruo 2021-01-06 6263 static int try_release_subpage_extent_buffer(struct page *page) c0f229c17f97511 Qu Wenruo 2021-01-06 6264 { c0f229c17f97511 Qu Wenruo 2021-01-06 6265 struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb); c0f229c17f97511 Qu Wenruo 2021-01-06 6266 u64 page_start = page_offset(page); c0f229c17f97511 Qu Wenruo 2021-01-06 6267 int bitmap_size = BTRFS_SUBPAGE_BITMAP_SIZE; c0f229c17f97511 Qu Wenruo 2021-01-06 6268 int bit_start = 0; c0f229c17f97511 Qu Wenruo 2021-01-06 6269 int ret; c0f229c17f97511 Qu Wenruo 2021-01-06 6270 c0f229c17f97511 Qu Wenruo 2021-01-06 @6271 while (bit_start < bitmap_size) { c0f229c17f97511 Qu Wenruo 2021-01-06 6272 struct btrfs_subpage *subpage; c0f229c17f97511 Qu Wenruo 2021-01-06 6273 struct extent_buffer *eb; c0f229c17f97511 Qu Wenruo 2021-01-06 6274 unsigned long flags; c0f229c17f97511 Qu Wenruo 2021-01-06 6275 u16 tmp = 1 << bit_start; c0f229c17f97511 Qu Wenruo 2021-01-06 6276 u64 start; c0f229c17f97511 Qu Wenruo 2021-01-06 6277 c0f229c17f97511 Qu Wenruo 2021-01-06 6278 /* c0f229c17f97511 Qu Wenruo 2021-01-06 6279 * Make sure the page still has private, as previous iteration c0f229c17f97511 Qu Wenruo 2021-01-06 6280 * can detach page private. c0f229c17f97511 Qu Wenruo 2021-01-06 6281 */ c0f229c17f97511 Qu Wenruo 2021-01-06 6282 spin_lock(&page->mapping->private_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6283 if (!PagePrivate(page)) { c0f229c17f97511 Qu Wenruo 2021-01-06 6284 spin_unlock(&page->mapping->private_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6285 break; c0f229c17f97511 Qu Wenruo 2021-01-06 6286 } c0f229c17f97511 Qu Wenruo 2021-01-06 6287 c0f229c17f97511 Qu Wenruo 2021-01-06 6288 subpage = (struct btrfs_subpage *)page->private; c0f229c17f97511 Qu Wenruo 2021-01-06 6289 c0f229c17f97511 Qu Wenruo 2021-01-06 6290 spin_lock_irqsave(&subpage->lock, flags); c0f229c17f97511 Qu Wenruo 2021-01-06 6291 spin_unlock(&page->mapping->private_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6292 c0f229c17f97511 Qu Wenruo 2021-01-06 6293 if (!(tmp & subpage->tree_block_bitmap)) { c0f229c17f97511 Qu Wenruo 2021-01-06 6294 spin_unlock_irqrestore(&subpage->lock, flags); c0f229c17f97511 Qu Wenruo 2021-01-06 6295 bit_start++; c0f229c17f97511 Qu Wenruo 2021-01-06 6296 continue; c0f229c17f97511 Qu Wenruo 2021-01-06 6297 } c0f229c17f97511 Qu Wenruo 2021-01-06 6298 c0f229c17f97511 Qu Wenruo 2021-01-06 6299 start = bit_start * fs_info->sectorsize + page_start; c0f229c17f97511 Qu Wenruo 2021-01-06 6300 bit_start += fs_info->nodesize >> fs_info->sectorsize_bits; c0f229c17f97511 Qu Wenruo 2021-01-06 6301 /* c0f229c17f97511 Qu Wenruo 2021-01-06 6302 * Here we can't call find_extent_buffer() which will increase c0f229c17f97511 Qu Wenruo 2021-01-06 6303 * eb->refs. c0f229c17f97511 Qu Wenruo 2021-01-06 6304 */ c0f229c17f97511 Qu Wenruo 2021-01-06 6305 rcu_read_lock(); c0f229c17f97511 Qu Wenruo 2021-01-06 6306 eb = radix_tree_lookup(&fs_info->buffer_radix, c0f229c17f97511 Qu Wenruo 2021-01-06 6307 start >> fs_info->sectorsize_bits); c0f229c17f97511 Qu Wenruo 2021-01-06 6308 ASSERT(eb); c0f229c17f97511 Qu Wenruo 2021-01-06 6309 spin_lock(&eb->refs_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6310 if (atomic_read(&eb->refs) != 1 || extent_buffer_under_io(eb) || c0f229c17f97511 Qu Wenruo 2021-01-06 6311 !test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags)) { c0f229c17f97511 Qu Wenruo 2021-01-06 6312 spin_unlock(&eb->refs_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6313 rcu_read_unlock(); c0f229c17f97511 Qu Wenruo 2021-01-06 6314 continue; c0f229c17f97511 Qu Wenruo 2021-01-06 6315 } c0f229c17f97511 Qu Wenruo 2021-01-06 6316 rcu_read_unlock(); c0f229c17f97511 Qu Wenruo 2021-01-06 6317 spin_unlock_irqrestore(&subpage->lock, flags); c0f229c17f97511 Qu Wenruo 2021-01-06 6318 /* c0f229c17f97511 Qu Wenruo 2021-01-06 6319 * Here we don't care the return value, we will always check c0f229c17f97511 Qu Wenruo 2021-01-06 6320 * the page private at the end. c0f229c17f97511 Qu Wenruo 2021-01-06 6321 * And release_extent_buffer() will release the refs_lock. c0f229c17f97511 Qu Wenruo 2021-01-06 6322 */ c0f229c17f97511 Qu Wenruo 2021-01-06 6323 release_extent_buffer(eb); c0f229c17f97511 Qu Wenruo 2021-01-06 6324 } c0f229c17f97511 Qu Wenruo 2021-01-06 6325 /* Finally to check if we have cleared page private */ c0f229c17f97511 Qu Wenruo 2021-01-06 6326 spin_lock(&page->mapping->private_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6327 if (!PagePrivate(page)) c0f229c17f97511 Qu Wenruo 2021-01-06 6328 ret = 1; c0f229c17f97511 Qu Wenruo 2021-01-06 6329 else c0f229c17f97511 Qu Wenruo 2021-01-06 6330 ret = 0; c0f229c17f97511 Qu Wenruo 2021-01-06 6331 spin_unlock(&page->mapping->private_lock); c0f229c17f97511 Qu Wenruo 2021-01-06 6332 return ret; c0f229c17f97511 Qu Wenruo 2021-01-06 6333 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org