Re: [Qemu-devel] [PATCH] KVM: Fix GSI number space limit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 06.06.14 15:12, Cornelia Huck wrote:
On Fri,  6 Jun 2014 14:46:05 +0200
Alexander Graf <agraf@xxxxxxx> wrote:

KVM tells us the number of GSIs it can handle inside the kernel. That value is
basically KVM_MAX_IRQ_ROUTES. However when we try to set the GSI mapping table,
it checks for

     r = -EINVAL;
     if (routing.nr >= KVM_MAX_IRQ_ROUTES)
         goto out;

erroring out even when we're only using all of the GSIs. To make sure we never
hit that limit, let's reduce the number of GSIs we get from KVM by one.

Signed-off-by: Alexander Graf <agraf@xxxxxxx>
---
  kvm-all.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kvm-all.c b/kvm-all.c
index 4e19eff..56a251b 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -938,7 +938,7 @@ void kvm_init_irq_routing(KVMState *s)
  {
      int gsi_count, i;

-    gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING);
+    gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING) - 1;
      if (gsi_count > 0) {
          unsigned int gsi_bits, i;

But gsi_count is already marked as used further down in this function,
isn't it? Confused.

  gsi_bits = ALIGN(gsi_count, 32);
[...]
        for (i = gsi_count; i < gsi_bits; i++) {
            set_gsi(s, i);
        }

So if you take gsi_count = 1024, what happens?

  gsi_count = 1024;
  gsi_bits = 1024;
  for (i = 1024; i < 1024; i++) {
            set_gsi(s, i);
  }

At least in my world of C that loop never runs, no?


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux