Commit 40a063f6 authored by Eric Sandeen's avatar Eric Sandeen Committed by Jan Kara

ext2: speed up file creates by optimizing rec_len functions

The addition of 64k block capability in the rec_len_from_disk
and rec_len_to_disk functions added a bit of math overhead which
slows down file create workloads needlessly when the architecture
cannot even support 64k blocks, thanks to page size limits.

The directory entry checking can also be optimized a bit
by sprinkling in some unlikely() conditions to move the
error handling out of line.

bonnie++ sequential file creates on a 512MB ramdisk speeds up
from about 2200/s to about 2500/s, about a 14% improvement.
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 156e7431
...@@ -28,21 +28,30 @@ ...@@ -28,21 +28,30 @@
typedef struct ext2_dir_entry_2 ext2_dirent; typedef struct ext2_dir_entry_2 ext2_dirent;
/*
* Tests against MAX_REC_LEN etc were put in place for 64k block
* sizes; if that is not possible on this arch, we can skip
* those tests and speed things up.
*/
static inline unsigned ext2_rec_len_from_disk(__le16 dlen) static inline unsigned ext2_rec_len_from_disk(__le16 dlen)
{ {
unsigned len = le16_to_cpu(dlen); unsigned len = le16_to_cpu(dlen);
#if (PAGE_CACHE_SIZE >= 65536)
if (len == EXT2_MAX_REC_LEN) if (len == EXT2_MAX_REC_LEN)
return 1 << 16; return 1 << 16;
#endif
return len; return len;
} }
static inline __le16 ext2_rec_len_to_disk(unsigned len) static inline __le16 ext2_rec_len_to_disk(unsigned len)
{ {
#if (PAGE_CACHE_SIZE >= 65536)
if (len == (1 << 16)) if (len == (1 << 16))
return cpu_to_le16(EXT2_MAX_REC_LEN); return cpu_to_le16(EXT2_MAX_REC_LEN);
else else
BUG_ON(len > (1 << 16)); BUG_ON(len > (1 << 16));
#endif
return cpu_to_le16(len); return cpu_to_le16(len);
} }
...@@ -129,15 +138,15 @@ static void ext2_check_page(struct page *page, int quiet) ...@@ -129,15 +138,15 @@ static void ext2_check_page(struct page *page, int quiet)
p = (ext2_dirent *)(kaddr + offs); p = (ext2_dirent *)(kaddr + offs);
rec_len = ext2_rec_len_from_disk(p->rec_len); rec_len = ext2_rec_len_from_disk(p->rec_len);
if (rec_len < EXT2_DIR_REC_LEN(1)) if (unlikely(rec_len < EXT2_DIR_REC_LEN(1)))
goto Eshort; goto Eshort;
if (rec_len & 3) if (unlikely(rec_len & 3))
goto Ealign; goto Ealign;
if (rec_len < EXT2_DIR_REC_LEN(p->name_len)) if (unlikely(rec_len < EXT2_DIR_REC_LEN(p->name_len)))
goto Enamelen; goto Enamelen;
if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1)) if (unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1)))
goto Espan; goto Espan;
if (le32_to_cpu(p->inode) > max_inumber) if (unlikely(le32_to_cpu(p->inode) > max_inumber))
goto Einumber; goto Einumber;
} }
if (offs != limit) if (offs != limit)
......
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