projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'kvm-arm-for-4.8-take2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[deliverable/linux.git]
/
virt
/
kvm
/
irqchip.c
diff --git
a/virt/kvm/irqchip.c
b/virt/kvm/irqchip.c
index 8db197bb6c7a92d6508c66cd6a4cf3b9afc84562..3bcc9990adf79eb9367a6fee61a7fd9683233a35 100644
(file)
--- a/
virt/kvm/irqchip.c
+++ b/
virt/kvm/irqchip.c
@@
-62,12
+62,14
@@
int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
{
struct kvm_kernel_irq_routing_entry route;
{
struct kvm_kernel_irq_routing_entry route;
- if (!irqchip_in_kernel(kvm) ||
msi->flags != 0
)
+ if (!irqchip_in_kernel(kvm) ||
(msi->flags & ~KVM_MSI_VALID_DEVID)
)
return -EINVAL;
route.msi.address_lo = msi->address_lo;
route.msi.address_hi = msi->address_hi;
route.msi.data = msi->data;
return -EINVAL;
route.msi.address_lo = msi->address_lo;
route.msi.address_hi = msi->address_hi;
route.msi.data = msi->data;
+ route.msi.flags = msi->flags;
+ route.msi.devid = msi->devid;
return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, false);
}
return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, false);
}
@@
-135,7
+137,8
@@
void kvm_free_irq_routing(struct kvm *kvm)
free_irq_routing_table(rt);
}
free_irq_routing_table(rt);
}
-static int setup_routing_entry(struct kvm_irq_routing_table *rt,
+static int setup_routing_entry(struct kvm *kvm,
+ struct kvm_irq_routing_table *rt,
struct kvm_kernel_irq_routing_entry *e,
const struct kvm_irq_routing_entry *ue)
{
struct kvm_kernel_irq_routing_entry *e,
const struct kvm_irq_routing_entry *ue)
{
@@
-154,7
+157,7
@@
static int setup_routing_entry(struct kvm_irq_routing_table *rt,
e->gsi = ue->gsi;
e->type = ue->type;
e->gsi = ue->gsi;
e->type = ue->type;
- r = kvm_set_routing_entry(e, ue);
+ r = kvm_set_routing_entry(
kvm,
e, ue);
if (r)
goto out;
if (e->type == KVM_IRQ_ROUTING_IRQCHIP)
if (r)
goto out;
if (e->type == KVM_IRQ_ROUTING_IRQCHIP)
@@
-176,6
+179,7
@@
int kvm_set_irq_routing(struct kvm *kvm,
unsigned flags)
{
struct kvm_irq_routing_table *new, *old;
unsigned flags)
{
struct kvm_irq_routing_table *new, *old;
+ struct kvm_kernel_irq_routing_entry *e;
u32 i, j, nr_rt_entries = 0;
int r;
u32 i, j, nr_rt_entries = 0;
int r;
@@
-199,23
+203,25
@@
int kvm_set_irq_routing(struct kvm *kvm,
new->chip[i][j] = -1;
for (i = 0; i < nr; ++i) {
new->chip[i][j] = -1;
for (i = 0; i < nr; ++i) {
- struct kvm_kernel_irq_routing_entry *e;
-
r = -ENOMEM;
e = kzalloc(sizeof(*e), GFP_KERNEL);
if (!e)
goto out;
r = -EINVAL;
r = -ENOMEM;
e = kzalloc(sizeof(*e), GFP_KERNEL);
if (!e)
goto out;
r = -EINVAL;
- if (ue->flags) {
- kfree(e);
- goto out;
- }
- r = setup_routing_entry(new, e, ue);
- if (r) {
- kfree(e);
- goto out;
+ switch (ue->type) {
+ case KVM_IRQ_ROUTING_MSI:
+ if (ue->flags & ~KVM_MSI_VALID_DEVID)
+ goto free_entry;
+ break;
+ default:
+ if (ue->flags)
+ goto free_entry;
+ break;
}
}
+ r = setup_routing_entry(kvm, new, e, ue);
+ if (r)
+ goto free_entry;
++ue;
}
++ue;
}
@@
-232,7
+238,10
@@
int kvm_set_irq_routing(struct kvm *kvm,
new = old;
r = 0;
new = old;
r = 0;
+ goto out;
+free_entry:
+ kfree(e);
out:
free_irq_routing_table(new);
out:
free_irq_routing_table(new);
This page took
0.024113 seconds
and
5
git commands to generate.