[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/3] Send BLKIF_OP_FLUSH_DISKCACHE
From: Owen Smith <owen.smith@xxxxxxxxxx> If the backend supports flush, send BLKIF_OP_FLUSH_DISKCACHE in response to SCSIOP_SYNCHRONIZE_CACHE, and advertise the cache to Windows. Also tracks count of cache operations. If the backend does not support flush, but supports barrier, send BLKIF_OP_WRITE_BARRIER instead, but do not advertise the cache to Windows, as its assumed the backend will guarantee writes are flushed if the storage requires flushing. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xenvbd/blockring.c | 1 + src/xenvbd/pdo.c | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c index e0275af..7cf5c84 100644 --- a/src/xenvbd/blockring.c +++ b/src/xenvbd/blockring.c @@ -211,6 +211,7 @@ __BlockRingInsert( break; case BLKIF_OP_WRITE_BARRIER: + case BLKIF_OP_FLUSH_DISKCACHE: req->operation = Request->Operation; req->nr_segments = 0; req->handle = (USHORT)BlockRing->DeviceId; diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c index 7e78ce4..3efe711 100644 --- a/src/xenvbd/pdo.c +++ b/src/xenvbd/pdo.c @@ -113,6 +113,7 @@ struct _XENVBD_PDO { ULONG BlkOpIndirectWrite; ULONG BlkOpBarrier; ULONG BlkOpDiscard; + ULONG BlkOpFlush; // Stats - Failures ULONG FailedMaps; ULONG FailedBounces; @@ -294,8 +295,8 @@ PdoDebugCallback( "PDO: BLKIF_OPs: INDIRECT_READ=%u INDIRECT_WRITE=%u\n", Pdo->BlkOpIndirectRead, Pdo->BlkOpIndirectWrite); XENBUS_DEBUG(Printf, DebugInterface, - "PDO: BLKIF_OPs: BARRIER=%u DISCARD=%u\n", - Pdo->BlkOpBarrier, Pdo->BlkOpDiscard); + "PDO: BLKIF_OPs: BARRIER=%u DISCARD=%u FLUSH=%u\n", + Pdo->BlkOpBarrier, Pdo->BlkOpDiscard, Pdo->BlkOpFlush); XENBUS_DEBUG(Printf, DebugInterface, "PDO: Failed: Maps=%u Bounces=%u Grants=%u\n", Pdo->FailedMaps, Pdo->FailedBounces, Pdo->FailedGrants); @@ -316,7 +317,7 @@ PdoDebugCallback( Pdo->BlkOpRead = Pdo->BlkOpWrite = 0; Pdo->BlkOpIndirectRead = Pdo->BlkOpIndirectWrite = 0; - Pdo->BlkOpBarrier = Pdo->BlkOpDiscard = 0; + Pdo->BlkOpBarrier = Pdo->BlkOpDiscard = Pdo->BlkOpFlush = 0; Pdo->FailedMaps = Pdo->FailedBounces = Pdo->FailedGrants = 0; Pdo->SegsGranted = Pdo->SegsBounced = 0; } @@ -755,6 +756,9 @@ __PdoIncBlkifOpCount( case BLKIF_OP_DISCARD: ++Pdo->BlkOpDiscard; break; + case BLKIF_OP_FLUSH_DISKCACHE: + ++Pdo->BlkOpFlush; + break; default: ASSERT(FALSE); break; @@ -1222,7 +1226,13 @@ PrepareSyncCache( PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb); PXENVBD_REQUEST Request; LIST_ENTRY List; + UCHAR Operation; + if (FrontendGetDiskInfo(Pdo->Frontend)->FlushCache) + Operation = BLKIF_OP_FLUSH_DISKCACHE; + else + Operation = BLKIF_OP_WRITE_BARRIER; + InitializeListHead(&List); SrbExt->Count = 0; Srb->SrbStatus = SRB_STATUS_PENDING; @@ -1233,7 +1243,7 @@ PrepareSyncCache( InsertTailList(&List, &Request->Entry); Request->Srb = Srb; - Request->Operation = BLKIF_OP_WRITE_BARRIER; + Request->Operation = Operation; Request->FirstSector = Cdb_LogicalBlock(Srb); SrbExt->Count = PdoQueueRequestList(Pdo, &List); @@ -1722,8 +1732,9 @@ PdoSyncCache( return TRUE; } - if (FrontendGetDiskInfo(Pdo->Frontend)->Barrier == FALSE) { - Trace("Target[%d] : BARRIER not supported, suppressing\n", PdoGetTargetId(Pdo)); + if (FrontendGetDiskInfo(Pdo->Frontend)->FlushCache == FALSE && + FrontendGetDiskInfo(Pdo->Frontend)->Barrier == FALSE) { + Trace("Target[%d] : FLUSH and BARRIER not supported, suppressing\n", PdoGetTargetId(Pdo)); Srb->ScsiStatus = 0x00; // SCSI_GOOD Srb->SrbStatus = SRB_STATUS_SUCCESS; return TRUE; @@ -1826,7 +1837,7 @@ PdoModeSense( Caching->PageLength = MODE_CACHING_PAGE_LENGTH; Caching->ReadDisableCache = 0; Caching->MultiplicationFactor = 0; - Caching->WriteCacheEnable = 0; + Caching->WriteCacheEnable = FrontendGetDiskInfo(Pdo->Frontend)->FlushCache ? 1 : 0; Caching->WriteRetensionPriority = 0; Caching->ReadRetensionPriority = 0; Caching->DisablePrefetchTransfer[0] = 0; -- 2.8.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |