On 11/18/2010 12:12 AM, Michael S. Tsirkin wrote:
Store irq routing table pointer in the irqfd object,
and use that to inject MSI directly without bouncing out to
a kernel thread.

While we touch this structure, rearrange irqfd fields to make fastpath
better packed for better cache utilization.

Some notes on the design:
- Use pointer into the rt instead of copying an entry,
   to make it possible to use rcu, thus side-stepping
   locking complexities.  We also save some memory this way.
- Old workqueue code is still used for level irqs.
   I don't think we DTRT with level anyway, however,
   it seems easier to keep the code around as
   it has been thought through and debugged, and fix level later than
   rip out and re-instate it later.



@@ -166,6 +178,7 @@ irqfd_ptable_queue_proc(struct file *file, 
wait_queue_head_t *wqh,
  static int
  kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi)
  {
+       struct kvm_irq_routing_table *irq_rt;
        struct _irqfd *irqfd, *tmp;
        struct file *file = NULL;
        struct eventfd_ctx *eventfd = NULL;
@@ -215,6 +228,10 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi)
                goto fail;
        }

+       rcu_read_lock();
+       irqfd_update(kvm, irqfd, rcu_dereference(kvm->irq_routing));
+       rcu_read_unlock();

Wow, complicated. rcu_read_lock() protects kvm->irq_routing, while we're in the update side of rcu-protected irqfd->irq_entry.

A comment please.

The rest looks good, it's nice we finally got the irq injection path so streamlined.

--
error compiling committee.c: too many arguments to function

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

Reply via email to