public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
From: Vara Prasad <prasadav@us.ibm.com>
To: "Zhang, Yanmin" <yanmin.zhang@intel.com>
Cc: prasanna@in.ibm.com, systemtap@sources.redhat.com,
	        "Keshavamurthy, Anil S" <anil.s.keshavamurthy@intel.com>,
	        "Mao, Bibo" <bibo.mao@intel.com>
Subject: Re: Review patches of user space kprobe
Date: Thu, 22 Dec 2005 06:00:00 -0000	[thread overview]
Message-ID: <43AA3C78.5030808@us.ibm.com> (raw)
In-Reply-To: <8126E4F969BA254AB43EA03C59F44E840447BD45@pdsmsx404>

Hi Yanmin,

I appreciate your comments. Prasanna the author of the patch is on 
vacation until the month end, he will address your comments once he is 
back in Jan. Please feel free to finish the review of the 3rd patch as 
well in the mean time.

Thanks,
Vara Prasad

Zhang, Yanmin wrote:

>Below inline are the comments for patch 2/3.
>
>Yanmin
>
>  
>
>>>Signed-of-by: Prasanna S Panchamukhi <prasanna@in.ibm.com>
>>>
>>>
>>>---
>>>
>>>linux-2.6.13-prasanna/include/linux/kprobes.h |    2 
>>>linux-2.6.13-prasanna/kernel/kprobes.c        |  113
>>>      
>>>
>++++++++++++++++++++++++++
>  
>
>>>2 files changed, 115 insertions(+)
>>>
>>>diff -puN kernel/kprobes.c~kprobes_userspace_probes-readpages
>>>      
>>>
>kernel/kprobes.c
>  
>
>>>--- linux-2.6.13/kernel/kprobes.c~kprobes_userspace_probes-readpages
>>>      
>>>
>2005-09-14 11:01:18.495513696 +0530
>  
>
>>>+++ linux-2.6.13-prasanna/kernel/kprobes.c	2005-09-14
>>>      
>>>
>11:01:18.550505336 +0530
>  
>
>>>@@ -652,6 +652,109 @@ static struct uprobe_module *get_module_
>>>}
>>>
>>>/*
>>>+ * Check if the given offset lies within given page range.
>>>+ */
>>>+static int find_page_probe(unsigned long offset, unsigned long
>>>      
>>>
>page_start)
>  
>
>>>+{
>>>+      unsigned long page_end = page_start + PAGE_SIZE;
>>>+	if (offset >= page_start && offset < page_end)
>>>+		return 1;
>>>+	return 0;
>>>+}
>>>+
>>>+/*
>>>+ * This function handles the readpages of all modules that have
>>>      
>>>
>active probes
>  
>
>>>+ * in them. Here, we first call the original readpages() of this
>>>+ * inode / address_space to actually read the pages into memory.
>>>      
>>>
>Then, we will
>  
>
>>>+ * insert all the probes that are specified in this pages before
>>>      
>>>
>returning.
>  
>
>>>+ */
>>>+static int up_readpages(struct file *file, struct address_space
>>>      
>>>
>*mapping,
>  
>
>>>+			struct list_head *pages, unsigned nr_pages)
>>>+{
>>>+	int retval = 0;
>>>+	struct page *page;
>>>+	struct uprobe_module *m;
>>>+	struct uprobe *up = NULL;
>>>+	struct hlist_node *node;
>>>+
>>>+	m = get_module_by_inode(file->f_dentry->d_inode);
>>>      
>>>
>There is a race condition between unregister_userspace_probe and here.
>If a thread jumps to the beginning of function up_readpages while
>another thread calls unregister_userspace_probe to delete the um, the
>first thread might return error.
>
>
>  
>
>>>+	if (!m) {
>>>+		printk("up_readpages: major problem. we don't  \
>>>+						have mod for this
>>>      
>>>
>!!!\n");
>  
>
>>>+		return -EINVAL;
>>>+	}
>>>+
>>>+	/* call original readpages() */
>>>+	retval = m->ori_a_ops->readpages(file, mapping, pages,
>>>      
>>>
>nr_pages);
>  
>
>>>+	if (retval >= 0) {
>>>+		hlist_for_each_entry(up, node, &m->ulist_head, ulist) {
>>>+			/*
>>>+			 * TODO: Walk through readpages page list and
>>>      
>>>
>get
>  
>
>>>+			 * pages with probes instead of find_get_page().
>>>+			 */
>>>+			if ((page = find_get_page(mapping,
>>>+				up->offset >> PAGE_CACHE_SHIFT)) !=
>>>      
>>>
>NULL) {
>  
>
>>>+				if (find_page_probe
>>>+				    (up->offset >> PAGE_CACHE_SHIFT,
>>>+				     page->index << PAGE_CACHE_SHIFT)) {
>>>+					up->page = page;
>>>+					if (!map_uprobe_page(up, 0)) {
>>>+						lock_page(up->page);
>>>      
>>>
>The first patch doesn't do lock_page before calling insert_probe_page.
>Why does this patch do so? It's inconsistent.
>
>
>  
>
>>>+						insert_probe_page(up);
>>>+						unmap_uprobe_page(up);
>>>+						unlock_page(up->page);
>>>+					}
>>>+				}
>>>+				page_cache_release(up->page);
>>>+			}
>>>+		}
>>>+	}
>>>+	return retval;
>>>+}
>>>+
>>>+/*
>>>+ * This function handles the readpage of all modules that have active
>>>      
>>>
>probes
>  
>
>>>+ * in them. Here, we first call the original readpage() of this
>>>+ * inode / address_space to actually read the page into memory. Then,
>>>      
>>>
>we will
>  
>
>>>+ * insert all the probes that are specified in this page before
>>>      
>>>
>returning.
>  
>
>>>+ */
>>>+int up_readpage(struct file *file, struct page *page)
>>>+{
>>>+	int retval = 0;
>>>+	struct uprobe_module *m;
>>>+	struct uprobe *up = NULL;
>>>+	int kprobe_page_mapped = 0;
>>>+	struct hlist_node *node;
>>>+
>>>+	m = get_module_by_inode(file->f_dentry->d_inode);
>>>      
>>>
>The same race condition like above function.
>
>
>  
>
>>>+	if (!m) {
>>>+		printk("up_readpage: major problem. we don't have mod
>>>      
>>>
>for this !!!\n");
>  
>
>>>+		return -EINVAL;
>>>+	}
>>>+
>>>+	/* call original readpage() */
>>>+	retval = m->ori_a_ops->readpage(file, page);
>>>+	if (retval >= 0) {
>>>+		hlist_for_each_entry(up, node, &m->ulist_head, ulist) {
>>>+			if (find_page_probe (up->offset >>
>>>      
>>>
>PAGE_CACHE_SHIFT,
>  
>
>>>+					page->index <<
>>>      
>>>
>PAGE_CACHE_SHIFT)) {
>  
>
>>>+				up->page = page;
>>>+				if (!map_uprobe_page(up,
>>>      
>>>
>kprobe_page_mapped)) {
>  
>
>>>+					lock_page(up->page);
>>>      
>>>
>Same inconsistent issue.
>
>
>  
>
>>>+					kprobe_page_mapped = 1;
>>>+					retval = insert_probe_page(up);
>>>+				}
>>>+			}
>>>+		}
>>>+		if (kprobe_page_mapped) {
>>>      
>>>
>The logic here is incorrect. If there are many uprobes at the same page,
>up just points to the last one. How about others? 
>
>
>
>  
>
>>>+			unmap_uprobe_page(up);
>>>+			unlock_page(up->page);
>>>+		}
>>>+	}
>>>+	return retval;
>>>+}
>>>+
>>>      
>>>
>
>
>  
>


  reply	other threads:[~2005-12-22  5:41 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-22  5:41 Zhang, Yanmin
2005-12-22  6:00 ` Vara Prasad [this message]
2006-01-05 11:06 ` Prasanna S Panchamukhi
  -- strict thread matches above, loose matches on Subject: below --
2006-01-09  2:06 Zhang, Yanmin
2006-01-09  2:04 Zhang, Yanmin
2006-01-09  1:48 Zhang, Yanmin
2006-01-06  9:12 Zhang, Yanmin
2006-01-06  9:28 ` Prasanna S Panchamukhi
2006-01-06  9:08 Zhang, Yanmin
2006-01-06 10:22 ` Prasanna S Panchamukhi
2006-01-06 10:30   ` Roland McGrath
2006-01-06  5:29 Zhang, Yanmin
2006-01-06  9:08 ` Prasanna S Panchamukhi
2006-01-06  5:22 Zhang, Yanmin
2006-01-06  9:04 ` Prasanna S Panchamukhi
2006-01-06  4:27 Zhang, Yanmin
2006-01-06 12:28 ` Prasanna S Panchamukhi
2006-01-06  3:20 Zhang, Yanmin
2006-01-06  8:53 ` Prasanna S Panchamukhi
2006-01-06  2:52 Zhang, Yanmin
2006-01-06  6:53 ` Prasanna S Panchamukhi
2006-01-05  7:09 Zhang, Yanmin
2006-01-05 11:27 ` Prasanna S Panchamukhi
2005-12-22 13:24 Zhang, Yanmin
2006-01-05 11:10 ` Prasanna S Panchamukhi
2005-12-22  7:14 Zhang, Yanmin
2005-12-22  5:34 Zhang, Yanmin
2006-01-05 10:30 ` Prasanna S Panchamukhi
2005-12-22  5:09 Zhang, Yanmin
2006-01-05 10:29 ` Prasanna S Panchamukhi
2005-12-21  8:31 Zhang, Yanmin
2006-01-05 10:28 ` Prasanna S Panchamukhi

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=43AA3C78.5030808@us.ibm.com \
    --to=prasadav@us.ibm.com \
    --cc=anil.s.keshavamurthy@intel.com \
    --cc=bibo.mao@intel.com \
    --cc=prasanna@in.ibm.com \
    --cc=systemtap@sources.redhat.com \
    --cc=yanmin.zhang@intel.com \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).