diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2011-10-27 15:56:31 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2011-10-30 20:03:27 +0100 |
commit | 74b41e5676568e6560474267bbf1a5a32d3e2c41 (patch) | |
tree | 7a9b10d619f34b9248ab10909449293b494275b5 /target-ppc | |
parent | 70bca53ffb811ea59dc090b3ca7825cf0bf346a7 (diff) | |
download | qemu-74b41e5676568e6560474267bbf1a5a32d3e2c41.tar.gz qemu-74b41e5676568e6560474267bbf1a5a32d3e2c41.tar.bz2 qemu-74b41e5676568e6560474267bbf1a5a32d3e2c41.zip |
pseries: Allow writes to KVM accelerated TCE table
Sufficiently recent kernels include a KVM call to accelerate use of
PAPR TCE tables (IOMMU), which are used by PAPR virtual IO devices.
This involves qemu mapping the TCE table in from a kernel obtained fd,
which currently we do with PROT_READ only. This is a hangover from
early (never released) versions of this kernel interface which only
permitted read-only mappings and required us to destroy and recreate
the table when we needed to clear it from qemu.
Now, the kernel permits read-write mappings, and we rely on this to
clear the table in spapr_vio_quiesce_one(). However, due to
insufficient testing, I forgot to update the actual mapping of the
table in kvmppc_create_spapr_tce() to add PROT_WRITE to the mmap().
This patch corrects the oversight.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-ppc')
-rw-r--r-- | target-ppc/kvm.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index f3d0861a11..429349fb94 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -850,7 +850,7 @@ void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t window_size, int *pfd) len = (window_size / SPAPR_VIO_TCE_PAGE_SIZE) * sizeof(VIOsPAPR_RTCE); /* FIXME: round this up to page size */ - table = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0); + table = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (table == MAP_FAILED) { close(fd); return NULL; |