]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: Skip Extent operations if Direct IO
authorJeffrey Altman <jaltman@your-file-system.com>
Mon, 2 Sep 2013 18:31:38 +0000 (14:31 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Tue, 3 Sep 2013 19:20:09 +0000 (12:20 -0700)
If the redirector is using Direct IO servicing there are no extents
in use.  Skip the AFSFlushExtents, AFSTearDownExtents, and related
calls unless extent processing is in use.  This will reduce lock
contention and reduce cpu processing.

Change-Id: I2948295bdd6056e6fbdab7d32c46575a8a7aebbc
Reviewed-on: http://gerrit.openafs.org/10215
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>
src/WINNT/afsrdr/kernel/lib/AFSClose.cpp
src/WINNT/afsrdr/kernel/lib/AFSFlushBuffers.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp

index 5ee30f1890f0208b2d69060cb52b172d419c9dc7..d290eee51b50d09330dc7514ad255d199aa2e296 100644 (file)
@@ -274,51 +274,60 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
 
                     SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
 
-                    //
-                    // Attempt to tear down our extent list for the file
-                    // If there are remaining dirty extents then attempt to
-                    // flush them as well
-                    //
+                   if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    if( pFcb->Specific.File.ExtentsDirtyCount)
-                    {
+                       //
+                       // Attempt to tear down our extent list for the file
+                       // If there are remaining dirty extents then attempt to
+                       // flush them as well
+                       //
 
-                        AFSFlushExtents( pFcb,
-                                         &pCcb->AuthGroup);
-                    }
+                       if( pFcb->Specific.File.ExtentsDirtyCount)
+                       {
 
-                    //
-                    // Wait for any outstanding queued flushes to complete
-                    //
+                           AFSFlushExtents( pFcb,
+                                            &pCcb->AuthGroup);
+                       }
 
-                    AFSWaitOnQueuedFlushes( pFcb);
+                       //
+                       // Wait for any outstanding queued flushes to complete
+                       //
 
-                    ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
-                            pFcb->Specific.File.QueuedFlushCount == 0);
+                       AFSWaitOnQueuedFlushes( pFcb);
 
-                    AFSReleaseResource( &pFcb->NPFcb->Resource);
+                       ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
+                               pFcb->Specific.File.QueuedFlushCount == 0);
 
-                    //
-                    // Tear 'em down, we'll not be needing them again
-                    //
+                       AFSReleaseResource( &pFcb->NPFcb->Resource);
 
-                    AFSTearDownFcbExtents( pFcb,
-                                           &pCcb->AuthGroup);
-                }
-                else
-                {
+                       //
+                       // Tear 'em down, we'll not be needing them again
+                       //
 
-                    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
-                        pFcb->Specific.File.ExtentsDirtyCount &&
-                        (pCcb->GrantedAccess & FILE_WRITE_DATA))
-                    {
+                       AFSTearDownFcbExtents( pFcb,
+                                              &pCcb->AuthGroup);
+                   }
+                   else
+                   {
 
-                        AFSFlushExtents( pFcb,
-                                         &pCcb->AuthGroup);
-                    }
+                       if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
+                           pFcb->Specific.File.ExtentsDirtyCount &&
+                           (pCcb->GrantedAccess & FILE_WRITE_DATA))
+                       {
 
-                    AFSReleaseResource( &pFcb->NPFcb->Resource);
-                }
+                           AFSFlushExtents( pFcb,
+                                            &pCcb->AuthGroup);
+                       }
+
+                       AFSReleaseResource( &pFcb->NPFcb->Resource);
+                   }
+               }
+               else
+               {
+
+                   AFSReleaseResource( &pFcb->NPFcb->Resource);
+               }
 
                 pDirCB = pCcb->DirectoryCB;
 
index 0e58603de70e89da23006436ddef20109b994817..524feec2b6c50c2fa529f7dcb7961ec7ed693105 100644 (file)
@@ -44,6 +44,7 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
 {
 
     UNREFERENCED_PARAMETER(LibDeviceObject);
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     NTSTATUS           ntStatus = STATUS_SUCCESS;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PFILE_OBJECT       pFileObject = pIrpSp->FileObject;
@@ -130,32 +131,36 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
             try_return( ntStatus = GetExceptionCode());
         }
 
-       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSFlushBuffers Releasing Fcb SectionObject lock %p SHARED %08lX\n",
-                      &pFcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread()));
+       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+       {
+
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSFlushBuffers Releasing Fcb SectionObject lock %p SHARED %08lX\n",
+                         &pFcb->NPFcb->SectionObjectResource,
+                         PsGetCurrentThread()));
 
-        AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+           AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
-        bReleaseSectionObject = FALSE;
+           bReleaseSectionObject = FALSE;
 
-        //
-        // Now, flush to the server - if there is stuff to do
-        //
+           //
+           // Now, flush to the server - if there is stuff to do
+           //
 
-        ntStatus = AFSFlushExtents( pFcb,
-                                    &pCcb->AuthGroup);
+           ntStatus = AFSFlushExtents( pFcb,
+                                       &pCcb->AuthGroup);
 
-        if( !NT_SUCCESS( ntStatus))
-        {
+           if( !NT_SUCCESS( ntStatus))
+           {
 
-            AFSReleaseExtentsWithFlush( pFcb,
-                                        &pCcb->AuthGroup,
-                                        TRUE);
+               AFSReleaseExtentsWithFlush( pFcb,
+                                           &pCcb->AuthGroup,
+                                           TRUE);
 
-            ntStatus = STATUS_SUCCESS;
-        }
+               ntStatus = STATUS_SUCCESS;
+           }
+       }
 
 try_exit:
 
index e623623d4a84dec7e2fc5d15c882b52afbe1e703..94fb9e177c8978047eb3946695be5ccef5958814 100644 (file)
@@ -1695,6 +1695,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
@@ -1967,14 +1968,18 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
                AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
 
-                //
-                // Clear out the extents
-                // Get rid of them (note this involves waiting
-                // for any writes or reads to the cache to complete)
-                //
+               if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
 
-                AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
-                                       NULL);
+                   //
+                   // Clear out the extents
+                   // Get rid of them (note this involves waiting
+                   // for any writes or reads to the cache to complete)
+                   //
+
+                   AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+                                          NULL);
+               }
             }
 
             (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
@@ -2917,6 +2922,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
     IO_STATUS_BLOCK stIoStatus;
@@ -3157,29 +3163,33 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
                     AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
-                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                 AFS_TRACE_LEVEL_VERBOSE,
-                                 "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
-                                 &pObjectInfo->Fcb->NPFcb->Resource,
-                                 PsGetCurrentThread()));
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                   AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
 
-                   AFSFlushExtents( pObjectInfo->Fcb,
-                                    AuthGroup);
+                       AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
 
-                    //
-                   // Acquire the Fcb to purge the cache
-                    //
+                       AFSFlushExtents( pObjectInfo->Fcb,
+                                        AuthGroup);
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->Resource,
-                                  PsGetCurrentThread()));
+                       //
+                       // Acquire the Fcb to purge the cache
+                       //
 
-                    AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
-                                    TRUE);
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                                       TRUE);
+                   }
 
                     //
                     // Update the metadata for the entry
@@ -4010,6 +4020,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LARGE_INTEGER liSystemTime;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSFcb *pCurrentFcb = NULL;
@@ -4343,8 +4354,12 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                    if ( bPurgeExtents &&
                         bSafeToPurge)
                    {
-                       AFSFlushExtents( pCurrentFcb,
-                                        AuthGroup);
+
+                       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                       {
+                           AFSFlushExtents( pCurrentFcb,
+                                            AuthGroup);
+                       }
                    }
                }
 
@@ -6992,70 +7007,81 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                //
-                // Wait for any currently running flush or release requests to complete
-                //
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+                   //
+                   // Wait for any currently running flush or release requests to complete
+                   //
 
-                AFSWaitOnQueuedFlushes( Fcb);
+                   AFSWaitOnQueuedFlushes( Fcb);
 
-                //
-                // Now perform another flush on the file
-                //
+                   //
+                   // Now perform another flush on the file
+                   //
 
-                if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                                  NULL)))
-                {
+                   if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                     NULL)))
+                   {
 
-                    AFSReleaseExtentsWithFlush( Fcb,
-                                                NULL,
-                                                TRUE);
-                }
-            }
+                       AFSReleaseExtentsWithFlush( Fcb,
+                                                   NULL,
+                                                   TRUE);
+                   }
+               }
+           }
 
-            if( Fcb->OpenReferenceCount == 0 ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-            {
+           if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+           {
 
-                AFSTearDownFcbExtents( Fcb,
-                                       NULL);
-            }
+               if( Fcb->OpenReferenceCount == 0 ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+               {
+
+                   AFSTearDownFcbExtents( Fcb,
+                                          NULL);
+               }
+           }
 
             try_return( ntStatus);
         }
 
         KeQueryTickCount( &liTime);
 
-        //
-        // First up are there dirty extents in the cache to flush?
-        //
+       if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+       {
+           //
+           // First up are there dirty extents in the cache to flush?
+           //
 
-        if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-            BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-        {
+           if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+               BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+           {
 
-            //
-            // The file has been marked as invalid.  Dump it
-            //
+               //
+               // The file has been marked as invalid.  Dump it
+               //
 
-            AFSTearDownFcbExtents( Fcb,
-                                   NULL);
-        }
-        else if( ForceFlush ||
-            ( ( Fcb->Specific.File.ExtentsDirtyCount ||
-                Fcb->Specific.File.ExtentCount) &&
-              (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
-                                                    >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
-        {
-            if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                              NULL)) &&
-                Fcb->OpenReferenceCount == 0)
-            {
+               AFSTearDownFcbExtents( Fcb,
+                                      NULL);
+           }
+           else if( ForceFlush ||
+                    ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+                        Fcb->Specific.File.ExtentCount) &&
+                      (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+                      >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+           {
 
-                AFSReleaseExtentsWithFlush( Fcb,
-                                            NULL,
-                                            TRUE);
-            }
+               if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                 NULL)) &&
+                   Fcb->OpenReferenceCount == 0)
+               {
+
+                   AFSReleaseExtentsWithFlush( Fcb,
+                                               NULL,
+                                               TRUE);
+               }
+           }
         }
 
         //
@@ -7174,16 +7200,20 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                if( Fcb->OpenReferenceCount <= 0)
-                {
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
 
-                    //
-                    // Tear em down we'll not be needing them again
-                    //
+                   if( Fcb->OpenReferenceCount <= 0)
+                   {
 
-                    AFSTearDownFcbExtents( Fcb,
-                                           NULL);
-                }
+                       //
+                       // Tear em down we'll not be needing them again
+                       //
+
+                       AFSTearDownFcbExtents( Fcb,
+                                              NULL);
+                   }
+               }
             }
             else
             {
@@ -9117,38 +9147,51 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
     __Enter
     {
 
-        switch( InvalidateReason)
+       switch( InvalidateReason)
         {
 
             case AFS_INVALIDATE_DELETED:
             {
 
-                if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+               AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+                             ObjectInfo->FileType,
+                             ObjectInfo->FileId.Cell,
+                             ObjectInfo->FileId.Volume,
+                             ObjectInfo->FileId.Vnode,
+                             ObjectInfo->FileId.Unique));
+
+               if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
                     ObjectInfo->Fcb != NULL)
                 {
 
-                    AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                    TRUE);
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    ObjectInfo->Links = 0;
+                       AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                       TRUE);
 
-                    ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+                       ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
 
-                    KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
-                                0,
-                                FALSE);
+                       KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+                                   0,
+                                   FALSE);
 
-                    //
-                    // Clear out the extents
-                    // And get rid of them (note this involves waiting
-                    // for any writes or reads to the cache to complete)
-                    //
+                       //
+                       // Clear out the extents
+                       // And get rid of them (note this involves waiting
+                       // for any writes or reads to the cache to complete)
+                       //
 
-                    AFSTearDownFcbExtents( ObjectInfo->Fcb,
-                                           NULL);
+                       AFSTearDownFcbExtents( ObjectInfo->Fcb,
+                                              NULL);
 
-                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
-                }
+                       AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+                   }
+               }
+
+               ObjectInfo->Links = 0;
 
                 break;
             }
index 31dc7de5104d53ce1208868b8807c3b8306396fc..f42860cf9d09e74b50c084e2ae3d27ab8612ecfe 100644 (file)
@@ -653,6 +653,7 @@ AFSWorkerThread( IN PVOID Context)
     AFSWorkItem *pWorkItem;
     BOOLEAN freeWorkItem = TRUE;
     AFSDeviceExt *pControlDevExt = NULL;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LONG lCount;
 
     pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
@@ -719,18 +720,21 @@ AFSWorkerThread( IN PVOID Context)
                     case AFS_WORK_FLUSH_FCB:
                     {
 
-                        ntStatus = AFSFlushExtents( pWorkItem->Specific.Fcb.Fcb,
-                                                    &pWorkItem->AuthGroup);
+                       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                       {
+                           ntStatus = AFSFlushExtents( pWorkItem->Specific.Fcb.Fcb,
+                                                       &pWorkItem->AuthGroup);
 
-                        if( !NT_SUCCESS( ntStatus))
-                        {
+                           if( !NT_SUCCESS( ntStatus))
+                           {
 
-                            AFSReleaseExtentsWithFlush( pWorkItem->Specific.Fcb.Fcb,
-                                                        &pWorkItem->AuthGroup,
-                                                        FALSE);
-                        }
+                               AFSReleaseExtentsWithFlush( pWorkItem->Specific.Fcb.Fcb,
+                                                           &pWorkItem->AuthGroup,
+                                                           FALSE);
+                           }
+                       }
 
-                        ASSERT( pWorkItem->Specific.Fcb.Fcb->OpenReferenceCount != 0);
+                       ASSERT( pWorkItem->Specific.Fcb.Fcb->OpenReferenceCount != 0);
 
                         lCount = InterlockedDecrement( &pWorkItem->Specific.Fcb.Fcb->OpenReferenceCount);