On 05/28/2015 01:05 AM, Paolo Bonzini wrote:
> This is always available (with one exception in the auditing code).
> Later we will also use the role to look up the right memslots array.
> return;
> @@ -191,11 +191,15 @@ static void audit_write_protection(struct kvm *kvm, struct kvm_mmu_page *sp)
> unsigned long *rmapp;
> u64 *sptep;
> struct rmap_iterator iter;
> + struct kvm_memslots *slots;
> + struct kvm_memory_slot *slot;
>
> if (sp->role.direct || sp->unsync || sp->role.invalid)
> return;
>
> - rmapp = gfn_to_rmap(kvm, sp->gfn, PT_PAGE_TABLE_LEVEL);
> + slots = kvm_memslots(kvm);
> + slot = __gfn_to_memslot(slots, sp->gfn);
> + rmapp = __gfn_to_rmap(sp->gfn, PT_PAGE_TABLE_LEVEL, slot);
>
Why @sp is not available here?
On 09/06/2015 05:28, Xiao Guangrong wrote:
>>
>> - rmapp = gfn_to_rmap(kvm, sp->gfn, PT_PAGE_TABLE_LEVEL);
>> + slots = kvm_memslots(kvm);
>> + slot = __gfn_to_memslot(slots, sp->gfn);
>> + rmapp = __gfn_to_rmap(sp->gfn, PT_PAGE_TABLE_LEVEL, slot);
>>
>
> Why @sp is not available here?
Because the function forces the level to be PT_PAGE_TABLE_LEVEL rather
than sp->level.
Paolo
On 06/17/2015 04:15 PM, Paolo Bonzini wrote:
>
>
> On 09/06/2015 05:28, Xiao Guangrong wrote:
>>>
>>> - rmapp = gfn_to_rmap(kvm, sp->gfn, PT_PAGE_TABLE_LEVEL);
>>> + slots = kvm_memslots(kvm);
>>> + slot = __gfn_to_memslot(slots, sp->gfn);
>>> + rmapp = __gfn_to_rmap(sp->gfn, PT_PAGE_TABLE_LEVEL, slot);
>>>
>>
>> Why @sp is not available here?
>
> Because the function forces the level to be PT_PAGE_TABLE_LEVEL rather
> than sp->level.
Oh, right, thanks for your explanation. :)
Reviewed-by: Xiao Guangrong <[email protected]>