Commit abcb2f16 authored by Christoph Hellwig's avatar Christoph Hellwig

[PATCH] make swap code conditional

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
parent 0a541971
...@@ -62,7 +62,6 @@ extern int get_filesystem_list(char *); ...@@ -62,7 +62,6 @@ extern int get_filesystem_list(char *);
extern int get_exec_domain_list(char *); extern int get_exec_domain_list(char *);
extern int get_dma_list(char *); extern int get_dma_list(char *);
extern int get_locks_status (char *, char **, off_t, int); extern int get_locks_status (char *, char **, off_t, int);
extern int get_swaparea_info (char *);
#ifdef CONFIG_SGI_DS1286 #ifdef CONFIG_SGI_DS1286
extern int get_ds1286_status(char *); extern int get_ds1286_status(char *);
#endif #endif
...@@ -296,18 +295,6 @@ static struct file_operations proc_partitions_operations = { ...@@ -296,18 +295,6 @@ static struct file_operations proc_partitions_operations = {
.release = seq_release, .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 #ifdef CONFIG_MODULES
extern struct seq_operations modules_op; extern struct seq_operations modules_op;
static int modules_open(struct inode *inode, struct file *file) static int modules_open(struct inode *inode, struct file *file)
...@@ -641,7 +628,6 @@ void __init proc_misc_init(void) ...@@ -641,7 +628,6 @@ void __init proc_misc_init(void)
entry->proc_fops = &proc_kmsg_operations; entry->proc_fops = &proc_kmsg_operations;
create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
create_seq_entry("partitions", 0, &proc_partitions_operations); create_seq_entry("partitions", 0, &proc_partitions_operations);
create_seq_entry("swaps", 0, &proc_swaps_operations);
#if !defined(CONFIG_ARCH_S390) #if !defined(CONFIG_ARCH_S390)
create_seq_entry("interrupts", 0, &proc_interrupts_operations); create_seq_entry("interrupts", 0, &proc_interrupts_operations);
#endif #endif
......
...@@ -444,9 +444,6 @@ extern void si_meminfo_node(struct sysinfo *val, int nid); ...@@ -444,9 +444,6 @@ extern void si_meminfo_node(struct sysinfo *val, int nid);
#endif #endif
extern void swapin_readahead(swp_entry_t); 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 */ /* mmap.c */
extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *); extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
extern void build_mmap_rb(struct mm_struct *); extern void build_mmap_rb(struct mm_struct *);
......
...@@ -237,8 +237,12 @@ extern void get_full_page_state(struct page_state *ret); ...@@ -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, * The PageSwapCache predicate doesn't use a PG_flag at this time,
* but it may again do so one day. * but it may again do so one day.
*/ */
#ifdef CONFIG_SWAP
extern struct address_space swapper_space; extern struct address_space swapper_space;
#define PageSwapCache(page) ((page)->mapping == &swapper_space) #define PageSwapCache(page) ((page)->mapping == &swapper_space)
#else
#define PageSwapCache(page) 0
#endif
struct page; /* forward declaration */ struct page; /* forward declaration */
......
#ifndef _LINUX_SWAP_H #ifndef _LINUX_SWAP_H
#define _LINUX_SWAP_H #define _LINUX_SWAP_H
#include <linux/config.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/kdev_t.h> #include <linux/kdev_t.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/mmzone.h> #include <linux/mmzone.h>
#include <linux/list.h> #include <linux/list.h>
#include <asm/atomic.h>
#include <asm/page.h> #include <asm/page.h>
#define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */
...@@ -36,13 +38,11 @@ ...@@ -36,13 +38,11 @@
* bootbits... * bootbits...
*/ */
union swap_header { union swap_header {
struct struct {
{
char reserved[PAGE_SIZE - 10]; char reserved[PAGE_SIZE - 10];
char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */ char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */
} magic; } magic;
struct struct {
{
char bootbits[1024]; /* Space for disklabel etc. */ char bootbits[1024]; /* Space for disklabel etc. */
unsigned int version; unsigned int version;
unsigned int last_page; unsigned int last_page;
...@@ -62,6 +62,10 @@ typedef struct { ...@@ -62,6 +62,10 @@ typedef struct {
#ifdef __KERNEL__ #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 * 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 * disk blocks. A list of swap extents maps the entire swapfile. (Where the
...@@ -84,8 +88,6 @@ struct swap_extent { ...@@ -84,8 +88,6 @@ struct swap_extent {
#define MAX_SWAP_BADPAGES \ #define MAX_SWAP_BADPAGES \
((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int)) ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int))
#include <asm/atomic.h>
enum { enum {
SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ SWP_USED = (1 << 0), /* is slot in swap_info[] used? */
SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */
...@@ -122,27 +124,40 @@ struct swap_info_struct { ...@@ -122,27 +124,40 @@ struct swap_info_struct {
int next; /* next entry on swap list */ int next; /* next entry on swap list */
}; };
struct inode; struct swap_list_t {
extern int nr_swap_pages; int head; /* head of priority-ordered swapfile list */
int next; /* swapfile to be used next */
};
/* Swap 50% full? Release swapcache more aggressively.. */ /* Swap 50% full? Release swapcache more aggressively.. */
#define vm_swap_full() (nr_swap_pages*2 < total_swap_pages) #define vm_swap_full() (nr_swap_pages*2 < total_swap_pages)
/* linux/mm/page_alloc.c */
extern unsigned long totalram_pages; extern unsigned long totalram_pages;
extern unsigned long totalhigh_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); extern unsigned int nr_free_pages(void);
#ifdef CONFIG_NUMA
extern unsigned int nr_free_pages_pgdat(pg_data_t *pgdat); 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_buffer_pages(void);
extern unsigned int nr_free_pagecache_pages(void); extern unsigned int nr_free_pagecache_pages(void);
/* Incomplete types for prototype declarations: */ /* linux/mm/filemap.c */
struct task_struct; extern void FASTCALL(mark_page_accessed(struct page *));
struct vm_area_struct;
struct sysinfo; /* linux/mm/swap.c */
struct address_space; extern void FASTCALL(lru_cache_add(struct page *));
struct zone; 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 */ /* linux/mm/rmap.c */
extern int FASTCALL(page_referenced(struct page *)); extern int FASTCALL(page_referenced(struct page *));
...@@ -157,43 +172,31 @@ extern int FASTCALL(page_over_rsslimit(struct page *)); ...@@ -157,43 +172,31 @@ extern int FASTCALL(page_over_rsslimit(struct page *));
#define SWAP_FAIL 2 #define SWAP_FAIL 2
#define SWAP_ERROR 3 #define SWAP_ERROR 3
/* linux/mm/swap.c */ /* linux/mm/shmem.c */
extern void FASTCALL(lru_cache_add(struct page *)); extern int shmem_unuse(swp_entry_t entry, struct page *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;
#ifdef CONFIG_SWAP
/* linux/mm/page_io.c */ /* linux/mm/page_io.c */
int swap_readpage(struct file *file, struct page *page); extern int swap_readpage(struct file *, struct page *);
int swap_writepage(struct page *page); extern int swap_writepage(struct page *);
int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page); extern int rw_swap_page_sync(int, swp_entry_t, struct page *);
/* linux/mm/page_alloc.c */
/* linux/mm/swap_state.c */ /* 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 void show_swap_cache_info(void);
extern int add_to_swap_cache(struct page *, swp_entry_t); extern int add_to_swap_cache(struct page *, swp_entry_t);
extern int add_to_swap(struct page *); extern int add_to_swap(struct page *);
extern void __delete_from_swap_cache(struct page *page); extern void __delete_from_swap_cache(struct page *);
extern void delete_from_swap_cache(struct page *page); extern void delete_from_swap_cache(struct page *);
extern int move_to_swap_cache(struct page *page, swp_entry_t entry); extern int move_to_swap_cache(struct page *, swp_entry_t);
extern int move_from_swap_cache(struct page *page, unsigned long index, extern int move_from_swap_cache(struct page *, unsigned long,
struct address_space *mapping); struct address_space *);
extern void free_page_and_swap_cache(struct page *page); extern void free_page_and_swap_cache(struct page *);
extern void free_pages_and_swap_cache(struct page **pages, int nr); extern void free_pages_and_swap_cache(struct page **, int);
extern struct page * lookup_swap_cache(swp_entry_t); extern struct page * lookup_swap_cache(swp_entry_t);
extern struct page * read_swap_cache_async(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 */ /* linux/mm/swapfile.c */
extern int total_swap_pages; extern int total_swap_pages;
extern unsigned int nr_swapfiles; extern unsigned int nr_swapfiles;
...@@ -204,19 +207,12 @@ extern int swap_duplicate(swp_entry_t); ...@@ -204,19 +207,12 @@ extern int swap_duplicate(swp_entry_t);
extern int valid_swaphandles(swp_entry_t, unsigned long *); extern int valid_swaphandles(swp_entry_t, unsigned long *);
extern void swap_free(swp_entry_t); extern void swap_free(swp_entry_t);
extern void free_swap_and_cache(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); extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t);
struct swap_info_struct *get_swap_info_struct(unsigned type); 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; 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; extern spinlock_t swaplock;
#define swap_list_lock() spin_lock(&swaplock) #define swap_list_lock() spin_lock(&swaplock)
...@@ -224,8 +220,39 @@ extern spinlock_t swaplock; ...@@ -224,8 +220,39 @@ extern spinlock_t swaplock;
#define swap_device_lock(p) spin_lock(&p->sdev_lock) #define swap_device_lock(p) spin_lock(&p->sdev_lock)
#define swap_device_unlock(p) spin_unlock(&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 /* __KERNEL__*/
#endif /* _LINUX_SWAP_H */ #endif /* _LINUX_SWAP_H */
...@@ -204,6 +204,8 @@ cond_syscall(sys_nfsservctl) ...@@ -204,6 +204,8 @@ cond_syscall(sys_nfsservctl)
cond_syscall(sys_quotactl) cond_syscall(sys_quotactl)
cond_syscall(sys_acct) cond_syscall(sys_acct)
cond_syscall(sys_lookup_dcookie) 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) static int set_one_prio(struct task_struct *p, int niceval, int error)
{ {
......
...@@ -5,10 +5,11 @@ ...@@ -5,10 +5,11 @@
export-objs := shmem.o filemap.o mempool.o page_alloc.o page-writeback.o 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 \ 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 \ vmalloc.o slab.o bootmem.o swap.o vmscan.o page_alloc.o \
page_alloc.o swap_state.o swapfile.o oom_kill.o \ oom_kill.o shmem.o highmem.o mempool.o msync.o mincore.o \
shmem.o highmem.o mempool.o msync.o mincore.o readahead.o \ readahead.o pdflush.o page-writeback.o rmap.o madvise.o \
pdflush.o page-writeback.o rmap.o madvise.o vcache.o \ vcache.o truncate.o
truncate.o
obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
...@@ -96,7 +96,7 @@ int vm_enough_memory(long pages) ...@@ -96,7 +96,7 @@ int vm_enough_memory(long pages)
* this compensates for the swap-space over-allocation * this compensates for the swap-space over-allocation
* (ie "nr_swap_pages" being too small). * (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 * The code below doesn't account for free space in the
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/shm.h> #include <linux/shm.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
...@@ -1121,12 +1122,35 @@ static int swap_show(struct seq_file *swap, void *v) ...@@ -1121,12 +1122,35 @@ static int swap_show(struct seq_file *swap, void *v)
return 0; return 0;
} }
struct seq_operations swaps_op = { static struct seq_operations swaps_op = {
.start = swap_start, .start = swap_start,
.next = swap_next, .next = swap_next,
.stop = swap_stop, .stop = swap_stop,
.show = swap_show .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 */ #endif /* CONFIG_PROC_FS */
/* /*
......
...@@ -249,6 +249,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask, ...@@ -249,6 +249,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
mapping = page->mapping; mapping = page->mapping;
#ifdef CONFIG_SWAP
/* /*
* Anonymous process memory without backing store. Try to * Anonymous process memory without backing store. Try to
* allocate it some swap space here. * allocate it some swap space here.
...@@ -281,6 +282,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask, ...@@ -281,6 +282,7 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
} }
} }
pte_chain_unlock(page); pte_chain_unlock(page);
#endif /* CONFIG_SWAP */
/* /*
* FIXME: this is CPU-inefficient for shared mappings. * FIXME: this is CPU-inefficient for shared mappings.
...@@ -376,16 +378,21 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask, ...@@ -376,16 +378,21 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
goto keep_locked; goto keep_locked;
} }
#ifdef CONFIG_SWAP
if (PageSwapCache(page)) { if (PageSwapCache(page)) {
swp_entry_t swap = { .val = page->index }; swp_entry_t swap = { .val = page->index };
__delete_from_swap_cache(page); __delete_from_swap_cache(page);
write_unlock(&mapping->page_lock); write_unlock(&mapping->page_lock);
swap_free(swap); swap_free(swap);
} else { __put_page(page); /* The pagecache ref */
goto free_it;
}
#endif /* CONFIG_SWAP */
__remove_from_page_cache(page); __remove_from_page_cache(page);
write_unlock(&mapping->page_lock); write_unlock(&mapping->page_lock);
} __put_page(page);
__put_page(page); /* The pagecache ref */
free_it: free_it:
unlock_page(page); unlock_page(page);
ret++; ret++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment