New CAM locking preview

Alexander Motin mav at FreeBSD.org
Fri Aug 16 06:51:27 UTC 2013


On 16.08.2013 04:12, Adrian Chadd wrote:
> Cool!
>
> I assume you've run this with full witness debugging enabled, to catch
> lock ordering issues?

Of course! I've endless times switched between debug and normal builds 
to test both correctness and performance after each change. But more 
external tests are welcome.

> This is great. I look forward to per-CPU, pinned, completion threads
> that I can do interesting things with (like schedule aio-sendfile
> completions..)
>
> On 15 August 2013 14:40, Alexander Motin <mav at freebsd.org
> <mailto:mav at freebsd.org>> wrote:
>
>     Hi.
>
>     Last weeks I've made substantial progress on my CAM locking work. In
>     fact, at this moment I think I've tied all loose ends good enough to
>     consider the new design viable and implementation worth further
>     testing and bug fixing. So I would like to ask for review of my work
>     from everybody who interested in CAM internals.
>
>     In short, my idea was to split single per-SIM lock, that creates
>     huge congestion under high IOPS, into several smaller ones. So
>     design I've finally chosen includes such locks:
>       1) New per-device (per-LUN) locks to protect state of the devices
>     and respective periphs. In most cases peripheral drivers just use
>     that lock instead of SIM lock used before, so code modification is
>     minimal and straightforward.
>       2) New per-target lock to protect list of LUNs fetched from the
>     device.
>       3) Old single per-SIM lock to protect SIM driver internals, but
>     only that. No parts of CAM itself use that lock. Keeping it for SIMs
>     allows to keep API and hopefully ABI compatibility. Reducing its
>     scope allows to reduce congestion.
>       4) New per-SIM lock to protect SIM and device command queues. That
>     allows execute queued commands from any context unrelated to other
>     locks. Also this lock serializes accesses to sim_action() method for
>     the most of commands, this allows to mostly avoid busy spilling on
>     SIM lock collision.
>       5) New per-bus locks to protect target, device and periphs
>     reference counters. It allows to create and destroy paths unrelated
>     to other locks in any possible context.
>
>     Numbers above also define supposed lock ordering: while holding
>     per-device lock 1) is allowed to request SIM lock 3), but not
>     backward. Cases where opposite is required (command completions and
>     async events) are handled via queuing events via several completion
>     threads. The rest of locks are self-contained and does not really
>     suppose cascading.
>
>     All these changes combined with GEOM direct dispatch (it will be
>     next separate project) allow to double system performance in disk
>     I/O microbenchmarks, comparing to present head, same as it was
>     announced on 2013-05 DevSummit:
>     http://people.freebsd.org/~__mav/camlock.pdf
>     <http://people.freebsd.org/~mav/camlock.pdf> . Tests without GEOM
>     changes also show performance improvement, but limited by heavy
>     bottleneck at the GEOM g_up/g_down threads at the level of 5-20%.
>
>     Project sources could be found at SVN projects/camlock branch:
>     http://svnweb.freebsd.org/__base/projects/camlock/
>     <http://svnweb.freebsd.org/base/projects/camlock/> . Many early
>     changes from that branch are already integrated to head, so to
>     simplify review the rest patches for changes before r254059 were
>     manually remade and could be found here:
>     http://people.freebsd.org/~__mav/camlock_patches/
>     <http://people.freebsd.org/~mav/camlock_patches/> .
>
>     These changes do not require controller driver modifications,
>     keeping KPIs and hopefully KBIs intact, but create base for later
>     work to use multiqueue capabilities of new controllers.
>
>     This work is sponsored by iXsystems, Inc.


-- 
Alexander Motin


More information about the freebsd-scsi mailing list