Re: [PATCH 07/12] shmem: check if a block is uptodate before splice into pipe

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

 



Hi Daniel,

kernel test robot noticed the following build errors:

[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on xfs-linux/for-next brauner-vfs/vfs.all linus/master v6.9 next-20240516]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Daniel-Gomez/splice-don-t-check-for-uptodate-if-partially-uptodate-is-impl/20240515-135925
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/20240515055719.32577-8-da.gomez%40samsung.com
patch subject: [PATCH 07/12] shmem: check if a block is uptodate before splice into pipe
config: arm-s5pv210_defconfig (https://download.01.org/0day-ci/archive/20240516/202405162045.kaXgB2n3-lkp@xxxxxxxxx/config)
compiler: arm-linux-gnueabi-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240516/202405162045.kaXgB2n3-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202405162045.kaXgB2n3-lkp@xxxxxxxxx/

All errors (new ones prefixed by >>):

   arm-linux-gnueabi-ld: mm/shmem.o: in function `shmem_file_splice_read':
>> mm/shmem.c:3240:(.text+0x5224): undefined reference to `__aeabi_ldivmod'


vim +3240 mm/shmem.c

  3174	
  3175	static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,
  3176					      struct pipe_inode_info *pipe,
  3177					      size_t len, unsigned int flags)
  3178	{
  3179		struct inode *inode = file_inode(in);
  3180		struct address_space *mapping = inode->i_mapping;
  3181		struct folio *folio = NULL;
  3182		size_t total_spliced = 0, used, npages, n, part;
  3183		loff_t isize;
  3184		int error = 0;
  3185	
  3186		/* Work out how much data we can actually add into the pipe */
  3187		used = pipe_occupancy(pipe->head, pipe->tail);
  3188		npages = max_t(ssize_t, pipe->max_usage - used, 0);
  3189		len = min_t(size_t, len, npages * PAGE_SIZE);
  3190	
  3191		do {
  3192			if (*ppos >= i_size_read(inode))
  3193				break;
  3194	
  3195			error = shmem_get_folio(inode, *ppos / PAGE_SIZE, &folio,
  3196						SGP_READ);
  3197			if (error) {
  3198				if (error == -EINVAL)
  3199					error = 0;
  3200				break;
  3201			}
  3202			if (folio) {
  3203				folio_unlock(folio);
  3204	
  3205				if (folio_test_hwpoison(folio) ||
  3206				    (folio_test_large(folio) &&
  3207				     folio_test_has_hwpoisoned(folio))) {
  3208					error = -EIO;
  3209					break;
  3210				}
  3211			}
  3212	
  3213			/*
  3214			 * i_size must be checked after we know the pages are Uptodate.
  3215			 *
  3216			 * Checking i_size after the check allows us to calculate
  3217			 * the correct value for "nr", which means the zero-filled
  3218			 * part of the page is not copied back to userspace (unless
  3219			 * another truncate extends the file - this is desired though).
  3220			 */
  3221			isize = i_size_read(inode);
  3222			if (unlikely(*ppos >= isize))
  3223				break;
  3224			part = min_t(loff_t, isize - *ppos, len);
  3225			if (folio && folio_test_large(folio) &&
  3226			    folio_test_private(folio)) {
  3227				unsigned long from = offset_in_folio(folio, *ppos);
  3228				unsigned int bfirst = from >> inode->i_blkbits;
  3229				unsigned int blast, blast_upd;
  3230	
  3231				len = min(folio_size(folio) - from, len);
  3232				blast = (from + len - 1) >> inode->i_blkbits;
  3233	
  3234				blast_upd = sfs_get_last_block_uptodate(folio, bfirst,
  3235									blast);
  3236				if (blast_upd <= blast) {
  3237					unsigned int bsize = 1 << inode->i_blkbits;
  3238					unsigned int blks = blast_upd - bfirst + 1;
  3239					unsigned int bbytes = blks << inode->i_blkbits;
> 3240					unsigned int boff = (*ppos % bsize);
  3241	
  3242					part = min_t(loff_t, bbytes - boff, len);
  3243				}
  3244			}
  3245	
  3246			if (folio && shmem_is_block_uptodate(
  3247					     folio, offset_in_folio(folio, *ppos) >>
  3248							    inode->i_blkbits)) {
  3249				/*
  3250				 * If users can be writing to this page using arbitrary
  3251				 * virtual addresses, take care about potential aliasing
  3252				 * before reading the page on the kernel side.
  3253				 */
  3254				if (mapping_writably_mapped(mapping))
  3255					flush_dcache_folio(folio);
  3256				folio_mark_accessed(folio);
  3257				/*
  3258				 * Ok, we have the page, and it's up-to-date, so we can
  3259				 * now splice it into the pipe.
  3260				 */
  3261				n = splice_folio_into_pipe(pipe, folio, *ppos, part);
  3262				folio_put(folio);
  3263				folio = NULL;
  3264			} else {
  3265				n = splice_zeropage_into_pipe(pipe, *ppos, part);
  3266			}
  3267	
  3268			if (!n)
  3269				break;
  3270			len -= n;
  3271			total_spliced += n;
  3272			*ppos += n;
  3273			in->f_ra.prev_pos = *ppos;
  3274			if (pipe_full(pipe->head, pipe->tail, pipe->max_usage))
  3275				break;
  3276	
  3277			cond_resched();
  3278		} while (len);
  3279	
  3280		if (folio)
  3281			folio_put(folio);
  3282	
  3283		file_accessed(in);
  3284		return total_spliced ? total_spliced : error;
  3285	}
  3286	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux