To answer Ged's worry, I don't think here people would get angry, since that 
spinlock is also used there: 
https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=LockQueueIoDatabaseLock
 (see iomgr/file.c and volume.c) .

-----Message d'origine-----
De : Ros-dev [mailto:ros-dev-boun...@reactos.org] De la part de Thomas Faber
Envoyé : mardi 29 décembre 2015 22:07
À : ReactOS Development List
Objet : Re: [ros-dev] [ros-diffs] [gedmurphy] 70408: [NTOSKRNL] - Raise the 
IRQL when enumerating device lists so it doesn't get edited mid-listing - Don't 
hardcode the pointer size when checking the buffer size

I think this might be an SP/MP difference?
Would make sense if KeAcquireSpinLock inside an SP kernel becomes KeRaiseIrql. 
But even for a 2003 MP kernel this would serve no purpose.


On 2015-12-29 21:48, Ged Murphy wrote:
> It depends on whether we want to emulate the 2k3 kernel or not.
> 
> I noticed in my 2k3 fltmgr testing that IoEnumerateDeviceObjectList 
> runs at DPC for the entirety of the function. This was changed in the 
> NT6 kernel to use a lock, which is indeed the LockQueueIoDatabaseLock Hermes 
> mentioned.
> 
> I'm happy to use the spinlock (and would prefer to myself), but any 
> move towards NT6 normally results in an angry email, so I opted for 
> the 2k3 approach  ;)
> 
> Ged.
> 
> 
> -----Original Message-----
> From: Ros-dev [mailto:ros-dev-boun...@reactos.org] On Behalf Of Hermès 
> BÉLUSCA - MAÏTO
> Sent: 29 December 2015 16:08
> To: 'ReactOS Development List' <ros-dev@reactos.org>
> Subject: Re: [ros-dev] [ros-diffs] [gedmurphy] 70408: [NTOSKRNL] - 
> Raise the IRQL when enumerating device lists so it doesn't get edited 
> mid-listing - Don't hardcode the pointer size when checking the buffer 
> size
> 
> Yes this should be a spinlock involved instead, for example the 
> "LockQueueIoDatabaseLock" (queued) spinlock that we already use in 
> other places in the code.
> 
> -----Message d'origine-----
> De : Ros-dev [mailto:ros-dev-boun...@reactos.org] De la part de Thomas 
> Faber Envoyé : mardi 29 décembre 2015 13:20 À : ros-dev@reactos.org Objet : 
> Re:
> [ros-dev] [ros-diffs] [gedmurphy] 70408: [NTOSKRNL] - Raise the IRQL 
> when enumerating device lists so it doesn't get edited mid-listing - 
> Don't hardcode the pointer size when checking the buffer size
> 
> Uhm... raising the IRQL is not a synchronization mechanism. Should 
> there be a spinlock involved?
> 
> 
> On 2015-12-23 12:26, gedmur...@svn.reactos.org wrote:
>> Author: gedmurphy
>> Date: Wed Dec 23 11:26:28 2015
>> New Revision: 70408
>>
>> URL: http://svn.reactos.org/svn/reactos?rev=70408&view=rev
>> Log:
>> [NTOSKRNL]
>> - Raise the IRQL when enumerating device lists so it doesn't get 
>> edited mid-listing
>> - Don't hardcode the pointer size when checking the buffer size
>>
>> Modified:
>>     trunk/reactos/ntoskrnl/io/iomgr/device.c
>>
>> Modified: trunk/reactos/ntoskrnl/io/iomgr/device.c
>> URL: 
>> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/de
>> v ice.c?rev=70408&r1=70407&r2=70408&view=diff
>>
> ======================================================================
> ======
> ==
>> --- trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] (original)
>> +++ trunk/reactos/ntoskrnl/io/iomgr/device.c [iso-8859-1] Wed Dec 23
> 11:26:28 2015
>> @@ -1088,6 +1088,10 @@
>>  {
>>      ULONG ActualDevices = 1;
>>      PDEVICE_OBJECT CurrentDevice = DriverObject->DeviceObject;
>> +    KIRQL OldIrql;
>> +
>> +    /* Raise to dispatch level */
>> +    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
>>  
>>      /* Find out how many devices we'll enumerate */
>>      while ((CurrentDevice = CurrentDevice->NextDevice))
>> ActualDevices++; @@ -1099,13 +1103,14 @@
>>      *ActualNumberDeviceObjects = ActualDevices;
>>  
>>      /* Check if we can support so many */
>> -    if ((ActualDevices * 4) > DeviceObjectListSize)
>> +    if ((ActualDevices * sizeof(PDEVICE_OBJECT)) >
>> + DeviceObjectListSize)
>>      {
>>          /* Fail because the buffer was too small */
>> +        KeLowerIrql(OldIrql);
>>          return STATUS_BUFFER_TOO_SMALL;
>>      }
>>  
>> -    /* Check if the caller only wanted the size */
>> +    /* Check if the caller wanted the device list */
>>      if (DeviceObjectList)
>>      {
>>          /* Loop through all the devices */ @@ -1123,6 +1128,9 @@
>>              DeviceObjectList++;
>>          }
>>      }
>> +
>> +    /* Return back to previous IRQL */
>> +    KeLowerIrql(OldIrql);
>>  
>>      /* Return the status */
>>      return STATUS_SUCCESS;
>>
>>


_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to