Messages in this thread Patch in this message |  | | Date | Mon, 2 Dec 1996 09:07:43 -0600 | From | Michael Elizabeth Chastain <> | Subject | Patch: speed up getname() |
| |
Hello hackers,
Here is a patch to speed up getname(), which is used by sys_open() and lots of other system calls that take file names. It speeds up sys_open() by about 20% on my system.
It's based on a suggestion from Linus Torvalds to have a single-page cache in order to avoid calling __get_free_page() and free_page() on every getname() and putname() pair.
I believe this code is correct and I'm running it on my system. I'd like some more people to try it out, especially on an SMP system with lots of concurrent accesses. Then I'll submit it for 2.1.X.
Regards,
Michael Chastain mec@shout.net
--- linux-2.1.13/fs/namei.c Mon Oct 28 12:21:41 1996 +++ linux/fs/namei.c Sun Dec 1 08:55:09 1996 @@ -48,25 +48,42 @@ return retval; } +/* + * This is a single page for faster getname. + * If the page is available when entering getname, use it. + * If the page is not available, call __get_free_page instead. + * This works even though do_getname can block (think about it). + * -- Michael Chastain, based on idea of Linus Torvalds, 1 Dec 1996. + */ +static unsigned long name_page_cache = 0; + int getname(const char * filename, char **result) { unsigned long page; int retval; - page = __get_free_page(GFP_KERNEL); - retval = -ENOMEM; - if (page) { - *result = (char *)page; - retval = do_getname(filename, (char *) page); - if (retval < 0) - free_page(page); + page = name_page_cache; + name_page_cache = 0; + if (!page) { + page = __get_free_page(GFP_KERNEL); + if (!page) + return -ENOMEM; } + + retval = do_getname(filename, (char *) page); + if (retval < 0) + putname( (char *) page ); + else + *result = (char *) page; return retval; } void putname(char * name) { - free_page((unsigned long) name); + if (name_page_cache == 0) + name_page_cache = (unsigned long) name; + else + free_page((unsigned long) name); } /*
|  |