Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1600519 > unrolled thread
| Started by | Suzuki K Poulose <suzuki.poulose@arm.com> |
|---|---|
| First post | 2017-03-14 16:00 +0100 |
| Last post | 2017-03-15 14:40 +0100 |
| Articles | 5 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm Suzuki K Poulose <suzuki.poulose@arm.com> - 2017-03-14 16:00 +0100
Re: [PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm Christoffer Dall <cdall@linaro.org> - 2017-03-15 10:20 +0100
Re: [PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm Marc Zyngier <marc.zyngier@arm.com> - 2017-03-15 10:40 +0100
Re: [PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm Christoffer Dall <cdall@linaro.org> - 2017-03-15 12:10 +0100
Re: [PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm Paolo Bonzini <pbonzini@redhat.com> - 2017-03-15 14:40 +0100
| From | Suzuki K Poulose <suzuki.poulose@arm.com> |
|---|---|
| Date | 2017-03-14 16:00 +0100 |
| Subject | [PATCH 1/3] kvm: arm/arm64: Take mmap_sem in stage2_unmap_vm |
| Message-ID | <tkW5z-1Ad-5@gated-at.bofh.it> |
From: Marc Zyngier <marc.zyngier@arm.com>
We don't hold the mmap_sem while searching for the VMAs when
we try to unmap each memslot for a VM. Fix this properly to
avoid unexpected results.
Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm")
Cc: stable@vger.kernel.org # v3.19+
Cc: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
---
arch/arm/kvm/mmu.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 962616f..f2e2e0c 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -803,6 +803,7 @@ void stage2_unmap_vm(struct kvm *kvm)
int idx;
idx = srcu_read_lock(&kvm->srcu);
+ down_read(¤t->mm->mmap_sem);
spin_lock(&kvm->mmu_lock);
slots = kvm_memslots(kvm);
@@ -810,6 +811,7 @@ void stage2_unmap_vm(struct kvm *kvm)
stage2_unmap_memslot(kvm, memslot);
spin_unlock(&kvm->mmu_lock);
+ up_read(¤t->mm->mmap_sem);
srcu_read_unlock(&kvm->srcu, idx);
}
--
2.7.4
[toc] | [next] | [standalone]
| From | Christoffer Dall <cdall@linaro.org> |
|---|---|
| Date | 2017-03-15 10:20 +0100 |
| Message-ID | <tldg5-5yN-9@gated-at.bofh.it> |
| In reply to | #1600519 |
On Tue, Mar 14, 2017 at 02:52:32PM +0000, Suzuki K Poulose wrote:
> From: Marc Zyngier <marc.zyngier@arm.com>
>
> We don't hold the mmap_sem while searching for the VMAs when
> we try to unmap each memslot for a VM. Fix this properly to
> avoid unexpected results.
>
> Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm")
> Cc: stable@vger.kernel.org # v3.19+
> Cc: Christoffer Dall <christoffer.dall@linaro.org>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
> ---
> arch/arm/kvm/mmu.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 962616f..f2e2e0c 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -803,6 +803,7 @@ void stage2_unmap_vm(struct kvm *kvm)
> int idx;
>
> idx = srcu_read_lock(&kvm->srcu);
> + down_read(¤t->mm->mmap_sem);
> spin_lock(&kvm->mmu_lock);
>
> slots = kvm_memslots(kvm);
> @@ -810,6 +811,7 @@ void stage2_unmap_vm(struct kvm *kvm)
> stage2_unmap_memslot(kvm, memslot);
>
> spin_unlock(&kvm->mmu_lock);
> + up_read(¤t->mm->mmap_sem);
> srcu_read_unlock(&kvm->srcu, idx);
> }
>
> --
> 2.7.4
>
Are we sure that holding mmu_lock is valid while holding the mmap_sem?
Thanks,
-Christoffer
[toc] | [prev] | [next] | [standalone]
| From | Marc Zyngier <marc.zyngier@arm.com> |
|---|---|
| Date | 2017-03-15 10:40 +0100 |
| Message-ID | <tldzs-5Hw-11@gated-at.bofh.it> |
| In reply to | #1601166 |
On 15/03/17 09:17, Christoffer Dall wrote:
> On Tue, Mar 14, 2017 at 02:52:32PM +0000, Suzuki K Poulose wrote:
>> From: Marc Zyngier <marc.zyngier@arm.com>
>>
>> We don't hold the mmap_sem while searching for the VMAs when
>> we try to unmap each memslot for a VM. Fix this properly to
>> avoid unexpected results.
>>
>> Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm")
>> Cc: stable@vger.kernel.org # v3.19+
>> Cc: Christoffer Dall <christoffer.dall@linaro.org>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
>> ---
>> arch/arm/kvm/mmu.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>> index 962616f..f2e2e0c 100644
>> --- a/arch/arm/kvm/mmu.c
>> +++ b/arch/arm/kvm/mmu.c
>> @@ -803,6 +803,7 @@ void stage2_unmap_vm(struct kvm *kvm)
>> int idx;
>>
>> idx = srcu_read_lock(&kvm->srcu);
>> + down_read(¤t->mm->mmap_sem);
>> spin_lock(&kvm->mmu_lock);
>>
>> slots = kvm_memslots(kvm);
>> @@ -810,6 +811,7 @@ void stage2_unmap_vm(struct kvm *kvm)
>> stage2_unmap_memslot(kvm, memslot);
>>
>> spin_unlock(&kvm->mmu_lock);
>> + up_read(¤t->mm->mmap_sem);
>> srcu_read_unlock(&kvm->srcu, idx);
>> }
>>
>> --
>> 2.7.4
>>
>
> Are we sure that holding mmu_lock is valid while holding the mmap_sem?
Maybe I'm just confused by the many levels of locking, Here's my rational:
- kvm->srcu protects the memslot list
- mmap_sem protects the kernel VMA list
- mmu_lock protects the stage2 page tables (at least here)
I don't immediately see any issue with holding the mmap_sem mutex here
(unless there is a path that would retrigger a down operation on the
mmap_sem?).
Or am I missing something obvious?
Thanks,
M.
--
Jazz is not dead. It just smells funny...
[toc] | [prev] | [next] | [standalone]
| From | Christoffer Dall <cdall@linaro.org> |
|---|---|
| Date | 2017-03-15 12:10 +0100 |
| Message-ID | <tleYz-6NF-37@gated-at.bofh.it> |
| In reply to | #1601176 |
On Wed, Mar 15, 2017 at 09:34:53AM +0000, Marc Zyngier wrote:
> On 15/03/17 09:17, Christoffer Dall wrote:
> > On Tue, Mar 14, 2017 at 02:52:32PM +0000, Suzuki K Poulose wrote:
> >> From: Marc Zyngier <marc.zyngier@arm.com>
> >>
> >> We don't hold the mmap_sem while searching for the VMAs when
> >> we try to unmap each memslot for a VM. Fix this properly to
> >> avoid unexpected results.
> >>
> >> Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm")
> >> Cc: stable@vger.kernel.org # v3.19+
> >> Cc: Christoffer Dall <christoffer.dall@linaro.org>
> >> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> >> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
> >> ---
> >> arch/arm/kvm/mmu.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> >> index 962616f..f2e2e0c 100644
> >> --- a/arch/arm/kvm/mmu.c
> >> +++ b/arch/arm/kvm/mmu.c
> >> @@ -803,6 +803,7 @@ void stage2_unmap_vm(struct kvm *kvm)
> >> int idx;
> >>
> >> idx = srcu_read_lock(&kvm->srcu);
> >> + down_read(¤t->mm->mmap_sem);
> >> spin_lock(&kvm->mmu_lock);
> >>
> >> slots = kvm_memslots(kvm);
> >> @@ -810,6 +811,7 @@ void stage2_unmap_vm(struct kvm *kvm)
> >> stage2_unmap_memslot(kvm, memslot);
> >>
> >> spin_unlock(&kvm->mmu_lock);
> >> + up_read(¤t->mm->mmap_sem);
> >> srcu_read_unlock(&kvm->srcu, idx);
> >> }
> >>
> >> --
> >> 2.7.4
> >>
> >
> > Are we sure that holding mmu_lock is valid while holding the mmap_sem?
>
> Maybe I'm just confused by the many levels of locking, Here's my rational:
>
> - kvm->srcu protects the memslot list
> - mmap_sem protects the kernel VMA list
> - mmu_lock protects the stage2 page tables (at least here)
>
> I don't immediately see any issue with holding the mmap_sem mutex here
> (unless there is a path that would retrigger a down operation on the
> mmap_sem?).
>
> Or am I missing something obvious?
I was worried that someone else could hold the mmu_lock and take the
mmap_sem, but that wouldn't be allowed of course, because the semaphore
can sleep, so I agree, you should be good.
I just needed this conversation to feel good about this patch ;)
Reviewed-by: Christoffer Dall <cdall@linaro.org>
[toc] | [prev] | [next] | [standalone]
| From | Paolo Bonzini <pbonzini@redhat.com> |
|---|---|
| Date | 2017-03-15 14:40 +0100 |
| Message-ID | <tlhjI-8i6-19@gated-at.bofh.it> |
| In reply to | #1601166 |
On 15/03/2017 10:17, Christoffer Dall wrote:
> On Tue, Mar 14, 2017 at 02:52:32PM +0000, Suzuki K Poulose wrote:
>> From: Marc Zyngier <marc.zyngier@arm.com>
>>
>> We don't hold the mmap_sem while searching for the VMAs when
>> we try to unmap each memslot for a VM. Fix this properly to
>> avoid unexpected results.
>>
>> Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm")
>> Cc: stable@vger.kernel.org # v3.19+
>> Cc: Christoffer Dall <christoffer.dall@linaro.org>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
>> ---
>> arch/arm/kvm/mmu.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>> index 962616f..f2e2e0c 100644
>> --- a/arch/arm/kvm/mmu.c
>> +++ b/arch/arm/kvm/mmu.c
>> @@ -803,6 +803,7 @@ void stage2_unmap_vm(struct kvm *kvm)
>> int idx;
>>
>> idx = srcu_read_lock(&kvm->srcu);
>> + down_read(¤t->mm->mmap_sem);
>> spin_lock(&kvm->mmu_lock);
>>
>> slots = kvm_memslots(kvm);
>> @@ -810,6 +811,7 @@ void stage2_unmap_vm(struct kvm *kvm)
>> stage2_unmap_memslot(kvm, memslot);
>>
>> spin_unlock(&kvm->mmu_lock);
>> + up_read(¤t->mm->mmap_sem);
>> srcu_read_unlock(&kvm->srcu, idx);
>> }
>>
>> --
>> 2.7.4
>>
>
> Are we sure that holding mmu_lock is valid while holding the mmap_sem?
Sure, spinlock-inside-semaphore and spinlock-inside-mutex is always okay.
Paolo
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web