linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: pbonzini@redhat.com (Paolo Bonzini)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v12 2/6] KVM: Add generic support for dirty page logging
Date: Wed, 05 Nov 2014 17:09:50 +0100	[thread overview]
Message-ID: <545A4BCE.40504@redhat.com> (raw)
In-Reply-To: <20141101101208.GE12801@jhogan-linux.le.imgtec.org>



On 01/11/2014 11:12, James Hogan wrote:
> AFAICT all of the arch implementations of kvm_vm_ioctl_get_dirty_log()
> except x86 and ppc hv (i.e. ia60, mips, ppc pv, s390) already make use
> of the existing generic function kvm_get_dirty_log() to help implement
> their kvm_vm_ioctl_get_dirty_log functions, which all look pretty
> similar now except for TLB flushing.
> 
> Would they not be a better base for a generic
> kvm_vm_ioctl_get_dirty_log()?
> 
> It feels a bit wrong to add a generic higher level function which
> doesn't make use of the existing generic lower level abstraction.
> 
> (Appologies if this has already been brought up in previous versions of
> the patchset, I haven't been tracking them).

I agree that we should make the interface look more like
kvm_get_dirty_log().  Here the steps are:

+ *   1. Take a snapshot of the bit and clear it if needed.
+ *   2. Write protect the corresponding page.
+ *   3. Flush TLB's if needed.
+ *   4. Copy the snapshot to the userspace.

and I believe we can swap 3 and 4, since (4) is just a copy of data and
it has no ordering relationship with the action of the guest.  Once we
do that, we can rewrite code to look a lot like kvm_get_dirty_log(),
let's call it kvm_get_dirty_log_protect():

	r = -EINVAL;
	if (log->slot >= KVM_USER_MEM_SLOTS)
		goto out;

	memslot = id_to_memslot(kvm->memslots, log->slot);

	dirty_bitmap = memslot->dirty_bitmap;
	r = -ENOENT;
	if (!dirty_bitmap)
		goto out;

	n = kvm_dirty_bitmap_bytes(memslot);

	dirty_bitmap_buffer = dirty_bitmap + n / sizeof(long);
	memset(dirty_bitmap_buffer, 0, n);

	spin_lock(&kvm->mmu_lock);

	*is_dirty = false;
	for (i = 0; i < n / sizeof(long); i++) {
		unsigned long mask;
		gfn_t offset;

		if (!dirty_bitmap[i])
			continue;

		*is_dirty = true;

		mask = xchg(&dirty_bitmap[i], 0);
		dirty_bitmap_buffer[i] = mask;

		offset = i * BITS_PER_LONG;
		kvm_arch_write_protect_pt_masked(kvm, memslot, offset,
						 mask);
	}

	spin_unlock(&kvm->mmu_lock);

	r = -EFAULT;
	if (copy_to_user(log->dirty_bitmap, dirty_bitmap_buffer, n))
		goto out;

	r = 0;
out:
	return r;

where the TLB flushing is moved to the caller as in kvm_get_dirty_log
callers.  Taking the slots lock would also be kept in the per-arch
kvm_vm_ioctl_get_dirty_log, again similar to PPC/MIPS/S390.

You can add a new Kconfig symbol, or define an implementation of
kvm_arch_write_protect_pt_masked that BUG()s for ia64/PPC/MIPS/S390.

BTW, you can leave the function in kvm_main.c.

Paolo

  parent reply	other threads:[~2014-11-05 16:09 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-22 22:34 [PATCH v12 0/6] arm/KVM: dirty page logging support for ARMv7 (3.17.0-rc1) Mario Smarduch
2014-10-22 22:34 ` [PATCH v12 1/6] KVM: Add architecture-defined TLB flush support Mario Smarduch
2014-10-30 12:06   ` Cornelia Huck
2014-11-05 16:10   ` Paolo Bonzini
2014-10-22 22:34 ` [PATCH v12 2/6] KVM: Add generic support for dirty page logging Mario Smarduch
2014-10-30 12:14   ` Cornelia Huck
2014-10-30 19:19     ` Mario Smarduch
2014-11-03  3:01       ` Takuya Yoshikawa
2014-11-03 19:34         ` Mario Smarduch
2014-11-01 10:12   ` James Hogan
2014-11-03 18:44     ` Mario Smarduch
2014-11-05 16:09     ` Paolo Bonzini [this message]
2014-11-05 23:05       ` Mario Smarduch
2014-11-06 10:14         ` Paolo Bonzini
2014-11-06 18:07           ` Mario Smarduch
2014-10-22 22:34 ` [PATCH v12 3/6] arm: KVM: Add ARMv7 API to flush TLBs Mario Smarduch
2014-10-22 22:34 ` [PATCH v12 4/6] arm: KVM: Add initial dirty page locking infrastructure Mario Smarduch
2014-10-27 23:26 ` [PATCH v12 0/6] arm/KVM: dirty page logging support for ARMv7 (3.17.0-rc1) Wanpeng Li
2014-10-28  0:28   ` Mario Smarduch
2014-10-28  1:24     ` Wanpeng Li
2014-10-28 16:15       ` Mario Smarduch
2014-10-28 16:29 ` [PATCH v12 0/6] 2nd-request for review comments: " Mario Smarduch
2014-10-30 12:11 ` [PATCH v12 0/6] " Christian Borntraeger
2014-10-30 19:27   ` Mario Smarduch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=545A4BCE.40504@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).