Re: [PATCH 1/7] Introduce the pagetable_operations and associatedhelper macros.

From: Nick Piggin
Date: Wed Mar 21 2007 - 00:18:57 EST


Adam Litke wrote:
Signed-off-by: Adam Litke <agl@xxxxxxxxxx>
---

include/linux/mm.h | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 60e0e4a..7089323 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -98,6 +98,7 @@ struct vm_area_struct {
/* Function pointers to deal with this struct. */
struct vm_operations_struct * vm_ops;
+ const struct pagetable_operations_struct * pagetable_ops;
/* Information about our backing store: */
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE

Can you remind me why this isn't in vm_ops?

Also, it is going to be hugepage-only, isn't it? So should the naming be
changed to reflect that? And #ifdef it...

@@ -218,6 +219,30 @@ struct vm_operations_struct {
};
struct mmu_gather;
+
+struct pagetable_operations_struct {
+ int (*fault)(struct mm_struct *mm,
+ struct vm_area_struct *vma,
+ unsigned long address, int write_access);

I got dibs on fault ;)

My callback is a sanitised one that basically abstracts the details of the
virtual memory mapping away, so it is usable by drivers and filesystems.

You actually want to bypass the normal fault handling because it doesn't
know how to deal with your virtual memory mapping. Hmm, the best suggestion
I can come up with is handle_mm_fault... unless you can think of a better
name for me to use.

+ int (*copy_vma)(struct mm_struct *dst, struct mm_struct *src,
+ struct vm_area_struct *vma);
+ int (*pin_pages)(struct mm_struct *mm, struct vm_area_struct *vma,
+ struct page **pages, struct vm_area_struct **vmas,
+ unsigned long *position, int *length, int i);
+ void (*change_protection)(struct vm_area_struct *vma,
+ unsigned long address, unsigned long end, pgprot_t newprot);
+ unsigned long (*unmap_page_range)(struct vm_area_struct *vma,
+ unsigned long address, unsigned long end, long *zap_work);
+ void (*free_pgtable_range)(struct mmu_gather **tlb,
+ unsigned long addr, unsigned long end,
+ unsigned long floor, unsigned long ceiling);
+};
+
+#define has_pt_op(vma, op) \
+ ((vma)->pagetable_ops && (vma)->pagetable_ops->op)
+#define pt_op(vma, call) \
+ ((vma)->pagetable_ops->call)
+
struct inode;
#define page_private(page) ((page)->private)

--

--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com -
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/