I was thinking that a VAD with the Committed flag set would be
entirely committed, so we could avoid all PTE checking. But I
guess the flag stays set, even if we decommit ranges inside it. In
that case it's clear that we need to check for decommitted pages.
Regarding your change, I see the issue now (I was misinterpreting
it before)
Your fix looks correct to me.
Timo
Am 21.02.2015 um 16:41 schrieb Jerome Gardou:
It is possible that the entire VAD range is not committed, so we
have to sweep over all the PTEs in the sub-range to check. If one
of the PTEs is zero AND the entire VAD is not marked as committed,
then we're sure that the range is not committed. Also, if the PTE
is marked as decommitted, same thing happen.
So, to check the PTEs, we have to make sure the underlying PDE is
there (== not paged out). Otherwise, by accessing a PTE, the CPU
might raise a page fault while we're holding the process working
set lock --> failed ASSERT.
Notice that if the PDE is zero, it's not faulted in and we check
for the VAD commit flag. (like we do for the PTEs later in the
loop iteration)
If I misunderstood something, I'd be happy to be given some hint
as why this patch is incorrect.
Regards
Jérôme
Le 20/02/2015 22:00, Timo Kreuzer a
écrit :
Why does the PDE need to be faulted in? The function is called
MiIsEntireRangeCommitted, not
MiCheckIfEntireRangeIsCommittedAndMakePdeValid.
I also wonder why one would even walk the PTEs if the VAD is
MEM_COMMIT.
Am 19.02.2015 um 11:19 schrieb Jérôme Gardou:
If it takes me 6 months to understand
why, then yes.
Hint: you can make this delay shorter.
Also the title is a bit misleading, it's the PDE that is not
faulted in
in case we don't terminate the loop iteration early.
Le 19/02/2015 05:46, Alex Ionescu a écrit :
it might fix an assert but the patch
is incorrect. will this also take 6
months to revert?
Best regards,
Alex Ionescu
On Tue, Feb 17, 2015 at 6:19 AM, <jgardou@svn.reactos.org>
wrote:
Author: jgardou
Date: Tue Feb 17 14:19:05 2015
New Revision: 66334
URL: http://svn.reactos.org/svn/reactos?rev=66334&view=rev
Log:
[NTOSKRNL/MM]
- MiIsEntireRangeCommitted: Ensure the PTE we are
checking is really
faulted in.
- Prefer MiPteToPde and MiPdeToPte (which should really
be called
MiFirstPteInPde) instead of MiAddressToPte and
MiPteToAddress
Fixes weird failed ASSERT in page fault handler when using
DPH.
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/virtual.c?rev=66334&r1=66333&r2=66334&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
[iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/virtual.c
[iso-8859-1] Tue Feb 17
14:19:05 2015
@@ -1994,14 +1994,13 @@
if (OnBoundary)
{
/* Is this PDE demand zero? */
- PointerPde = MiAddressToPte(PointerPte);
+ PointerPde = MiPteToPde(PointerPte);
if (PointerPde->u.Long != 0)
{
/* It isn't -- is it valid? */
if (PointerPde->u.Hard.Valid == 0)
{
/* Nope, fault it in */
- PointerPte =
MiPteToAddress(PointerPde);
MiMakeSystemAddressValid(PointerPte,
Process);
}
}
@@ -2009,13 +2008,13 @@
{
/* The PTE was already valid, so move to
the next one */
PointerPde++;
- PointerPte = MiPteToAddress(PointerPde);
+ PointerPte = MiPdeToPte(PointerPde);
/* Is the entire VAD committed? If not,
fail */
if (!Vad->u.VadFlags.MemCommit)
return FALSE;
- /* Everything is committed so far past
the range, return
true */
- if (PointerPte > LastPte) return TRUE;
+ /* New loop iteration with our new,
on-boundary PTE. */
+ continue;
}
}
_______________________________________________
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
_______________________________________________
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