2004-10-18 23:02:15

by Chris Friesen

[permalink] [raw]
Subject: question on memory map cleanup stuff

I've got a small feature that maps a page of kernel memory to userspace via a
syscall, then uses that page for various things.

Currently, I'm marking the page reserved, then exporting it via
remap_page_range(). This means that I need to clean up my mapping whenever the
memory map is destroyed (process death, exec(), daemonize, etc.).

It appears that I should be able to put my cleanup code in exit_mmap(). Since
the cleanup code calls do_munmap() on the address, I would want to call it
before taking mm->page_table_lock, correct?

Also, normally I would hold mm->mmap_sem before calling do_munmap(). Would I
still need this if I'm calling it from exit_mmap()? Presumably nobody else can
get at it anymore...

Thanks,

Chris


2004-10-18 23:14:40

by William Lee Irwin III

[permalink] [raw]
Subject: Re: question on memory map cleanup stuff

On Mon, Oct 18, 2004 at 04:57:20PM -0600, Chris Friesen wrote:
> I've got a small feature that maps a page of kernel memory to userspace via
> a syscall, then uses that page for various things.
> Currently, I'm marking the page reserved, then exporting it via
> remap_page_range(). This means that I need to clean up my mapping whenever
> the memory map is destroyed (process death, exec(), daemonize, etc.).
> It appears that I should be able to put my cleanup code in exit_mmap().
> Since the cleanup code calls do_munmap() on the address, I would want to
> call it before taking mm->page_table_lock, correct?
> Also, normally I would hold mm->mmap_sem before calling do_munmap(). Would
> I still need this if I'm calling it from exit_mmap()? Presumably nobody
> else can get at it anymore...

vma->vm_ops->close() often suffices for such without disturbing the core.


-- wli

2004-10-18 23:41:25

by Chris Friesen

[permalink] [raw]
Subject: Re: question on memory map cleanup stuff

William Lee Irwin III wrote:

> vma->vm_ops->close() often suffices for such without disturbing the core.

Ah. That looks promising.

Thanks.

Chris

2004-10-19 18:28:36

by William Lee Irwin III

[permalink] [raw]
Subject: Re: question on memory map cleanup stuff

William Lee Irwin III wrote:
>> vma->vm_ops->close() often suffices for such without disturbing the core.

On Tue, Oct 19, 2004 at 12:19:00PM -0600, Chris Friesen wrote:
> I'm running into a problem.
> At the time of close(), I need to figure out which page to unreserve and
> free. However, when I call
> follow_page(vma->vm_mm, vma->vm_start, 0);
> it returns zero. How do I go from vma to page?

You generally need to keep track of this yourself, as during ->close()
the pagetables have already been destroyed. linear_page_index() can
tell you the offset into the object the vma maps, but ultimately, you
have to track the pages yourself. vma->vm_private_data can be used to
attach various accounting structures to the vma.


-- wli

2004-10-19 19:04:45

by Chris Friesen

[permalink] [raw]
Subject: Re: question on memory map cleanup stuff

William Lee Irwin III wrote:
> On Mon, Oct 18, 2004 at 04:57:20PM -0600, Chris Friesen wrote:
>
>>I've got a small feature that maps a page of kernel memory to userspace via
>>a syscall, then uses that page for various things.
>>Currently, I'm marking the page reserved, then exporting it via
>>remap_page_range(). This means that I need to clean up my mapping whenever
>>the memory map is destroyed (process death, exec(), daemonize, etc.).

> vma->vm_ops->close() often suffices for such without disturbing the core.

I'm running into a problem.

At the time of close(), I need to figure out which page to unreserve and free.
However, when I call

follow_page(vma->vm_mm, vma->vm_start, 0);

it returns zero. How do I go from vma to page?

Chris