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 *);
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
......
......@@ -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 *);
......
......@@ -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 */
......
#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 */
......@@ -36,13 +38,11 @@
* 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 */
......@@ -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)
{
......
......@@ -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
......@@ -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
......
......@@ -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 */
/*
......
......@@ -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 {
__put_page(page); /* The pagecache ref */
goto free_it;
}
#endif /* CONFIG_SWAP */
__remove_from_page_cache(page);
write_unlock(&mapping->page_lock);
}
__put_page(page); /* The pagecache ref */
__put_page(page);
free_it:
unlock_page(page);
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