From owner-svn-src-projects@FreeBSD.ORG Tue Jan 29 07:40:55 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id B5574B75; Tue, 29 Jan 2013 07:40:55 +0000 (UTC) (envelope-from bryanv@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 90371D5F; Tue, 29 Jan 2013 07:40:55 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0T7etG5009093; Tue, 29 Jan 2013 07:40:55 GMT (envelope-from bryanv@svn.freebsd.org) Received: (from bryanv@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0T7etsJ009037; Tue, 29 Jan 2013 07:40:55 GMT (envelope-from bryanv@svn.freebsd.org) Message-Id: <201301290740.r0T7etsJ009037@svn.freebsd.org> From: Bryan Venteicher Date: Tue, 29 Jan 2013 07:40:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r246063 - projects/virtio/sys/dev/virtio/block 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: Tue, 29 Jan 2013 07:40:55 -0000 Author: bryanv Date: Tue Jan 29 07:40:54 2013 New Revision: 246063 URL: http://svnweb.freebsd.org/changeset/base/246063 Log: virtio_blk: Add support for write cache enable feature Later revisions of the VirtIO spec renamed the block flush feature to writecache-enable, and allowed the guest to set the caching mode to writeback or writethrough at init time. Approved by: grehan (implicit) Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.c projects/virtio/sys/dev/virtio/block/virtio_blk.h Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.c ============================================================================== --- projects/virtio/sys/dev/virtio/block/virtio_blk.c Tue Jan 29 07:36:32 2013 (r246062) +++ projects/virtio/sys/dev/virtio/block/virtio_blk.c Tue Jan 29 07:40:54 2013 (r246063) @@ -96,8 +96,9 @@ static struct virtio_feature_desc vtblk_ { VIRTIO_BLK_F_RO, "ReadOnly" }, { VIRTIO_BLK_F_BLK_SIZE, "BlockSize" }, { VIRTIO_BLK_F_SCSI, "SCSICmds" }, - { VIRTIO_BLK_F_FLUSH, "FlushCmd" }, + { VIRTIO_BLK_F_WCE, "WriteCache" }, { VIRTIO_BLK_F_TOPOLOGY, "Topology" }, + { VIRTIO_BLK_F_CONFIG_WCE, "ConfigWCE" }, { 0, NULL } }; @@ -124,6 +125,8 @@ static int vtblk_maximum_segments(struct struct virtio_blk_config *); static int vtblk_alloc_virtqueue(struct vtblk_softc *); static void vtblk_resize_disk(struct vtblk_softc *, uint64_t); +static int vtblk_write_cache_enabled(struct vtblk_softc *sc, + struct virtio_blk_config *); static void vtblk_alloc_disk(struct vtblk_softc *, struct virtio_blk_config *); static void vtblk_create_disk(struct vtblk_softc *); @@ -167,6 +170,8 @@ static void vtblk_finish_bio(struct bio /* Tunables. */ static int vtblk_no_ident = 0; TUNABLE_INT("hw.vtblk.no_ident", &vtblk_no_ident); +static int vtblk_write_cache = 1; +TUNABLE_INT("hw.vtblk.write_cache", &vtblk_write_cache); /* Features desired/implemented by this driver. */ #define VTBLK_FEATURES \ @@ -176,7 +181,8 @@ TUNABLE_INT("hw.vtblk.no_ident", &vtblk_ VIRTIO_BLK_F_GEOMETRY | \ VIRTIO_BLK_F_RO | \ VIRTIO_BLK_F_BLK_SIZE | \ - VIRTIO_BLK_F_FLUSH | \ + VIRTIO_BLK_F_WCE | \ + VIRTIO_BLK_F_CONFIG_WCE | \ VIRTIO_RING_F_INDIRECT_DESC) #define VTBLK_MTX(_sc) &(_sc)->vtblk_mtx @@ -630,6 +636,37 @@ vtblk_resize_disk(struct vtblk_softc *sc } } +static int +vtblk_write_cache_enabled(struct vtblk_softc *sc, + struct virtio_blk_config *blkcfg) +{ + device_t dev; + char buf[32]; + int wc; + + dev = sc->vtblk_dev; + + if (!virtio_with_feature(dev, VIRTIO_BLK_F_WCE)) + return (0); + if (!virtio_with_feature(dev, VIRTIO_BLK_F_CONFIG_WCE)) + return (1); + + wc = vtblk_write_cache; + snprintf(buf, sizeof(buf), "hw.vtblk.%d.write_cache", + device_get_unit(dev)); + TUNABLE_INT_FETCH(buf, &wc); + + if (wc != -1) { + /* Set either writeback or writethrough mode. */ + blkcfg->writeback = !!wc; + virtio_write_dev_config_1(dev, + offsetof(struct virtio_blk_config, writeback), + blkcfg->writeback); + } + + return (blkcfg->writeback); +} + static void vtblk_alloc_disk(struct vtblk_softc *sc, struct virtio_blk_config *blkcfg) { @@ -692,7 +729,7 @@ vtblk_alloc_disk(struct vtblk_softc *sc, blkcfg->topology.alignment_offset; } - if (virtio_with_feature(dev, VIRTIO_BLK_F_FLUSH)) + if (vtblk_write_cache_enabled(sc, blkcfg) != 0) dp->d_flags |= DISKFLAG_CANFLUSHCACHE; } @@ -911,6 +948,7 @@ vtblk_read_config(struct vtblk_softc *sc VTBLK_GET_CONFIG(dev, VIRTIO_BLK_F_GEOMETRY, geometry, blkcfg); VTBLK_GET_CONFIG(dev, VIRTIO_BLK_F_BLK_SIZE, blk_size, blkcfg); VTBLK_GET_CONFIG(dev, VIRTIO_BLK_F_TOPOLOGY, topology, blkcfg); + VTBLK_GET_CONFIG(dev, VIRTIO_BLK_F_CONFIG_WCE, writeback, blkcfg); } #undef VTBLK_GET_CONFIG Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.h ============================================================================== --- projects/virtio/sys/dev/virtio/block/virtio_blk.h Tue Jan 29 07:36:32 2013 (r246062) +++ projects/virtio/sys/dev/virtio/block/virtio_blk.h Tue Jan 29 07:40:54 2013 (r246063) @@ -39,8 +39,9 @@ #define VIRTIO_BLK_F_RO 0x0020 /* Disk is read-only */ #define VIRTIO_BLK_F_BLK_SIZE 0x0040 /* Block size of disk is available*/ #define VIRTIO_BLK_F_SCSI 0x0080 /* Supports scsi command passthru */ -#define VIRTIO_BLK_F_FLUSH 0x0200 /* Cache flush command support */ +#define VIRTIO_BLK_F_WCE 0x0200 /* Writeback mode enabled after reset */ #define VIRTIO_BLK_F_TOPOLOGY 0x0400 /* Topology information is available */ +#define VIRTIO_BLK_F_CONFIG_WCE 0x0800 /* Writeback mode available in config */ #define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ @@ -69,6 +70,9 @@ struct virtio_blk_config { uint16_t opt_io_size; } topology; + /* Writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ + uint8_t writeback; + } __packed; /*