On Tue, 2009-05-12 at 22:39 +0300, Michael S. Tsirkin wrote: > On Fri, May 08, 2009 at 04:31:21PM -0600, Alex Williamson wrote: > > +#ifdef KVM_CAP_IRQ_ROUTING > > We don't need these anymore. Doesn't that depend on the kernel it's built against? In any case, I think it would deserve it's own patch to remove those throughout. Removing them here would make their usage inconsistent. > > +static inline void set_bit(unsigned int *buf, int bit) > > +{ > > + buf[bit >> 5] |= (1U << (bit & 0x1f)); > > +} > > external () not needed here. bit >> 5 might be clearer as bit / 32 IMO. Fixed > > + > > +static inline void clear_bit(unsigned int *buf, int bit) > > +{ > > + buf[bit >> 5] &= ~(1U << (bit & 0x1f)); > > +} > > Make bit unsigned. And then bit & 0x1f can be written as bit % 32. > IMO that's easier to parse. Fixed > > + > > +static int kvm_find_free_gsi(kvm_context_t kvm) > > +{ > > + int i, bit, gsi; > > + unsigned int *buf = kvm->used_gsi_bitmap; > > + > > + for (i = 0; i < (kvm->max_gsi >> 5); i++) { > > may be clearer as kvm->max_gsi / 32 Fixed > > + if (buf[i] != ~0U) > > + break; > > + } > > {} around single statement isn't needed This is different in my new version, so the {} makes sense. > > + > > + if (i == kvm->max_gsi >> 5) > > + return -ENOSPC; > > May be clearer as kvm->max_gsi / 32 > By the way, this math means we can't use all gsi's > if the number is not a multiple of 32. > Round up instead? It's not hard: (kvm->max_gsi + 31) / 32 Fixed > > + > > + bit = ffs(~buf[i]); > > + if (!bit) > > + return -EAGAIN; > > We know it won't be 0, right? > Instead of checking twice, move the ffs call within the loop above? > E.g. like this: > for (i = 0; i < kvm->max_gsi / 32; ++i) > if ((bit = ffs(~buf[i])) { > gsi = bit - 1 + i * 32; > set_bit(buf, gsi); > return gsi; > } > > return -ENOSPC; Nice, I updated to something similar. > > + > > + gsi = (bit - 1) | (i << 5); > > clearer as bit - 1 + i * 32 Yup, fixed. > > + set_bit(buf, gsi); > > + return gsi; > > +} > > +#endif > > + > > int kvm_get_irq_route_gsi(kvm_context_t kvm) > > { > > #ifdef KVM_CAP_IRQ_ROUTING > > - if (kvm->max_used_gsi >= KVM_IOAPIC_NUM_PINS) { > > - if (kvm->max_used_gsi + 1 < kvm_get_gsi_count(kvm)) > > - return kvm->max_used_gsi + 1; > > - else > > - return -ENOSPC; > > - } else > > - return KVM_IOAPIC_NUM_PINS; > > + int gsi; > > + > > + pthread_mutex_lock(&kvm->gsi_mutex); > > + > > + if (!kvm->max_gsi) { > > Why is this lazy allocation required? > Let's do the below in some init function, > and keep code simple? Moved to kvm_init() > > + int i; > > + > > + /* Round the number of GSIs supported to a 4 byte > > + * value so we can search it using ints and ffs */ > > + i = kvm_get_gsi_count(kvm) & ~0x1f; > > Should not we round up? Why not? > Again, we can count = kvm_get_gsi_count(kvm) / 32, and use count * 4 below. Yep, rounded up, and pre-marked the excess bits as used. > > + kvm->used_gsi_bitmap = malloc(i >> 3); > > why not qemu_malloc? qemu_malloc isn't available in libkvm.c. malloc is consistent with the rest of the file. > > + if (!kvm->used_gsi_bitmap) { > > + pthread_mutex_unlock(&kvm->gsi_mutex); > > + return -ENOMEM; > > + } > > + memset(kvm->used_gsi_bitmap, 0, i >> 3); > > + kvm->max_gsi = i; > > + > > + /* Mark all the IOAPIC pin GSIs as already used */ > > + for (i = 0; i <= KVM_IOAPIC_NUM_PINS; i++) > > Is this really <=? Not <? Fixed. Thanks, I'll send out a new version shortly. 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