when a task exits we can remove all external pts at once. At that point the
extern mmu may also unregister itself from the mmu notifier chain to avoid
future calls.
Note the complications because of RCU. Other processors may not see that the
notifier was unlinked until a quiescent period has passed!
Signed-off-by: Christoph Lameter <[email protected]>
---
include/linux/mmu_notifier.h | 4 ++++
mm/mmap.c | 1 +
2 files changed, 5 insertions(+)
Index: linux-2.6/include/linux/mmu_notifier.h
===================================================================
--- linux-2.6.orig/include/linux/mmu_notifier.h 2008-01-28 11:43:03.000000000 -0800
+++ linux-2.6/include/linux/mmu_notifier.h 2008-01-28 12:21:33.000000000 -0800
@@ -62,6 +62,10 @@ struct mmu_notifier_ops {
struct mm_struct *mm,
unsigned long address);
+ /* Dummy needed because the mmu_notifier() macro requires it */
+ void (*invalidate_all)(struct mmu_notifier *mn, struct mm_struct *mm,
+ int dummy);
+
/*
* lock indicates that the function is called under spinlock.
*/
Index: linux-2.6/mm/mmap.c
===================================================================
--- linux-2.6.orig/mm/mmap.c 2008-01-28 11:47:53.000000000 -0800
+++ linux-2.6/mm/mmap.c 2008-01-28 11:57:45.000000000 -0800
@@ -2034,6 +2034,7 @@ void exit_mmap(struct mm_struct *mm)
unsigned long end;
/* mm's last user has gone, and its about to be pulled down */
+ mmu_notifier(invalidate_all, mm, 0);
arch_exit_mmap(mm);
lru_add_drain();
--
What is the status of getting invalidate_all adjusted to indicate a need
to also call _release?
Thanks,
Robin
On Mon, Jan 28, 2008 at 12:28:46PM -0800, Christoph Lameter wrote:
> when a task exits we can remove all external pts at once. At that point the
> extern mmu may also unregister itself from the mmu notifier chain to avoid
> future calls.
>
> Note the complications because of RCU. Other processors may not see that the
> notifier was unlinked until a quiescent period has passed!
>
> Signed-off-by: Christoph Lameter <[email protected]>
>
> ---
> include/linux/mmu_notifier.h | 4 ++++
> mm/mmap.c | 1 +
> 2 files changed, 5 insertions(+)
>
> Index: linux-2.6/include/linux/mmu_notifier.h
> ===================================================================
> --- linux-2.6.orig/include/linux/mmu_notifier.h 2008-01-28 11:43:03.000000000 -0800
> +++ linux-2.6/include/linux/mmu_notifier.h 2008-01-28 12:21:33.000000000 -0800
> @@ -62,6 +62,10 @@ struct mmu_notifier_ops {
> struct mm_struct *mm,
> unsigned long address);
>
> + /* Dummy needed because the mmu_notifier() macro requires it */
> + void (*invalidate_all)(struct mmu_notifier *mn, struct mm_struct *mm,
> + int dummy);
> +
> /*
> * lock indicates that the function is called under spinlock.
> */
> Index: linux-2.6/mm/mmap.c
> ===================================================================
> --- linux-2.6.orig/mm/mmap.c 2008-01-28 11:47:53.000000000 -0800
> +++ linux-2.6/mm/mmap.c 2008-01-28 11:57:45.000000000 -0800
> @@ -2034,6 +2034,7 @@ void exit_mmap(struct mm_struct *mm)
> unsigned long end;
>
> /* mm's last user has gone, and its about to be pulled down */
> + mmu_notifier(invalidate_all, mm, 0);
> arch_exit_mmap(mm);
>
> lru_add_drain();
>
> --
On Tue, 29 Jan 2008, Robin Holt wrote:
> What is the status of getting invalidate_all adjusted to indicate a need
> to also call _release?
Release is only called if the mmu_notifier is still registered. If you
take it out on invalidate_all then there will be no call to release
(provided you deal with the RCU issues).