]> git.proxmox.com Git - mirror_spl-debian.git/blobdiff - include/sys/vmsystm.h
FC10/i686 Compatibility Update (2.6.27.19-170.2.35.fc10.i686)
[mirror_spl-debian.git] / include / sys / vmsystm.h
index 443c376c9ada20373e6f4a31734d787e419fd730..123005e5e0018122dfb26b83daf22d69cc812ccf 100644 (file)
+/*
+ *  This file is part of the SPL: Solaris Porting Layer.
+ *
+ *  Copyright (c) 2008 Lawrence Livermore National Security, LLC.
+ *  Produced at Lawrence Livermore National Laboratory
+ *  Written by:
+ *          Brian Behlendorf <behlendorf1@llnl.gov>,
+ *          Herb Wartens <wartens2@llnl.gov>,
+ *          Jim Garlick <garlick@llnl.gov>
+ *  UCRL-CODE-235197
+ *
+ *  This is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This is distributed in the hope that it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ */
+
 #ifndef _SPL_VMSYSTM_H
 #define _SPL_VMSYSTM_H
 
+#include <linux/mmzone.h>
 #include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/highmem.h>
 #include <sys/types.h>
+#include <asm/uaccess.h>
 
-extern vmem_t *zio_alloc_arena;                /* arena for zio caches */
+/* These values are loosely coupled with the VM page reclaim.
+ * Linux uses its own heuristics to trigger page reclamation, and
+ * because those interface are difficult to interface with.  These
+ * values should only be considered as a rough guide to the system
+ * memory state and not as direct evidence that page reclamation.
+ * is or is not currently in progress.
+ */
+#define membar_producer()              smp_wmb()
 
 #define physmem                                num_physpages
-#define ptob(pages)                    (pages * PAGE_SIZE)
-#define membar_producer()              smp_wmb()
+#define freemem                                nr_free_pages()
+#define availrmem                      spl_kmem_availrmem()
+
+extern pgcnt_t minfree;                        /* Sum of zone->pages_min */
+extern pgcnt_t desfree;                        /* Sum of zone->pages_low */
+extern pgcnt_t lotsfree;               /* Sum of zone->pages_high */
+extern pgcnt_t needfree;               /* Always 0 unused in new Solaris */
+extern pgcnt_t swapfs_minfree;         /* Solaris default value */
+extern pgcnt_t swapfs_reserve;         /* Solaris default value */
+
+extern vmem_t *heap_arena;             /* primary kernel heap arena */
+extern vmem_t *zio_alloc_arena;                /* arena for zio caches */
+extern vmem_t *zio_arena;              /* arena for allocating zio memory */
+
+extern pgcnt_t spl_kmem_availrmem(void);
+extern size_t vmem_size(vmem_t *vmp, int typemask);
+
+/*
+ * The following symbols are available for use within the kernel
+ * itself, and they used to be available in older kernels.  But it
+ * looks like they have been removed perhaps due to lack of use.
+ * For our purposes we need them to access the global memory state
+ * of the system, which is even available to user space process
+ * in /proc/meminfo.  It's odd to me that there is no kernel API
+ * to get the same information, minimally the proc handler for
+ * the above mentioned /proc/meminfo file would make use of it.
+ */
+
+/* Source linux/fs/proc/mmu.c */
+#ifndef HAVE_GET_VMALLOC_INFO
+#ifdef CONFIG_MMU
+
+struct vmalloc_info {
+       unsigned long used;
+       unsigned long largest_chunk;
+};
+
+typedef void (*get_vmalloc_info_t)(struct vmalloc_info *);
+extern get_vmalloc_info_t get_vmalloc_info_fn;
+
+# define VMEM_ALLOC            0x01
+# define VMEM_FREE             0x02
+# define VMALLOC_TOTAL         (VMALLOC_END - VMALLOC_START)
+# define get_vmalloc_info(vmi) get_vmalloc_info_fn(vmi)
+#else
+# error "CONFIG_MMU must be defined"
+#endif /* CONFIG_MMU */
+#endif /* HAVE_GET_VMALLOC_INFO */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_FIRST_ONLINE_PGDAT
+typedef struct pglist_data *(*first_online_pgdat_t)(void);
+extern first_online_pgdat_t first_online_pgdat_fn;
+#define first_online_pgdat()   first_online_pgdat_fn()
+#endif /* HAVE_FIRST_ONLINE_PGDAT */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_NEXT_ONLINE_PGDAT
+typedef struct pglist_data *(*next_online_pgdat_t)(struct pglist_data *);
+extern next_online_pgdat_t next_online_pgdat_fn;
+#define next_online_pgdat(pgd) next_online_pgdat_fn(pgd)
+#endif /* HAVE_NEXT_ONLINE_PGDAT */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_NEXT_ZONE
+typedef struct zone *(*next_zone_t)(struct zone *);
+extern next_zone_t next_zone_fn;
+#define next_zone(zone)                next_zone_fn(zone)
+#endif /* HAVE_NEXT_ZONE */
+
+/* Source linux/mm/vmstat.c */
+#ifndef HAVE_ZONE_STAT_ITEM_FIA
+# ifndef HAVE_GET_ZONE_COUNTS
+typedef void (*get_zone_counts_t)(unsigned long *, unsigned long *,
+                                 unsigned long *);
+extern get_zone_counts_t get_zone_counts_fn;
+# define get_zone_counts(a,i,f)        get_zone_counts_fn(a,i,f)
+
+extern unsigned long spl_global_page_state(int);
+/* Defines designed to simulate enum but large enough to ensure no overlap */
+# define NR_FREE_PAGES         0x8001
+# define NR_INACTIVE           0x8002
+# define NR_ACTIVE             0x8003
+# else
+# error "HAVE_ZONE_STAT_ITEM_FIA and HAVE_GET_ZONE_COUNTS unavailable"
+# endif /* HAVE_GET_ZONE_COUNTS */
+#else
+#define spl_global_page_state(item)    global_page_state(item)
+#endif /* HAVE_ZONE_STAT_ITEM_FIA */
 
-#define copyin(from, to, size)         copy_from_user(to, from, size)
-#define copyout(from, to, size)                copy_to_user(to, from, size)
+#define xcopyin(from, to, size)                copy_from_user(to, from, size)
+#define xcopyout(from, to, size)       copy_to_user(to, from, size)
 
-#if 0
-/* The approximate total number of free pages */
-#define freemem                                0
+static __inline__ int
+copyin(const void *from, void *to, size_t len)
+{
+       /* On error copyin routine returns -1 */
+       if (xcopyin(from, to, len))
+               return -1;
 
-/* The average number of free pages over the last 5 seconds */
-#define avefree                                0
+       return 0;
+}
 
-/* The average number of free pages over the last 30 seconds */
-#define avefree30                      0
+static __inline__ int
+copyout(const void *from, void *to, size_t len)
+{
+       /* On error copyout routine returns -1 */
+       if (xcopyout(from, to, len))
+               return -1;
 
-/* A guess as to how much memory has been promised to
- * processes but not yet allocated */
-#define deficit                                0
+       return 0;
+}
 
-/* A guess as to how many page are needed to satisfy
- * stalled page creation requests */
-#define needfree                       0
+static __inline__ int
+copyinstr(const void *from, void *to, size_t len, size_t *done)
+{
+       size_t rc;
 
-/* A bootlean the controls the setting of deficit */
-#define desperate
+       if (len == 0)
+               return -ENAMETOOLONG;
 
-/* When free memory is above this limit, no paging or swapping is done */
-#define lotsfree                       0
+       /* XXX: Should return ENAMETOOLONG if 'strlen(from) > len' */
 
-/* When free memory is above this limit, swapping is not performed */
-#define desfree                                0
+       memset(to, 0, len);
+       rc = copyin(from, to, len - 1);
+       if (done != NULL)
+               *done = rc;
 
-/* Threshold for many low memory tests, e.g. swapping is
- * more active below this limit */
-#define minfree                                0
-#endif
+       return 0;
+}
 
 #endif /* SPL_VMSYSTM_H */