mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Hugh Dickins <hugh@veritas.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Petr Vandrovec <vandrove@vc.cvut.cz>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: Nick's core remove PageReserved broke vmware...
Date: Wed, 2 Nov 2005 21:41:41 +0000 (GMT)	[thread overview]
Message-ID: <Pine.LNX.4.61.0511022112530.18174@goblin.wat.veritas.com> (raw)
In-Reply-To: <1130965454.20136.50.camel@gaston>

On Thu, 3 Nov 2005, Benjamin Herrenschmidt wrote:
> 
> Not completely related to this thread, but ... I have been working on
> the radeon DRI driver to add some non-AGP DMA functionality. That needs
> to pin some userpages for DMA. It's currently doing get_user_pages(),
> and later on, page_cache_release() when the DMA is done. In between
> however, it returns to userland.

That's the right way to do it.

> I haven't been able to find a firm grasp on what is needed to make sure
> those pages won't be mucked with by rmap or others during that proc ess.
> Should I set PG_locked ? if yes why and if not why not ? (you may figure
> out at this point that I have a poor understanding of this part of the
> VM subsystem). Will get_user_pages() increase page_mapcount or only
> page_count (relative to your quote above) ?

get_user_pages() raises page_count, not page_mapcount.  You shouldn't set
PG_locked (and if you did, ought only to do so via lock_page): that was
done at one time in early 2.4, but it's irrelevant (and a problem when
the same page appears more than once in the list).

It remains unlikely but possible that rmap will come along and remove
the page from its place in the user address space before the DMAing
has finished; but that does not matter, so long as any user access
to that address faults the right pinned page back in.

The only extant problem here is if the pages are private, and you
fork while this is going on, and the parent user process writes to the
area before completion: then COW leaves the child with the page being
DMAed into, giving the parent a copied page which may be incomplete.

> Also, I'm not too sure how to handle dirtyness. It _seems_ to be that
> for a DMA transfer from device to memory, I will have to call
> get_user_pages() for write, thus setting dirty at that moment. However,
> this is not very optimal. I want X to be able to "prepare" pixmaps for
> DMA (keeping the user pages locked and the DMA sglists ready) (up to a
> given threshold of memory of course) and later on, kick DMA operations.
> In that context, X doesn't know in advance what direction the DMA will
> take. Pixmaps can be migrated to/from vram at any time depending on the
> type of rendering operation.

It's important that any necessary COW be done at get_user_pages time,
if there's any possibility that you'll be DMAing into them.  So when
in doubt, call it for write access.

> But I'm not sure I have a proper way to set those pages dirty after the
> call to get_user_pages(), do I have a guarantee that they haven't been
> unmapped from the user process for example ?

You don't have that guarantee, but you shouldn't need it: when in doubt,
let it set them dirty beforehand.  As to afterwards, if I remember
rightly, there's a race by which the pages might be written out and
dirty cleared before your DMA completed, so you actually do need to
mark them dirty after - searching fs/ for get_user_pages() use suggests
so.  Take a look at Andrew's educational comment on set_page_dirty_lock
in mm/page-writeback.c.  You do have the list of pages you need to
page_cache_release, don't you?  So it should be easy to dirty them.

Hugh

  reply	other threads:[~2005-11-02 21:42 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-01 19:30 Petr Vandrovec
2005-11-02  0:34 ` Nick Piggin
2005-11-02  1:17   ` Petr Vandrovec
2005-11-02  2:09     ` Nick Piggin
2005-11-02 12:26     ` Hugh Dickins
2005-11-02 18:06       ` Petr Vandrovec
2005-11-02 21:04       ` Benjamin Herrenschmidt
2005-11-02 21:41         ` Hugh Dickins [this message]
2005-11-02 21:45           ` Benjamin Herrenschmidt
2005-11-02 22:02             ` Hugh Dickins
2005-11-02 22:22               ` Benjamin Herrenschmidt
2005-11-03  8:03                 ` Gleb Natapov
2005-11-03 13:32                   ` Hugh Dickins
2005-11-03 13:55                     ` Gleb Natapov
2005-11-03 21:21                       ` Benjamin Herrenschmidt
2005-11-02 22:39               ` Petr Vandrovec
2005-11-03  8:12               ` Gleb Natapov
2005-11-03 14:11                 ` Hugh Dickins
2005-11-03 14:22                   ` Gleb Natapov
2005-11-03 14:37                   ` Michael S. Tsirkin
2005-11-03 14:59                     ` Hugh Dickins
2005-11-03 15:09                       ` Gleb Natapov
2005-11-03 15:14                       ` Michael S. Tsirkin
2005-11-03 15:37                         ` Hugh Dickins
2005-11-03 15:53                           ` Gleb Natapov
2005-11-03 15:56                           ` Michael S. Tsirkin
2005-11-08 21:34                   ` Michael S. Tsirkin
2005-11-10 12:35                     ` Gleb Natapov
2005-11-10 12:48                       ` Michael S. Tsirkin
2005-11-10 12:49                         ` Gleb Natapov
2005-11-10 13:16                           ` Michael S. Tsirkin
2005-11-10 13:16                             ` Gleb Natapov
2005-11-10 13:21                             ` Hugh Dickins
2005-11-10 13:26                               ` Gleb Natapov
2005-11-10 13:15                         ` Hugh Dickins
2005-11-10 13:10                     ` Hugh Dickins
2005-11-10 13:37                       ` Michael S. Tsirkin
2005-11-10 13:55                         ` Hugh Dickins
2005-11-10 14:12                           ` Michael S. Tsirkin
2005-11-14 12:25                       ` Michael S. Tsirkin
2005-11-14 12:27                         ` Gleb Natapov
2005-11-14 12:34                           ` Michael S. Tsirkin
2005-11-14 12:40                             ` Hugh Dickins
2005-11-14 14:57                               ` Michael S. Tsirkin
2005-11-14 15:07                                 ` Gleb Natapov
2005-11-14 12:41                             ` Gleb Natapov
2005-11-14 14:52                       ` Michael S. Tsirkin
2005-11-14 15:00                         ` Gleb Natapov
2005-11-14 20:23                           ` Michael S. Tsirkin
2005-11-15  9:26                             ` Gleb Natapov
2005-11-14 15:58                         ` Hugh Dickins
2005-11-14 21:17                           ` Michael S. Tsirkin

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=Pine.LNX.4.61.0511022112530.18174@goblin.wat.veritas.com \
    --to=hugh@veritas.com \
    --cc=benh@kernel.crashing.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nickpiggin@yahoo.com.au \
    --cc=vandrove@vc.cvut.cz \
    /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

all inboxes | Powered by JetHome®