linux-8086.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Juan Perez-Sanchez <lithoxs@gmail.com>
To: linux-8086 <linux-8086@vger.kernel.org>
Cc: Jody Bruchon <jody@jodybruchon.com>
Subject: [PATCH 3 of 6]
Date: Sun, 17 Mar 2013 13:09:58 -0600	[thread overview]
Message-ID: <CAD6VGuYPJ4paa=yieen8eJ4dZP=Jx+uXxL+vS2u+gojA5-6+hw@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 775 bytes --]

Hi,

 General optimization of fs/inode.c code. Changed the role of variable
"first_inode", changed the direction of walking through the inode list
 depending in the intended operation, prefer the use of pointers over
array indexing, use do {}while() loops when possible (which bcc
"prefers"). The changes reduce both code size and processing time and
were tested copying a lot of files running elks under qemu, checking
the integrity of the copied files and running fsck for the modified
filesystem under linux.

2. A small optimization in file fs/minix/file.c, function minix_file_read().

3. Code size reduced by 192 bytes.

 The Image builded without errors. The kernel was tested with QEMU and
dioscuri emulators. Also in a PPro pc booting from floppy.

Greetings,

Juan

[-- Attachment #2: elksW.patch --]
[-- Type: application/octet-stream, Size: 7407 bytes --]

diff -Nur elks.orig/fs/inode.c elks/fs/inode.c
--- elks.orig/fs/inode.c	2012-10-24 12:47:08.000000000 -0500
+++ elks/fs/inode.c	2013-02-15 17:45:38.000000000 -0600
@@ -24,43 +24,36 @@
 static struct inode inode_block[NR_INODE];
 static struct inode *first_inode;
 static struct wait_queue inode_wait;
-static int nr_inodes = 0;
-static int nr_free_inodes = 0;
+static int nr_free_inodes;
 
 static void insert_inode_free(register struct inode *inode)
 {
     register struct inode *in = first_inode;
-    inode->i_next = in;
-    inode->i_prev = in->i_prev;
-    in->i_prev = inode;
-    inode->i_prev->i_next = inode;
-    first_inode = inode;
+
+    inode->i_prev = in;
+    (inode->i_next = in->i_next)->i_prev = inode;
+    in->i_next = inode;
 }
 
 static void remove_inode_free(register struct inode *inode)
 {
-    register struct inode *in;
     if (first_inode == inode)
-	first_inode = first_inode->i_next;
-    inode->i_next->i_prev = inode->i_prev;
-	inode->i_prev->i_next = inode->i_next;
-    inode->i_next = inode->i_prev = NULL;
+        first_inode = inode->i_prev;
+    (inode->i_next->i_prev = inode->i_prev)->i_next = inode->i_next;
 }
 
 static void put_last_free(register struct inode *inode)
 {
     remove_inode_free(inode);
-    inode->i_next = first_inode;
-	inode->i_prev = first_inode->i_prev;
-	inode->i_prev->i_next = inode;
-    inode->i_next->i_prev = inode;
+    insert_inode_free(inode);
+    first_inode = inode;
 }
 
 void inode_init(void)
 {
     register struct inode *inode = inode_block;
 
-    nr_inodes = nr_free_inodes = NR_INODE;
+    nr_free_inodes = NR_INODE;
     first_inode = inode->i_next = inode->i_prev = inode;
     do {
 	insert_inode_free(++inode);
@@ -119,36 +112,31 @@
 
 int fs_may_mount(kdev_t dev)
 {
-    register struct inode *inode, *next;
-    int i;
+    register struct inode *next;
+    register struct inode *inode = first_inode;
 
-    next = first_inode;
-    i = nr_inodes;
     do {
-	inode = next;
-	next = inode->i_next;	/* clear_inode() changes the queues.. */
+        next = inode->i_prev;	/* clear_inode() changes the queues.. */
 	if (inode->i_dev != dev)
 	    continue;
 	if (inode->i_count || inode->i_dirt || inode->i_lock)
 	    return 0;
 	clear_inode(inode);
-    } while(--i);
+    } while((inode = next) != first_inode);
     return 1;
 }
 
 int fs_may_umount(kdev_t dev, register struct inode *mount_rooti)
 {
-    register struct inode *inode;
-    int i;
+    register struct inode *inode = first_inode;
 
-    inode = first_inode;
-    for (i = nr_inodes; i > 0; i--, inode = inode->i_next) {
+    do {
 	if (inode->i_dev != dev || !inode->i_count)
 	    continue;
 	if (inode == mount_rooti && inode->i_count == 1)
 	    continue;
 	return 0;
-    }
+    } while((inode = inode->i_prev) != first_inode);
     return 1;
 }
 
@@ -188,7 +176,7 @@
 
 static void read_inode(register struct inode *inode)
 {
-    register struct super_block *sb = inode->i_sb;
+    struct super_block *sb = inode->i_sb;
     register struct super_operations *sop = sb->s_op;
 
     lock_inode(inode);
@@ -300,14 +288,11 @@
 
 void invalidate_inodes(kdev_t dev)
 {
-    register struct inode *inode, *next;
-    int i;
+    register struct inode *next;
+    register struct inode *inode = first_inode;
 
-    next = first_inode;
-    i = nr_inodes;
     do {
-	inode = next;
-	next = inode->i_next;	/* clear_inode() changes the queues.. */
+        next = inode->i_prev;	/* clear_inode() changes the queues.. */
 	if (inode->i_dev != dev)
 	    continue;
 	if (inode->i_count || inode->i_dirt || inode->i_lock) {
@@ -315,22 +300,20 @@
 	    continue;
 	}
 	clear_inode(inode);
-    } while(--i);
+    } while((inode = next) != first_inode);
 }
 
 void sync_inodes(kdev_t dev)
 {
-    register struct inode *inode;
-    register char *pi;
+    register struct inode *inode = first_inode;
 
-    inode = first_inode;
-    for (pi = 0; ((int) pi) < nr_inodes * 2; pi++, inode = inode->i_next) {
+    do {
 	if (dev && inode->i_dev != dev)
 	    continue;
 	wait_on_inode(inode);
 	if (inode->i_dirt)
 	    write_inode(inode);
-    }
+    } while((inode = inode->i_prev) != first_inode);
 }
 
 void iput(register struct inode *inode)
@@ -383,35 +366,38 @@
 
 static void list_inode_status(void)
 {
-    register char * pi;
+    register char *pi = 0;
+    register struct inode *inode = first_inode;
 
-    for (pi = 0; ((int)pi) < nr_inodes; pi++)
-	printk("[#%u: c=%u d=%x nr=%lu]",
-	       ((int)pi), inode_block[(int)pi].i_count,
-	       inode_block[(int)pi].i_dev, inode_block[(int)pi].i_ino);
+    do {
+        printk("[#%u: c=%u d=%x nr=%lu]",
+	       ((int)(pi++)), inode->i_count,
+	       inode->i_dev, inode->i_ino);
+    } while((inode = inode->i_prev) != first_inode);
 }
 
 struct inode *get_empty_inode(void)
 {
     static ino_t ino = 0;
-    register struct inode *inode, *best;
-    int i;
+    register struct inode *inode;
+    register struct inode *best;
 
-  repeat:
-    inode = first_inode;
     best = 0;
-    for (inode = inode_block, i = 0; i < nr_inodes; inode++, i++) {
-	if (!inode->i_count && !inode->i_lock && !inode->i_dirt) {
-	    best = inode;
-	    break;
-	}
-    }
-    if (!best) {
-	printk("VFS: No free inodes - contact somebody other than Linus\n");
-	list_inode_status();
-	sleep_on(&inode_wait);
-	goto repeat;
-    }
+    goto startl;
+    do {
+        printk("VFS: No free inodes - contact somebody other than Linus\n");
+        list_inode_status();
+        sleep_on(&inode_wait);
+  startl:
+        inode = first_inode->i_next;
+        do {
+            if (!inode->i_count && !inode->i_lock && !inode->i_dirt) {
+                best = inode;
+                break;
+            }
+        } while((inode = inode->i_next) != first_inode->i_next);
+    } while(!best);
+
 /* Here we are doing the same checks again. There cannot be a significant *
  * race condition here - no time has passed */
 #if 0
@@ -477,28 +463,25 @@
 struct inode *__iget(register struct super_block *sb,
 		     ino_t inr /*,int crossmntp */ )
 {
-    int i;
     register struct inode *inode;
-    register struct inode *empty = NULL;
+    struct inode *empty = NULL;
 
     debug3("iget called(%x, %d, %d)\n", sb, inr, 0 /* crossmntp */ );
     if (!sb)
 	panic("VFS: iget with sb==NULL");
   repeat:
-    inode = inode_block;
-    for (i = NR_INODE; i; i--, inode++) {
+    inode = first_inode;
+    do {
 	if (inode->i_dev == sb->s_dev && inode->i_ino == inr) {
 	    goto found_it;
 	}
-    }
+    } while((inode = inode->i_prev) != first_inode);
 
     if (!empty) {
 	debug("iget: getting an empty inode...\n");
 	empty = get_empty_inode();
 	debug1("iget: got one... (%x)!\n", empty);
-	if (empty)
-	    goto repeat;
-	return NULL;
+        goto repeat;
     }
     inode = empty;
     inode->i_sb = sb;
diff -Nur elks.orig/fs/minix/file.c elks/fs/minix/file.c
--- elks.orig/fs/minix/file.c	2013-02-13 16:04:28.000000000 -0600
+++ elks/fs/minix/file.c	2013-02-15 14:45:15.000000000 -0600
@@ -86,7 +86,6 @@
 static int minix_file_read(struct inode *inode, register struct file *filp,
 			    char *buf, size_t count)
 {
-    struct buffer_head *bh;
     loff_t offset;
     size_t chars;
     int read = 0;
@@ -117,6 +116,7 @@
         count = (size_t)offset;
 
     while (count > 0) {
+        register struct buffer_head *bh;
     /*
      *      Block, offset pair from the byte offset
      */

                 reply	other threads:[~2013-03-17 19:09 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAD6VGuYPJ4paa=yieen8eJ4dZP=Jx+uXxL+vS2u+gojA5-6+hw@mail.gmail.com' \
    --to=lithoxs@gmail.com \
    --cc=jody@jodybruchon.com \
    --cc=linux-8086@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).