RE: [PATCH 2.5.69.bk9] Fix reference counts for pages (take 1) [w as RE: condvar wakeups]

"Perez-Gonzalez, Inaky" <[email protected]>
Newsgroups gmane.comp.lib.phil
Message-ID <[email protected]>
> From: Saurabh Desai [mailto:[email protected]]
> 
> "Perez-Gonzalez, Inaky" wrote:
> > This is the first take at it; I still didn't have time to test it
> > (0.37 building, slow) ... but I don't think I screwed up anything
> > - Saurabh, would you mind torturing it a little bit in your x4 to
> > make sure it is not leaking memory anywhere? Performance wise it
> > should do nothing to the system ...
> >
> 
> This patch cause about 30% slowdown with or without requeue NPTL.
> And I found out why, you didn't return from __pin_page() as before
> (for the fastpath). It should be like (in __pin_page()),
> +       if (likely(page != NULL))
> +               return __pin_page_atomic(page);
> 
> With this, it works as before. I think its costing little bit for
> unpin/pin in the requeue case, which is required anyway.

Sometimes I really think I should be shepherding goats instead of
cranking out code ... Thanks so much, Saurabh. Ok, so here it goes,
take 3, with that fixed.

Index: linux3/linux/kernel/futex.c
diff -u linux3/linux/kernel/futex.c:1.1.1.1.2.4
linux3/linux/kernel/futex.c:1.1.1.1.2.2.2.5
--- linux3/linux/kernel/futex.c:1.1.1.1.2.4	Wed May 14 16:30:07 2003
+++ linux3/linux/kernel/futex.c	Thu May 15 14:32:56 2003
@@ -98,6 +98,13 @@
  *
  * Must be called with (and returns with) all futex-MM locks held.
  */
+static inline
+struct page *__pin_page_atomic (struct page *page)
+{
+	if (!PageReserved(page))
+		get_page(page);
+	return page;
+}
 static struct page *__pin_page(unsigned long addr)
 {
 	struct mm_struct *mm = current->mm;
@@ -108,11 +115,8 @@
 	 * Do a quick atomic lookup first - this is the fastpath.
 	 */
 	page = follow_page(mm, addr, 0);
-	if (likely(page != NULL)) {	
-		if (!PageReserved(page))
-			get_page(page);
-		return page;
-	}
+	if (likely(page != NULL))
+		return __pin_page_atomic(page);
 
 	/*
 	 * No luck - need to fault in the page:
@@ -202,7 +206,9 @@
 	spin_lock(&futex_lock);
 
 	if (!list_empty(&q->list)) {
+		unpin_page(q->page);
 		q->page = new_page;
+		__pin_page_atomic(new_page);
 		list_del(&q->list);
 		list_add_tail(&q->list, head);
 	}
@@ -247,6 +253,8 @@
 				if (this->filp)
 					send_sigio(&this->filp->f_owner,
this->fd, POLL_IN);
 			} else {
+				unpin_page(this->page);
+				__pin_page_atomic (page2);
 				list_add_tail(i, head2);
 				__attach_vcache(&this->vcache, uaddr2,
current->mm, futex_vcache_callback);
 				this->offset = offset2;
@@ -362,7 +370,7 @@
 	/* Were we woken up anyway? */
 	if (!unqueue_me(&q))
 		ret = 0;
-	unpin_page(page);
+	unpin_page(q.page);
 
 	return ret;
 }

Iñaky Pérez-González -- Not speaking for Intel -- all opinions are my own
(and my fault)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.