git: track the specific branch only
[akaros.git] / kern / include / mm.h
index ccb2119..d1ec141 100644 (file)
 #include <sys/queue.h>
 #include <slab.h>
 #include <kref.h>
+#include <rcu.h>
 
-struct file;
 struct chan;
 struct fd_table;
-struct proc;                                                           /* preprocessor games */
+struct proc;   /* preprocessor games */
 
-#define F_OR_C_NONE 0
-#define F_OR_C_FILE 1
 #define F_OR_C_CHAN 2
 
 struct file_or_chan {
        int type;
-       struct file *file;
        struct chan *chan;
+       struct fs_file *fsf;    /* weak ref, set during mmap. */
        struct kref kref;
+       struct rcu_head rcu;
 };
 
 char *foc_to_name(struct file_or_chan *foc);
-char *foc_abs_path(struct file_or_chan *foc, char *path, size_t max_size);
+char *foc_abs_path(struct file_or_chan *foc);
 ssize_t foc_read(struct file_or_chan *foc, void *buf, size_t amt, off64_t off);
 struct file_or_chan *foc_open(char *path, int omode, int perm);
 struct file_or_chan *fd_to_foc(struct fd_table *fdt, int fd);
@@ -48,15 +47,17 @@ size_t foc_get_len(struct file_or_chan *foc);
 struct vm_region {
        TAILQ_ENTRY(vm_region)          vm_link;
        TAILQ_ENTRY(vm_region)          vm_pm_link;
-       struct proc                                     *vm_proc;       /* owning process, for now */
-       uintptr_t                                       vm_base;
-       uintptr_t                                       vm_end;
-       int                                                     vm_prot;
-       int                                                     vm_flags;
-       struct file_or_chan                     *__vm_foc;
-       size_t                                          vm_foff;
+       struct proc                     *vm_proc;
+       uintptr_t                       vm_base;
+       uintptr_t                       vm_end;
+       int                             vm_prot;
+       int                             vm_flags;
+       struct file_or_chan             *__vm_foc;
+       size_t                          vm_foff;
+       bool                            vm_ready; /* racy, for the PM checks */
+       bool                            vm_shootdown_needed;
 };
-TAILQ_HEAD(vmr_tailq, vm_region);                      /* Declares 'struct vmr_tailq' */
+TAILQ_HEAD(vmr_tailq, vm_region);      /* Declares 'struct vmr_tailq' */
 
 static inline bool vmr_has_file(struct vm_region *vmr)
 {
@@ -69,25 +70,12 @@ static inline char *vmr_to_filename(struct vm_region *vmr)
        return foc_to_name(vmr->__vm_foc);
 }
 
-/* VM Region Management Functions.  For now, these just maintain themselves -
- * anything related to mapping needs to be done by the caller. */
 void vmr_init(void);
-struct vm_region *create_vmr(struct proc *p, uintptr_t va, size_t len);
-struct vm_region *split_vmr(struct vm_region *vmr, uintptr_t va);
-int merge_vmr(struct vm_region *first, struct vm_region *second);
-struct vm_region *merge_me(struct vm_region *vmr);
-int grow_vmr(struct vm_region *vmr, uintptr_t va);
-int shrink_vmr(struct vm_region *vmr, uintptr_t va);
-void destroy_vmr(struct vm_region *vmr);
-struct vm_region *find_vmr(struct proc *p, uintptr_t va);
-struct vm_region *find_first_vmr(struct proc *p, uintptr_t va);
-void isolate_vmrs(struct proc *p, uintptr_t va, size_t len);
 void unmap_and_destroy_vmrs(struct proc *p);
 int duplicate_vmrs(struct proc *p, struct proc *new_p);
 void print_vmrs(struct proc *p);
-void enumerate_vmrs(struct proc *p,
-                                       void (*func)(struct vm_region *vmr, void *opaque),
-                                       void *opaque);
+void enumerate_vmrs(struct proc *p, void (*func)(struct vm_region *vmr, void
+                                                *opaque), void *opaque);
 
 /* mmap() related functions.  These manipulate VMRs and change the hardware page
  * tables.  Any requests below the LOWEST_VA will silently be upped.  This may