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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html