From owner-svn-src-projects@FreeBSD.ORG Thu Aug 29 11:49:54 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id DD82E44E; Thu, 29 Aug 2013 11:49:53 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id CBCEA2FC6; Thu, 29 Aug 2013 11:49:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7TBnrZv081420; Thu, 29 Aug 2013 11:49:53 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7TBnrs3081418; Thu, 29 Aug 2013 11:49:53 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308291149.r7TBnrs3081418@svn.freebsd.org> From: Alexander Motin Date: Thu, 29 Aug 2013 11:49:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255019 - in projects/camlock/sys/cam: ata scsi X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Aug 2013 11:49:54 -0000 Author: mav Date: Thu Aug 29 11:49:53 2013 New Revision: 255019 URL: http://svnweb.freebsd.org/changeset/base/255019 Log: Drop periph (device) locks for da and ada drivers while submitting commands for execution. That substantially reduces these locks hold time, removing any measurable congestion. While GEOM guaranties that disk won't be closed before all requests completed, dropping lock in this place opens hypothetical race in case if last request manage to complete before submission call return. If periph will be destroyed at that point, it may cause user-after-free panic. To cover that case introduce additional per-periph reference counter to make close handler wait for all submission threads to get out before dropping periph reference and return. This change removes last measurable lock congestion inside CAM core on my test setup. The only congestion left is inside SIM between request submit and completion threads, but avoiding that requires SIM modification and depending on specific hardware may be problematic or impossible. On my present test setup this increases maximum IOPS from 673K to 724K. Modified: projects/camlock/sys/cam/ata/ata_da.c projects/camlock/sys/cam/scsi/scsi_da.c Modified: projects/camlock/sys/cam/ata/ata_da.c ============================================================================== --- projects/camlock/sys/cam/ata/ata_da.c Thu Aug 29 11:40:45 2013 (r255018) +++ projects/camlock/sys/cam/ata/ata_da.c Thu Aug 29 11:49:53 2013 (r255019) @@ -153,6 +153,7 @@ struct ada_softc { struct sysctl_oid *sysctl_tree; struct callout sendordered_c; struct trim_request trim_req; + int refcount; }; struct ada_quirk_entry { @@ -671,6 +672,8 @@ adaclose(struct disk *dp) softc->flags &= ~ADA_FLAG_OPEN; cam_periph_unhold(periph); + while (softc->refcount != 0) + cam_periph_sleep(periph, &softc->refcount, PRIBIO, "adaclose", 1); cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -1639,7 +1642,11 @@ adastart(struct cam_periph *periph, unio out: start_ccb->ccb_h.ccb_bp = bp; softc->outstanding_cmds++; + softc->refcount++; + cam_periph_unlock(periph); xpt_action(start_ccb); + cam_periph_lock(periph); + softc->refcount--; /* May have more work to do, so ensure we stay scheduled */ adaschedule(periph); Modified: projects/camlock/sys/cam/scsi/scsi_da.c ============================================================================== --- projects/camlock/sys/cam/scsi/scsi_da.c Thu Aug 29 11:40:45 2013 (r255018) +++ projects/camlock/sys/cam/scsi/scsi_da.c Thu Aug 29 11:49:53 2013 (r255019) @@ -228,6 +228,7 @@ struct da_softc { uint8_t unmap_buf[UNMAP_BUF_SIZE]; struct scsi_read_capacity_data_long rcaplong; struct callout mediapoll_c; + int refcount; }; #define dadeleteflag(softc, delete_method, enable) \ @@ -1321,6 +1322,8 @@ daclose(struct disk *dp) softc->flags &= ~DA_FLAG_OPEN; cam_periph_unhold(periph); + while (softc->refcount != 0) + cam_periph_sleep(periph, &softc->refcount, PRIBIO, "daclose", 1); cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -2313,7 +2316,11 @@ out: } start_ccb->ccb_h.ccb_bp = bp; + softc->refcount++; + cam_periph_unlock(periph); xpt_action(start_ccb); + cam_periph_lock(periph); + softc->refcount--; /* May have more work to do, so ensure we stay scheduled */ daschedule(periph);