From: Dan Carpenter <dan.carpenter@oracle.com>
To: jhubbard@nvidia.com, Leon Romanovsky <leonro@mellanox.com>
Cc: linux-rdma@vger.kernel.org, Jason Gunthorpe <jgg@ziepe.ca>
Subject: [bug report] RDMA: Convert put_page() to put_user_page*()
Date: Thu, 24 Feb 2022 12:37:58 +0300 [thread overview]
Message-ID: <20220224093758.GA30603@kili> (raw)
Hi John,
I'm not really sure who to send this bug report to so you got picked
a bit at random...
The patch ea996974589e: "RDMA: Convert put_page() to
put_user_page*()" from May 24, 2019, leads to the following Smatch
static checker warning:
./include/linux/pagemap.h:897 folio_lock()
warn: sleeping in atomic context
./include/linux/pagemap.h
895 static inline void folio_lock(struct folio *folio)
896 {
--> 897 might_sleep();
898 if (!folio_trylock(folio))
899 __folio_lock(folio);
900 }
The problem is that unpin_user_pages_dirty_lock() calls folio_lock()
which can sleep.
Here is the raw Smatch preempt output. As you can see there are
several places which seem to call unpin_user_pages_dirty_lock() with
preempt disabled.
__usnic_uiom_reg_release() <- disables preempt
usnic_uiom_reg_get() <- disables preempt
-> usnic_uiom_put_pages()
rds_tcp_write_space() <- disables preempt
-> rds_send_path_drop_acked()
-> rds_send_remove_from_sock()
-> rds_message_put()
-> rds_message_purge()
-> rds_rdma_free_op()
rds_message_purge() <duplicate>
-> rds_atomic_free_op()
-> unpin_user_pages_dirty_lock()
-> folio_lock()
Let's pull out the first example:
drivers/infiniband/hw/usnic/usnic_uiom.c
228 spin_lock(&pd->lock);
229 usnic_uiom_remove_interval(&pd->root, vpn_start,
230 vpn_last, &rm_intervals);
231 usnic_uiom_unmap_sorted_intervals(&rm_intervals, pd);
232
233 list_for_each_entry_safe(interval, tmp, &rm_intervals, link) {
234 if (interval->flags & IOMMU_WRITE)
235 writable = 1;
236 list_del(&interval->link);
237 kfree(interval);
238 }
239
240 usnic_uiom_put_pages(&uiomr->chunk_list, dirty & writable);
^^^^^^^^^^^^^^^^^^^^
We're holding a spin lock, but _put_pages() calls unpin_user_pages_dirty_lock().
241 spin_unlock(&pd->lock);
242 }
regards,
dan carpenter
next reply other threads:[~2022-02-24 9:38 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-24 9:37 Dan Carpenter [this message]
2022-02-24 14:51 ` [bug report] RDMA: Convert put_page() to put_user_page*() Jason Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220224093758.GA30603@kili \
--to=dan.carpenter@oracle.com \
--cc=jgg@ziepe.ca \
--cc=jhubbard@nvidia.com \
--cc=leonro@mellanox.com \
--cc=linux-rdma@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox