All of lore.kernel.org
 help / color / mirror / Atom feed
From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: forcing write-back from FS - again
Date: Sun, 21 Oct 2007 23:19:41 +0300	[thread overview]
Message-ID: <471BB45D.8070509@nokia.com> (raw)

Hi Andrew,

some time ago we were talking about doing write-back from inside a file-system 
(http://marc.info/?l=linux-kernel&m=119097117713616&w=2). You said that I'm not 
the only person who needs this, because the same thing is needed for delayed 
allocation.

The problem is that if we initiate write-back from prepare_write() and we are 
having a dirty page lock, we deadlock in write_cache_pages() which tries to 
lock the same page.

You suggested to enhance struct writeback_control and put page that should be 
skipped.

I tried something like

diff --git a/include/linux/writeback.h b/include/linux/writeback.h
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -61,6 +61,7 @@ struct writeback_control {
         unsigned for_reclaim:1;         /* Invoked from the page allocator */
         unsigned for_writepages:1;      /* This is a writepages() call */
         unsigned range_cyclic:1;        /* range_start is cyclic */
+       struct page *skip_pg;           /* do not write this page back */

         void *fs_private;               /* For use by ->writepages() */
  };

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -641,6 +641,9 @@ retry:
                 for (i = 0; i < nr_pages; i++) {
                         struct page *page = pvec.pages[i];

+                       if (unlikely(page == wbc->skip_pg))
+                               continue;
+
                         /*
                          * At this point we hold neither mapping->tree_lock nor
                          * lock on the page itself: the page may be truncated

but it does not dot actually work, because if we have two processes forcing 
write-back from write_page(), they will mutually deadlock (A waits in 
write_cache_pages() on a page B has locked, B waits on inode or page A has locked).

So this way is not ok, do you have any other ideas?

We could mark page clean temporarily before doing write-back, and mark it dirty 
again, but this seems to be inefficient (although I'm not sure, need to dig 
these functions deeper, but they _seem_ to traverse the radix tree and change 
tags, so marking one page dirty may need to change many tags, but again, I did 
not really dig tis yet).

I'd appreciate any suggestions. Thanks!

-- 
Best Regards,
Artem Bityutskiy (Артём Битюцкий)

             reply	other threads:[~2007-10-21 20:19 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-21 20:19 Artem Bityutskiy [this message]
2007-10-21 20:55 ` forcing write-back from FS - again Andrew Morton
2007-10-22  8:52   ` Artem Bityutskiy
2007-10-22  9:05     ` Andrew Morton
2007-10-22  9:38       ` Artem Bityutskiy
2007-10-22  9:55         ` Andrew Morton
2007-10-22 10:04           ` Artem Bityutskiy

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=471BB45D.8070509@nokia.com \
    --to=artem.bityutskiy@nokia.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.