summaryrefslogtreecommitdiffstats
path: root/mm/swap_state.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
commit230e5ab6a084ed50470f101934782dbf54b0d06b (patch)
tree5dd821c8d33f450470588e7a543f74bf74306e9e /mm/swap_state.c
parentc9b1c8a64c6444d189856f1e26bdcb8b4cd0113a (diff)
Merge with Linux 2.1.67.
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r--mm/swap_state.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c
index e0cfe1fef..75f284124 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -18,9 +18,6 @@
#include <linux/swapctl.h>
#include <linux/init.h>
-#include <asm/dma.h>
-#include <asm/system.h> /* for cli()/sti() */
-#include <asm/uaccess.h> /* for cop_to/from_user */
#include <asm/bitops.h>
#include <asm/pgtable.h>
@@ -60,31 +57,47 @@ int add_to_swap_cache(struct page *page, unsigned long entry)
return 0;
}
+/*
+ * If swap_map[] reaches 127, the entries are treated as "permanent".
+ */
void swap_duplicate(unsigned long entry)
{
struct swap_info_struct * p;
unsigned long offset, type;
if (!entry)
- return;
- offset = SWP_OFFSET(entry);
+ goto out;
type = SWP_TYPE(entry);
if (type & SHM_SWP_TYPE)
- return;
- if (type >= nr_swapfiles) {
- printk("Trying to duplicate nonexistent swap-page\n");
- return;
- }
+ goto out;
+ if (type >= nr_swapfiles)
+ goto bad_file;
p = type + swap_info;
- if (offset >= p->max) {
- printk("swap_duplicate: weirdness\n");
- return;
- }
- if (!p->swap_map[offset]) {
- printk("swap_duplicate: trying to duplicate unused page\n");
- return;
+ offset = SWP_OFFSET(entry);
+ if (offset >= p->max)
+ goto bad_offset;
+ if (!p->swap_map[offset])
+ goto bad_unused;
+ if (p->swap_map[offset] < 126)
+ p->swap_map[offset]++;
+ else {
+ static int overflow = 0;
+ if (overflow++ < 5)
+ printk("swap_duplicate: entry %08lx map count=%d\n",
+ entry, p->swap_map[offset]);
+ p->swap_map[offset] = 127;
}
- p->swap_map[offset]++;
+out:
return;
+
+bad_file:
+ printk("swap_duplicate: Trying to duplicate nonexistent swap-page\n");
+ goto out;
+bad_offset:
+ printk("swap_duplicate: offset exceeds max\n");
+ goto out;
+bad_unused:
+ printk("swap_duplicate: unused page\n");
+ goto out;
}