From: Andy Grover <andy.grover@oracle.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, rds-devel@oss.oracle.com
Subject: Re: [RESEND PATCH] mm: Use spin_lock_irqsave in __set_page_dirty_nobuffers
Date: Mon, 24 Jan 2011 17:30:27 -0800 [thread overview]
Message-ID: <4D3E27B3.5050707@oracle.com> (raw)
In-Reply-To: <20110121120945.8d0e1010.akpm@linux-foundation.org>
On 01/21/2011 12:09 PM, Andrew Morton wrote:
> Andy Grover<andy.grover@oracle.com> wrote:
>> When doing an RDMA read into pinned pages, we get notified the operation
>> is complete in a tasklet, and would like to mark the pages dirty and
>> unpin in the same context.
>> The issue was __set_page_dirty_buffers (via calling set_page_dirty)
>> was unconditionally re-enabling irqs as a side-effect because it
>> was using *_irq instead of *_irqsave/restore.
>
> Your patch patched __set_page_dirty_nobuffers()?
Yes, _nobuffers, sorry.
> What you could perhaps do is to lock_page() all the pages and run
> set_page_dirty() on them *before* setting up the IO operation, then run
> unlock_page() from interrupt context.
>
> I assume that all these pages are mapped into userspace processes? If
> so, they're fully uptodate and we're OK. If they're plain old
> pagecache pages then we could have partially uptodate pages and things
> get messier.
>
> Running lock_page() against multiple pages is problematic because it
> introduces a risk of ab/ba deadlocks against another thread which is
> also locking multiple pages. Possible solutions are a) take some
> higher-level mutex so that only one thread will ever be running the
> lock_page()s at a time or b) lock all the pages in ascending
> paeg_to_pfn() order. Both of these are a PITA.
Another problem may be that lock/unlock_page() doesn't nest. We need to
be able to handle multiple ops to the same page. So, sounds like we also
need to keep track of all pages we lock/dirty and make sure they aren't
unlocked as long as we have references against them?
I just want to fully understand what's needed, before writing at least 2
PITA's worth of extra code :)
> Some thought is needed regarding anonymous pages and swapcache pages.
I think the common case for us is IO into anon pages.
Regards -- Andy
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2011-01-25 1:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-11 6:15 [RESEND PATCH] mm: Use spin_lock_irqsave in __set_page_dirty_nobuffers Andy Grover
2011-01-21 8:18 ` Andrew Morton
2011-01-21 19:25 ` Andy Grover
2011-01-21 20:09 ` Andrew Morton
2011-01-25 1:30 ` Andy Grover [this message]
2011-01-25 1:44 ` Andrew Morton
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=4D3E27B3.5050707@oracle.com \
--to=andy.grover@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=linux-mm@kvack.org \
--cc=rds-devel@oss.oracle.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 NNTP newsgroup(s).