]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] make swap code conditional
authorChristoph Hellwig <hch@lst.de>
Sun, 3 Nov 2002 02:45:55 +0000 (18:45 -0800)
committerChristoph Hellwig <hch@lst.de>
Sun, 3 Nov 2002 02:45:55 +0000 (18:45 -0800)
Make the swap code conditional on CONFIG_SWAP.  This is mostly for
uClinux, but !CONFIG_SWAP compiles and boots fine for i386, too -
the only problem I've seen is that X doesn't starts, it's probably
shm-related, thus it's disabled unconditionally for "normal" arches.

The patch makes three files in mm/ conditional on CONFIG_SWAP, reorganzies
include/linux/swap.h big time to provide stubs for the !CONFIG_SWAP case,
moves the remaining /proc/swaps code to swapfile.c and cleans up some
more MM code to compile fine without CONFIG_SWAP

fs/proc/proc_misc.c
include/linux/mm.h
include/linux/page-flags.h
include/linux/swap.h
kernel/sys.c
mm/Makefile
mm/mmap.c
mm/swapfile.c
mm/vmscan.c

index 7ab0958a7bd6471c6c29bb0733e9b64c95dffb45..8b6f9370d187b64b881cae3eaab03a739fccd048 100644 (file)
@@ -62,7 +62,6 @@ extern int get_filesystem_list(char *);
 extern int get_exec_domain_list(char *);
 extern int get_dma_list(char *);
 extern int get_locks_status (char *, char **, off_t, int);
-extern int get_swaparea_info (char *);
 #ifdef CONFIG_SGI_DS1286
 extern int get_ds1286_status(char *);
 #endif
@@ -296,18 +295,6 @@ static struct file_operations proc_partitions_operations = {
        .release        = seq_release,
 };
 
-extern struct seq_operations swaps_op;
-static int swaps_open(struct inode *inode, struct file *file)
-{
-       return seq_open(file, &swaps_op);
-}
-static struct file_operations proc_swaps_operations = {
-       .open           = swaps_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = seq_release,
-};
-
 #ifdef CONFIG_MODULES
 extern struct seq_operations modules_op;
 static int modules_open(struct inode *inode, struct file *file)
@@ -641,7 +628,6 @@ void __init proc_misc_init(void)
                entry->proc_fops = &proc_kmsg_operations;
        create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
        create_seq_entry("partitions", 0, &proc_partitions_operations);
-       create_seq_entry("swaps", 0, &proc_swaps_operations);
 #if !defined(CONFIG_ARCH_S390)
        create_seq_entry("interrupts", 0, &proc_interrupts_operations);
 #endif
index 961892ae28422a9008cbb01bfe7f07ad82ec66f6..bef2592920738ec3241e53898925500ca65f6a74 100644 (file)
@@ -444,9 +444,6 @@ extern void si_meminfo_node(struct sysinfo *val, int nid);
 #endif
 extern void swapin_readahead(swp_entry_t);
 
-extern int can_share_swap_page(struct page *);
-extern int remove_exclusive_swap_page(struct page *);
-
 /* mmap.c */
 extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
 extern void build_mmap_rb(struct mm_struct *);
index 9b3496e2aac54890579ef3c47d91c2c0deee0308..44480d80952fab344e0b271c97d27b811571f9d7 100644 (file)
@@ -237,8 +237,12 @@ extern void get_full_page_state(struct page_state *ret);
  * The PageSwapCache predicate doesn't use a PG_flag at this time,
  * but it may again do so one day.
  */
+#ifdef CONFIG_SWAP
 extern struct address_space swapper_space;
 #define PageSwapCache(page) ((page)->mapping == &swapper_space)
+#else
+#define PageSwapCache(page) 0
+#endif
 
 struct page;   /* forward declaration */
 
index 421e6a327fa21cc7fcd1455ccf18edf4f3fb7867..8ad50c284b45c419873689702586ba8bf13a8026 100644 (file)
@@ -1,11 +1,13 @@
 #ifndef _LINUX_SWAP_H
 #define _LINUX_SWAP_H
 
+#include <linux/config.h>
 #include <linux/spinlock.h>
 #include <linux/kdev_t.h>
 #include <linux/linkage.h>
 #include <linux/mmzone.h>
 #include <linux/list.h>
+#include <asm/atomic.h>
 #include <asm/page.h>
 
 #define SWAP_FLAG_PREFER       0x8000  /* set if swap priority specified */
  * bootbits...
  */
 union swap_header {
-       struct 
-       {
+       struct {
                char reserved[PAGE_SIZE - 10];
                char magic[10];                 /* SWAP-SPACE or SWAPSPACE2 */
        } magic;
-       struct 
-       {
+       struct {
                char         bootbits[1024];    /* Space for disklabel etc. */
                unsigned int version;
                unsigned int last_page;
@@ -62,6 +62,10 @@ typedef struct {
 
 #ifdef __KERNEL__
 
+struct sysinfo;
+struct address_space;
+struct zone;
+
 /*
  * A swap extent maps a range of a swapfile's PAGE_SIZE pages onto a range of
  * disk blocks.  A list of swap extents maps the entire swapfile.  (Where the
@@ -84,8 +88,6 @@ struct swap_extent {
 #define MAX_SWAP_BADPAGES \
        ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int))
 
-#include <asm/atomic.h>
-
 enum {
        SWP_USED        = (1 << 0),     /* is slot in swap_info[] used? */
        SWP_WRITEOK     = (1 << 1),     /* ok to write to this swap?    */
@@ -122,27 +124,40 @@ struct swap_info_struct {
        int next;                       /* next entry on swap list */
 };
 
-struct inode;
-extern int nr_swap_pages;
+struct swap_list_t {
+       int head;       /* head of priority-ordered swapfile list */
+       int next;       /* swapfile to be used next */
+};
 
 /* Swap 50% full? Release swapcache more aggressively.. */
 #define vm_swap_full() (nr_swap_pages*2 < total_swap_pages)
 
+/* linux/mm/page_alloc.c */
 extern unsigned long totalram_pages;
 extern unsigned long totalhigh_pages;
+extern int nr_swap_pages;      /* XXX: shouldn't this be ulong? --hch */
 extern unsigned int nr_free_pages(void);
-#ifdef CONFIG_NUMA
 extern unsigned int nr_free_pages_pgdat(pg_data_t *pgdat);
-#endif
 extern unsigned int nr_free_buffer_pages(void);
 extern unsigned int nr_free_pagecache_pages(void);
 
-/* Incomplete types for prototype declarations: */
-struct task_struct;
-struct vm_area_struct;
-struct sysinfo;
-struct address_space;
-struct zone;
+/* linux/mm/filemap.c */
+extern void FASTCALL(mark_page_accessed(struct page *));
+
+/* linux/mm/swap.c */
+extern void FASTCALL(lru_cache_add(struct page *));
+extern void FASTCALL(lru_cache_add_active(struct page *));
+extern void FASTCALL(activate_page(struct page *));
+extern void lru_add_drain(void);
+extern void swap_setup(void);
+
+/* linux/mm/vmscan.c */
+extern int try_to_free_pages(struct zone *, unsigned int, unsigned int);
+extern int shrink_all_memory(int);
+extern int vm_swappiness;
+
+/* linux/mm/oom_kill.c */
+extern void out_of_memory(void);
 
 /* linux/mm/rmap.c */
 extern int FASTCALL(page_referenced(struct page *));
@@ -157,43 +172,31 @@ extern int FASTCALL(page_over_rsslimit(struct page *));
 #define        SWAP_FAIL       2
 #define        SWAP_ERROR      3
 
-/* linux/mm/swap.c */
-extern void FASTCALL(lru_cache_add(struct page *));
-extern void FASTCALL(lru_cache_add_active(struct page *));
-extern void FASTCALL(activate_page(struct page *));
-void lru_add_drain(void);
-
-extern void swap_setup(void);
-
-/* linux/mm/vmscan.c */
-extern int try_to_free_pages(struct zone *, unsigned int, unsigned int);
-int shrink_all_memory(int nr_pages);
-extern int vm_swappiness;
+/* linux/mm/shmem.c */
+extern int shmem_unuse(swp_entry_t entry, struct page *page);
 
+#ifdef CONFIG_SWAP
 /* linux/mm/page_io.c */
-int swap_readpage(struct file *file, struct page *page);
-int swap_writepage(struct page *page);
-int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page);
-
-/* linux/mm/page_alloc.c */
+extern int swap_readpage(struct file *, struct page *);
+extern int swap_writepage(struct page *);
+extern int rw_swap_page_sync(int, swp_entry_t, struct page *);
 
 /* linux/mm/swap_state.c */
+extern struct address_space swapper_space;
+#define total_swapcache_pages  swapper_space.nrpages
 extern void show_swap_cache_info(void);
 extern int add_to_swap_cache(struct page *, swp_entry_t);
 extern int add_to_swap(struct page *);
-extern void __delete_from_swap_cache(struct page *page);
-extern void delete_from_swap_cache(struct page *page);
-extern int move_to_swap_cache(struct page *page, swp_entry_t entry);
-extern int move_from_swap_cache(struct page *page, unsigned long index,
-               struct address_space *mapping);
-extern void free_page_and_swap_cache(struct page *page);
-extern void free_pages_and_swap_cache(struct page **pages, int nr);
+extern void __delete_from_swap_cache(struct page *);
+extern void delete_from_swap_cache(struct page *);
+extern int move_to_swap_cache(struct page *, swp_entry_t);
+extern int move_from_swap_cache(struct page *, unsigned long,
+               struct address_space *);
+extern void free_page_and_swap_cache(struct page *);
+extern void free_pages_and_swap_cache(struct page **, int);
 extern struct page * lookup_swap_cache(swp_entry_t);
 extern struct page * read_swap_cache_async(swp_entry_t);
 
-/* linux/mm/oom_kill.c */
-extern void out_of_memory(void);
-
 /* linux/mm/swapfile.c */
 extern int total_swap_pages;
 extern unsigned int nr_swapfiles;
@@ -204,19 +207,12 @@ extern int swap_duplicate(swp_entry_t);
 extern int valid_swaphandles(swp_entry_t, unsigned long *);
 extern void swap_free(swp_entry_t);
 extern void free_swap_and_cache(swp_entry_t);
-sector_t map_swap_page(struct swap_info_struct *p, pgoff_t offset);
-struct swap_info_struct *get_swap_info_struct(unsigned type);
+extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t);
+extern struct swap_info_struct *get_swap_info_struct(unsigned);
+extern int can_share_swap_page(struct page *);
+extern int remove_exclusive_swap_page(struct page *);
 
-struct swap_list_t {
-       int head;       /* head of priority-ordered swapfile list */
-       int next;       /* swapfile to be used next */
-};
 extern struct swap_list_t swap_list;
-asmlinkage long sys_swapoff(const char *);
-asmlinkage long sys_swapon(const char *, int);
-
-extern void FASTCALL(mark_page_accessed(struct page *));
-
 extern spinlock_t swaplock;
 
 #define swap_list_lock()       spin_lock(&swaplock)
@@ -224,8 +220,39 @@ extern spinlock_t swaplock;
 #define swap_device_lock(p)    spin_lock(&p->sdev_lock)
 #define swap_device_unlock(p)  spin_unlock(&p->sdev_lock)
 
-extern int shmem_unuse(swp_entry_t entry, struct page *page);
-
+#else /* CONFIG_SWAP */
+
+#define total_swap_pages                       0
+#define total_swapcache_pages                  0UL
+
+#define si_swapinfo(val) \
+       do { (val)->freeswap = (val)->totalswap = 0; } while (0)
+#define free_page_and_swap_cache(page) \
+       page_cache_release(page)
+#define free_pages_and_swap_cache(pages, nr) \
+       release_pages((pages), (nr), 0);
+
+#define show_swap_cache_info()                 /*NOTHING*/
+#define free_swap_and_cache(swp)               /*NOTHING*/
+#define swap_duplicate(swp)                    /*NOTHING*/
+#define swap_free(swp)                         /*NOTHING*/
+#define read_swap_cache_async(swp)             NULL
+#define lookup_swap_cache(swp)                 NULL
+#define valid_swaphandles(swp, off)            0
+#define can_share_swap_page(p)                 0
+#define remove_exclusive_swap_page(p)          0
+#define move_to_swap_cache(p, swp)             1
+#define move_from_swap_cache(p, i, m)          1
+#define __delete_from_swap_cache(p)            /*NOTHING*/
+#define delete_from_swap_cache(p)              /*NOTHING*/
+
+static inline swp_entry_t get_swap_page(void)
+{
+       swp_entry_t entry;
+       entry.val = 0;
+       return entry;
+}
+
+#endif /* CONFIG_SWAP */
 #endif /* __KERNEL__*/
-
 #endif /* _LINUX_SWAP_H */
index 3c2992ac68f2fa9f9649405e473de476dd6ffcb3..22c1c93ec6da2373584ce0e9fa7382d6af2263db 100644 (file)
@@ -204,6 +204,8 @@ cond_syscall(sys_nfsservctl)
 cond_syscall(sys_quotactl)
 cond_syscall(sys_acct)
 cond_syscall(sys_lookup_dcookie)
+cond_syscall(sys_swapon)
+cond_syscall(sys_swapoff)
 
 static int set_one_prio(struct task_struct *p, int niceval, int error)
 {
index c2c873068a41a308a99fa53f300defa3cffc8b7f..060e761a3864eff5219db8e5ac0a75792e030b90 100644 (file)
@@ -5,10 +5,11 @@
 export-objs := shmem.o filemap.o mempool.o page_alloc.o page-writeback.o
 
 obj-y   := memory.o mmap.o filemap.o fremap.o mprotect.o mlock.o mremap.o \
-           vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \
-           page_alloc.o swap_state.o swapfile.o oom_kill.o \
-           shmem.o highmem.o mempool.o msync.o mincore.o readahead.o \
-           pdflush.o page-writeback.o rmap.o madvise.o vcache.o \
-           truncate.o
+           vmalloc.o slab.o bootmem.o swap.o vmscan.o page_alloc.o \
+           oom_kill.o shmem.o highmem.o mempool.o msync.o mincore.o \
+           readahead.o pdflush.o page-writeback.o rmap.o madvise.o \
+           vcache.o truncate.o
+
+obj-$(CONFIG_SWAP)     += page_io.o swap_state.o swapfile.o
 
 include $(TOPDIR)/Rules.make
index 472a9208bf91d8ae960d01b8314cc87001c6f06c..205ba003d746f0a5f4add658a8ed5c3d48070b8d 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -96,7 +96,7 @@ int vm_enough_memory(long pages)
                 * this compensates for the swap-space over-allocation
                 * (ie "nr_swap_pages" being too small).
                 */
-               free += swapper_space.nrpages;
+               free += total_swapcache_pages;
 
                /*
                 * The code below doesn't account for free space in the
index 628a97140a73044e28507a1fffb2c09511e688a0..16d0698c3b2b27f1707baf53d157437ca27edfbf 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/shm.h>
 #include <linux/blkdev.h>
 #include <linux/buffer_head.h>
+#include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 
 #include <asm/pgtable.h>
@@ -1121,12 +1122,35 @@ static int swap_show(struct seq_file *swap, void *v)
        return 0;
 }
 
-struct seq_operations swaps_op = {
+static struct seq_operations swaps_op = {
        .start =        swap_start,
        .next =         swap_next,
        .stop =         swap_stop,
        .show =         swap_show
 };
+
+static int swaps_open(struct inode *inode, struct file *file)
+{
+       return seq_open(file, &swaps_op);
+}
+
+static struct file_operations proc_swaps_operations = {
+       .open           = swaps_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
+static int __init procswaps_init(void)
+{
+       struct proc_dir_entry *entry;
+
+       entry = create_proc_entry("swaps", 0, NULL);
+       if (entry)
+               entry->proc_fops = &proc_swaps_operations;
+       return 0;
+}
+__initcall(procswaps_init);
 #endif /* CONFIG_PROC_FS */
 
 /*
index a2ae04f94ee747f3847bf70c69382aa4055ace0b..b0cd7ff6265e51a398cd8bb0941a92a1682bb2bb 100644 (file)
@@ -249,6 +249,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
 
                mapping = page->mapping;
 
+#ifdef CONFIG_SWAP
                /*
                 * Anonymous process memory without backing store. Try to
                 * allocate it some swap space here.
@@ -281,6 +282,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
                        }
                }
                pte_chain_unlock(page);
+#endif /* CONFIG_SWAP */
 
                /*
                 * FIXME: this is CPU-inefficient for shared mappings.
@@ -376,16 +378,21 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
                        goto keep_locked;
                }
 
+#ifdef CONFIG_SWAP
                if (PageSwapCache(page)) {
                        swp_entry_t swap = { .val = page->index };
                        __delete_from_swap_cache(page);
                        write_unlock(&mapping->page_lock);
                        swap_free(swap);
-               } else {
-                       __remove_from_page_cache(page);
-                       write_unlock(&mapping->page_lock);
+                       __put_page(page);       /* The pagecache ref */
+                       goto free_it;
                }
-               __put_page(page);       /* The pagecache ref */
+#endif /* CONFIG_SWAP */
+
+               __remove_from_page_cache(page);
+               write_unlock(&mapping->page_lock);
+               __put_page(page);
+
 free_it:
                unlock_page(page);
                ret++;