From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andreas Dilger Subject: Re: ext3_group_sparse slow? Date: Wed, 12 Jan 2005 11:23:49 -0700 Message-ID: <20050112182349.GP8098@schnapps.adilger.int> References: <20050111144843.GG15061@atrey.karlin.mff.cuni.cz> <20050111183703.GE8098@schnapps.adilger.int> <20050112141841.GB25517@atrey.karlin.mff.cuni.cz> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="xTKfHyrFnSV9DG3y" Cc: linux-fsdevel@vger.kernel.org Return-path: Received: from H190.C26.B96.tor.eicat.ca ([66.96.26.190]:15746 "EHLO moraine.clusterfs.com") by vger.kernel.org with ESMTP id S261419AbVALUXf (ORCPT ); Wed, 12 Jan 2005 15:23:35 -0500 To: Jan Kara Content-Disposition: inline In-Reply-To: <20050112141841.GB25517@atrey.karlin.mff.cuni.cz> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org --xTKfHyrFnSV9DG3y Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Jan 12, 2005 15:18 +0100, Jan Kara wrote: > > On Jan 11, 2005 15:48 +0100, Jan Kara wrote: > > > I've been profiling dbench load on ext3 on my laptop and it looks as > > > follows: > > > CPU: CPU with timer interrupt, speed 0 MHz (estimated) > > > Profiling through timer interrupt > > > samples % symbol name > > > 6540 1.5141 ext3_group_sparse > > > 3615 0.8369 ext3_get_group_desc > >=20 > > The ext3_get_group_desc() code is using a div and mod, which may be > > what is slowing things down there. These could easily be changed to > > shift and mask. The ext3_group_desc struct is an on-disk struct and is= n't > > changing size any time soon (ever?) and is also a power of two in size. > > We already even have s_desc_per_block_bits... Totally untested patch: > >=20 > > --- 1.27/fs/ext3/balloc.c 2004-11-11 01:34:33 -07:00 > > +++ edited/fs/ext3/balloc.c 2005-01-11 11:04:55 -07:00 > > @@ -56,8 +56,8 @@ > > } > > smp_rmb(); > > =20 > > - group_desc =3D block_group / EXT3_DESC_PER_BLOCK(sb); > > - desc =3D block_group % EXT3_DESC_PER_BLOCK(sb); > > + group_desc =3D block_group >> EXT3_DESC_PER_BLOCK_BITS(sb); > > + desc =3D block_group & (EXT3_DESC_PER_BLOCK(sb) - 1); > > if (!EXT3_SB(sb)->s_group_desc[group_desc]) { > > ext3_error (sb, "ext3_get_group_desc", > > "Group descriptor not loaded - " > This looks OK. >=20 > > > ext3_group_sparse() > >=20 > > As for ext3_group_sparse() this code is very inefficient for large > > filesystems as it repeatedly does div and mod operations. Far better > > is to use an incremental method using multiplies > > I agree with the idea but would not be the following solution better? > It's simplier, you save the function call etc.. >=20 > --- linux-2.6.10.orig/fs/ext3/balloc.c 2005-01-05 17:19:33.000000000 +0100 > +++ linux-2.6.10-ext3speedup/fs/ext3/balloc.c 2005-01-12 13:07:48.0000000= 00 +0100 > @@ -1435,19 +1435,17 @@ > =20 > static inline int test_root(int a, int b) > { > - if (a =3D=3D 0) > - return 1; > - while (1) { > - if (a =3D=3D 1) > - return 1; > - if (a % b) > - return 0; > - a =3D a / b; > - } > + int num =3D b; > + > + while (a > num) > + num *=3D b; > + return num =3D=3D a; > } > =20 > int ext3_group_sparse(int group) > { > + if (group <=3D 1) > + return 1; > return (test_root(group, 3) || test_root(group, 5) || > test_root(group, 7)); > } >=20 > I profiled your first patch + the above one and ext3_group_sparse() > takes now 0.27% and ext3_get_group_desc() 0.33% which seems much better > :) If you agree I can submit it to Andrew. Sure, you can add my Signed-off-by: Andreas Dilger Cheers, Andreas -- Andreas Dilger http://sourceforge.net/projects/ext2resize/ http://members.shaw.ca/adilger/ http://members.shaw.ca/golinux/ --xTKfHyrFnSV9DG3y Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQFB5Ws1pIg59Q01vtYRAkp6AKCKTwI5huQUbP1NwCvCYG7CwcXgwACg8JRB w99bo0URTYInipKymqN/Jko= =s28Q -----END PGP SIGNATURE----- --xTKfHyrFnSV9DG3y--