[bug report] libceph: add new iov_iter-based ceph_msg_data_type and ceph_osd_data_type

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

 



Hello Jeff Layton,

To be honest, I'm not sure why I am only seeing this now.  These
warnings are hard to analyse because they involve such a long call tree.
Anyway, hopefully it's not too complicated for you since you know the
code.

The patch dee0c5f83460: "libceph: add new iov_iter-based
ceph_msg_data_type and ceph_osd_data_type" from Jul 1, 2022
(linux-next), leads to the following Smatch static checker warning:

	lib/iov_iter.c:905 want_pages_array()
	warn: sleeping in atomic context

lib/iov_iter.c
    896 static int want_pages_array(struct page ***res, size_t size,
    897                             size_t start, unsigned int maxpages)
    898 {
    899         unsigned int count = DIV_ROUND_UP(size + start, PAGE_SIZE);
    900 
    901         if (count > maxpages)
    902                 count = maxpages;
    903         WARN_ON(!count);        // caller should've prevented that
    904         if (!*res) {
--> 905                 *res = kvmalloc_array(count, sizeof(struct page *), GFP_KERNEL);
    906                 if (!*res)
    907                         return 0;
    908         }
    909         return count;
    910 }


prep_next_sparse_read() <- disables preempt
-> advance_cursor()
   -> ceph_msg_data_next()
      -> ceph_msg_data_iter_next()
         -> iov_iter_get_pages2()
            -> __iov_iter_get_pages_alloc()
               -> want_pages_array()

The prep_next_sparse_read() functions hold the spin_lock(&o->o_requests_lock);
lock so it can't sleep.  But iov_iter_get_pages2() seems like a sleeping
operation.

regards,
dan carpenter



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux