[patch] show_buffers() resurrection

Andrea Arcangeli (andrea@suse.de)
Sun, 12 Sep 1999 02:50:32 +0200 (CEST)


With the buffer SMP threading show_buffers() is been removed from the
kernel. This patch will reinsert it. It's safe as it uses the trylock
type of spinlocks. I find it extremely useful to know what's going on in
the buffer layer.

Patch against 2.3.18ac1:

diff -urN 2.3.18ac1/arch/alpha/mm/init.c 2.3.18ac1-buffers/arch/alpha/mm/init.c
--- 2.3.18ac1/arch/alpha/mm/init.c Thu Aug 12 02:53:17 1999
+++ 2.3.18ac1-buffers/arch/alpha/mm/init.c Sun Sep 12 00:44:13 1999
@@ -166,6 +166,7 @@
printk("%ld pages shared\n",shared);
printk("%ld pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/arm/mm/init.c 2.3.18ac1-buffers/arch/arm/mm/init.c
--- 2.3.18ac1/arch/arm/mm/init.c Wed Sep 8 00:25:39 1999
+++ 2.3.18ac1-buffers/arch/arm/mm/init.c Sun Sep 12 00:43:49 1999
@@ -115,6 +115,7 @@
printk("%d free pages\n",free);
printk("%d reserved pages\n",reserved);
printk("%d pages shared\n",shared);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/i386/mm/init.c 2.3.18ac1-buffers/arch/i386/mm/init.c
--- 2.3.18ac1/arch/i386/mm/init.c Wed Sep 8 18:18:45 1999
+++ 2.3.18ac1-buffers/arch/i386/mm/init.c Sun Sep 12 00:43:26 1999
@@ -180,6 +180,7 @@
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/m68k/mm/init.c 2.3.18ac1-buffers/arch/m68k/mm/init.c
--- 2.3.18ac1/arch/m68k/mm/init.c Wed Sep 8 18:18:46 1999
+++ 2.3.18ac1-buffers/arch/m68k/mm/init.c Sun Sep 12 00:43:11 1999
@@ -112,6 +112,7 @@
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/mips/mm/init.c 2.3.18ac1-buffers/arch/mips/mm/init.c
--- 2.3.18ac1/arch/mips/mm/init.c Wed Sep 8 00:25:41 1999
+++ 2.3.18ac1-buffers/arch/mips/mm/init.c Sun Sep 12 00:42:53 1999
@@ -265,6 +265,7 @@
printk("%d pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
printk("%d free pages\n", free);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/ppc/mm/init.c 2.3.18ac1-buffers/arch/ppc/mm/init.c
--- 2.3.18ac1/arch/ppc/mm/init.c Sat Sep 11 02:47:53 1999
+++ 2.3.18ac1-buffers/arch/ppc/mm/init.c Sun Sep 12 00:42:25 1999
@@ -285,6 +285,7 @@
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%d pages in page table cache\n",(int)pgtable_cache_size);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/sparc/mm/init.c 2.3.18ac1-buffers/arch/sparc/mm/init.c
--- 2.3.18ac1/arch/sparc/mm/init.c Sat Sep 11 02:47:53 1999
+++ 2.3.18ac1-buffers/arch/sparc/mm/init.c Sun Sep 12 00:42:09 1999
@@ -106,6 +106,7 @@
printk("%ld page tables cached\n",pgtable_cache_size);
if (sparc_cpu_model == sun4m || sparc_cpu_model == sun4d)
printk("%ld page dirs cached\n", pgd_cache_size);
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/arch/sparc64/mm/init.c 2.3.18ac1-buffers/arch/sparc64/mm/init.c
--- 2.3.18ac1/arch/sparc64/mm/init.c Sat Sep 11 02:47:53 1999
+++ 2.3.18ac1-buffers/arch/sparc64/mm/init.c Sun Sep 12 00:41:53 1999
@@ -150,6 +150,7 @@
#ifndef __SMP__
printk("%d entries in page dir cache\n",pgd_cache_size);
#endif
+ show_buffers();
#ifdef CONFIG_NET
show_net_buffers();
#endif
diff -urN 2.3.18ac1/drivers/sgi/char/sgiserial.c 2.3.18ac1-buffers/drivers/sgi/char/sgiserial.c
--- 2.3.18ac1/drivers/sgi/char/sgiserial.c Wed Sep 8 00:26:00 1999
+++ 2.3.18ac1-buffers/drivers/sgi/char/sgiserial.c Sun Sep 12 00:41:26 1999
@@ -408,6 +408,7 @@
show_state();
return;
} else if (ch == 2) {
+ show_buffers();
return;
}
/* It is a 'keyboard interrupt' ;-) */
diff -urN 2.3.18ac1/fs/buffer.c 2.3.18ac1-buffers/fs/buffer.c
--- 2.3.18ac1/fs/buffer.c Sat Sep 11 16:33:32 1999
+++ 2.3.18ac1-buffers/fs/buffer.c Sun Sep 12 00:54:30 1999
@@ -2160,6 +2160,45 @@
goto out;
}

+/* ================== Debugging =================== */
+
+void show_buffers(void)
+{
+ struct buffer_head * bh;
+ int found = 0, locked = 0, dirty = 0, used = 0, lastused = 0;
+ int protected = 0;
+ int nlist;
+ static char *buf_types[NR_LIST] = { "CLEAN", "LOCKED", "DIRTY" };
+
+ printk("Buffer memory: %6dkB\n", atomic_read(&buffermem) >> 10);
+
+ if (!spin_trylock(&lru_list_lock))
+ return;
+ for(nlist = 0; nlist < NR_LIST; nlist++) {
+ found = locked = dirty = used = lastused = protected = 0;
+ bh = lru_list[nlist];
+ if(!bh) continue;
+
+ do {
+ found++;
+ if (buffer_locked(bh))
+ locked++;
+ if (buffer_protected(bh))
+ protected++;
+ if (buffer_dirty(bh))
+ dirty++;
+ if (atomic_read(&bh->b_count))
+ used++, lastused = found;
+ bh = bh->b_next_free;
+ } while (bh != lru_list[nlist]);
+ printk("%8s: %d buffers, %d used (last=%d), "
+ "%d locked, %d protected, %d dirty\n",
+ buf_types[nlist], found, used, lastused,
+ locked, protected, dirty);
+ }
+ spin_unlock(&lru_list_lock);
+}
+
/* ===================== Init ======================= */

/*
diff -urN 2.3.18ac1/include/linux/fs.h 2.3.18ac1-buffers/include/linux/fs.h
--- 2.3.18ac1/include/linux/fs.h Sun Sep 12 01:03:03 1999
+++ 2.3.18ac1-buffers/include/linux/fs.h Sun Sep 12 00:51:46 1999
@@ -937,6 +937,7 @@
unsigned long generate_cluster_swab32(kdev_t, int b[], int);
extern kdev_t ROOT_DEV;

+extern void show_buffers(void);
extern void mount_root(void);

#ifdef CONFIG_BLK_DEV_INITRD

Andrea

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/