Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 271474
b: refs/heads/master
c: c298125
h: refs/heads/master
v: v3
  • Loading branch information
Sasha Levin authored and Avi Kivity committed Sep 25, 2011
1 parent 5d66489 commit 31893a1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 22388a3c8ce2a2a004ce764194cce8a2f9b13d66
refs/heads/master: c298125f4bc30fdbe4b7c33460ef57271cc51a7d
42 changes: 27 additions & 15 deletions trunk/virt/kvm/coalesced_mmio.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,8 @@ static int coalesced_mmio_in_range(struct kvm_coalesced_mmio_dev *dev,
gpa_t addr, int len)
{
struct kvm_coalesced_mmio_zone *zone;
struct kvm_coalesced_mmio_ring *ring;
unsigned avail;
int i;

/* Are we able to batch it ? */

/* last is the first free entry
* check if we don't meet the first used entry
* there is always one unused entry in the buffer
*/
ring = dev->kvm->coalesced_mmio_ring;
avail = (ring->first - ring->last - 1) % KVM_COALESCED_MMIO_MAX;
if (avail < KVM_MAX_VCPUS) {
/* full */
return 0;
}

/* is it in a batchable area ? */

for (i = 0; i < dev->nb_zones; i++) {
Expand All @@ -58,16 +43,43 @@ static int coalesced_mmio_in_range(struct kvm_coalesced_mmio_dev *dev,
return 0;
}

static int coalesced_mmio_has_room(struct kvm_coalesced_mmio_dev *dev)
{
struct kvm_coalesced_mmio_ring *ring;
unsigned avail;

/* Are we able to batch it ? */

/* last is the first free entry
* check if we don't meet the first used entry
* there is always one unused entry in the buffer
*/
ring = dev->kvm->coalesced_mmio_ring;
avail = (ring->first - ring->last - 1) % KVM_COALESCED_MMIO_MAX;
if (avail == 0) {
/* full */
return 0;
}

return 1;
}

static int coalesced_mmio_write(struct kvm_io_device *this,
gpa_t addr, int len, const void *val)
{
struct kvm_coalesced_mmio_dev *dev = to_mmio(this);
struct kvm_coalesced_mmio_ring *ring = dev->kvm->coalesced_mmio_ring;

if (!coalesced_mmio_in_range(dev, addr, len))
return -EOPNOTSUPP;

spin_lock(&dev->lock);

if (!coalesced_mmio_has_room(dev)) {
spin_unlock(&dev->lock);
return -EOPNOTSUPP;
}

/* copy data in first free entry of the ring */

ring->coalesced_mmio[ring->last].phys_addr = addr;
Expand Down

0 comments on commit 31893a1

Please sign in to comment.