[ros-dev] ARM Guy Broke BOOT on Real Hardware
Alex Ionescu
ionucu at videotron.ca
Mon Jul 28 20:14:58 CEST 2008
On 28-Jul-08, at 8:23 AM, tamlin at algonet.se wrote:
> Alex wrote:
>
>> It looks like a guarded mutex is being acquired at DPC level. That's
>> pretty bad.
>
> Well, at least it's redundant and useless. :-)
Correct.
>
>
>> Pushlocks shouldn't be acquired at DPC level either
>
> Indeed. If "you" are at DPC level, you have but one synchronization to
> care about - SMP (i.e. CPU<->CPU).
Half-correct.
The bigger issue is that you can't do a wait at DPC level, because the
dispatcher itself runs at DPC level, so you'll basically deadlock by
yielding because nobody will run to schedule you somewhere else.
>
>
>> , but there's no
>> ASSERTs in the pushlock code that check for that.
>
> An oversight that should be fixed, I'm sure (even if it happened to
> slow down the system by a whole order of magnitude, which it won't).
Half-correct.
Pushlocks are meant to be inlined, so the ASSERT there is probably a
bad idea -- it could be added in the contended case, but that one
isn't hit often.
>
>
>> MMProbeAndLockPages should never be called for paged pool addreses
>> while at DPC level,
>
> Should MmProbeAndLock ever be called at IRQL above APC level? I mean,
> what if the probing fails? Should the paging executive somehow preempt
> this call and page in the missing pages (or should it simply throw a
> "page not present" exception - not too great to do at DPC level I'd
> say)?
Incorrect. If at DPC level, MmProbeAndLockPages graciously fails,
without raising an exception.
However, the behavior you describe about "page in the missing pages"
is what does happen, for paged-out pages (but of course, this
shouldn't happen while at DPC level).
>
>
>> which means the driver probably called it for a
>> non-paged pool address.
>
> If my previous suspicion is correct, I build on that and suspect this
> is an error in itself. The ProbeAndLock call should be done at APC
> level (though I may be completely wrong, but do read my finishing
> line).
Incorrect...
>
>
>> In that case, the whole loop about checking if the page is present
> and
>> then faulting it in is irrelevant, and won't happen.
>
> Right. Page fault at DPC level == Bad Move(tm).
Correct.
Don't forget that MmProbeAndLockPages also *Locks* pages.
The intended behavior of using this call at DPC level is to do just
that -- otherwise, another driver could de-allocate your allocation.
So it's still a very useful call, just don't make it page stuff in.
Arty's fix is a step in the right direction, but not fully correct...
now that I can finally build ReactOS thanks to Colin, I'll give a
bugfix a spin.
>
>
> --
> Mike
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev
Best regards,
Alex Ionescu
More information about the Ros-dev
mailing list