Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Apr 2007 09:42:08 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-current@freebsd.org
Cc:        performance@freebsd.org, Robert Watson <rwatson@freebsd.org>, current@freebsd.org, Andrzej Tobola <ato@iem.pw.edu.pl>
Subject:   Re: filedesc_sx patch (20070401a)
Message-ID:  <200704040942.08839.hselasky@c2i.net>
In-Reply-To: <20070403175953.A25236@fledge.watson.org>
References:  <20070401155910.O75869@fledge.watson.org> <20070403175953.A25236@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 04 April 2007 00:01, Robert Watson wrote:
> On Sun, 1 Apr 2007, Robert Watson wrote:
> > The attached patch moves file descriptor locks from being a custom
> > mutex/sleep lock implemented using msleep() to an sx lock.  With the new
> > sx lock optimizations in place, this is now sensible, avoiding both a
> > custom lock type and significantly improving performance.  Kris has
> > reported 2x-4x improvement in transactions/sec with MySQL using this
> > patch, as it greatly reduces the cost of lock contention during file
> > descriptor lookup for threaded applications, and also moves to shared
> > locking to avoid exclusive acquisition for read-only operations (the vast
> > majority in most workloads). Patch is below, but you can also download
> > from:
> >
> >  http://www.watson.org/~robert/freebsd/netperf/20070401a-filedesc-sx.diff
> >
> > I'm currently waiting for the sx lock changes to settle for a few days
> > before committing, so will plan to commit this around Wednesday/Thursday
> > of this week (unless serious problems arise).
>
> Andrzej has pointed out that shortly after I posted the patch, it came into
> conflict with changes in VFS.  I've updated the patch and posted it at:
>
>    http://www.watson.org/~robert/freebsd/netperf/20070403-filedesc-sx.diff

Just a small comment:

@@ -60,10 +60,7 @@
 	u_short	fd_cmask;		/* mask for file creation */
 	u_short	fd_refcnt;		/* thread reference count */
 	u_short	fd_holdcnt;		/* hold count on structure + mutex */
-
-	struct	mtx fd_mtx;		/* protects members of this struct */
-	int	fd_locked;		/* long lock flag */
-	int	fd_wanted;		/* "" */
+	struct	sx fd_sx;		/* protects members of this struct */
 	struct	kqlist fd_kqlist;	/* list of kqueues on this filedesc */
 	int	fd_holdleaderscount;	/* block fdfree() for shared close() */
 	int	fd_holdleaderswakeup;	/* fdfree() needs wakeup */

Maybe it is better if you order the elements by size. Then you don't waste so 
many extra bytes on platforms where the fields must be aligned.

struct {
  struct sx fd_sx;
  struct kqlist fd_kqlist;

  int ...;

  u_short ....;
};

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704040942.08839.hselasky>