From 580cf49a5eb18b71e46a120a1c7fd40f04e4a49e Mon Sep 17 00:00:00 2001 From: David Smith Date: Fri, 9 Dec 2011 13:43:17 -0600 Subject: [PATCH] Remove the possibililty of sleeping from __stp_call_mmap_callbacks_*(). * runtime/task_finder2.c (__stp_call_mmap_callbacks_with_addr): Change down_read() to down_read_trylock() instead, which won't sleep. (__stp_call_mmap_callbacks_for_task): Ditto. --- runtime/task_finder2.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/runtime/task_finder2.c b/runtime/task_finder2.c index 6bf6c010f..09280a2d5 100644 --- a/runtime/task_finder2.c +++ b/runtime/task_finder2.c @@ -614,7 +614,10 @@ __stp_call_mmap_callbacks_with_addr(struct stap_task_finder_target *tgt, if (! mm) return; - down_read(&mm->mmap_sem); + // The down_read() function can sleep, so we'll call + // down_read_trylock() instead, which can fail. + if (! down_read_trylock(&mm->mmap_sem)) + return; vma = __stp_find_file_based_vma(mm, addr); if (vma) { // Cache information we need from the vma @@ -1033,7 +1036,12 @@ __stp_call_mmap_callbacks_for_task(struct stap_task_finder_target *tgt, return; } - down_read(&mm->mmap_sem); + // The down_read() function can sleep, so we'll call + // down_read_trylock() instead, which can fail. + if (! down_read_trylock(&mm->mmap_sem)) { + _stp_kfree(mmpath_buf); + return; + } // First find the number of file-based vmas. vma = mm->mmap; -- 2.43.5