[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] interrupt mitigation for e1000
From: |
Avi Kivity |
Subject: |
Re: [Qemu-devel] interrupt mitigation for e1000 |
Date: |
Wed, 25 Jul 2012 11:53:29 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 |
On 07/24/2012 07:58 PM, Luigi Rizzo wrote:
> I noticed that the various NIC modules in qemu/kvm do not implement
> interrupt mitigation, which is very beneficial as it dramatically
> reduces exits from the hypervisor.
>
> As a proof of concept i tried to implement it for the e1000 driver
> (patch below), and it brings tx performance from 9 to 56Kpps on
> qemu-softmmu, and from ~20 to 140Kpps on qemu-kvm.
>
> I am going to measure the rx interrupt mitigation in the next couple
> of days.
>
> Is there any interest in having this code in ?
Indeed. But please drop the #ifdef MITIGATIONs.
> +
> +#ifdef MITIGATION
> + QEMUBH *int_bh; // interrupt mitigation handler
> + int tx_ics_count; // pending tx int requests
> + int rx_ics_count; // pending rx int requests
> + int int_cause; // int cause
Use uint32_t for int_cause, also a correctly sized type for the packet
counts.
>
> +#ifdef MITIGATION
> + /* we transmit the first few packets, or we do if we are
> + * approaching a full ring. in the latter case, also
> + * send an ics.
> + *
> + */
> +{
> + int len, pending;
> + len = s->mac_reg[TDLEN] / sizeof(desc) ;
> + pending = s->mac_reg[TDT] - s->mac_reg[TDH];
> + if (pending < 0)
> + pending += len;
> + /* ignore requests after the first few ones, as long as
> + * we are not approaching a full ring.
> + * Otherwise, deliver packets to the backend.
> + */
> + if (s->tx_ics_count > 4 && s->tx_ics_count + pending < len - 5)
> + return;
Where do the 4 and 5 come from? Shouldn't they be controlled by the
guest using a device register?
> }
> +#ifdef MITIGATION
> + s->int_cause |= cause; // remember the interrupt cause.
> + s->tx_ics_count += pending;
> + if (s->tx_ics_count >= len - 5) {
> + // if the ring is about to become full, generate an interrupt
Another magic number.
> + set_ics(s, 0, s->int_cause);
> + s->tx_ics_count = 0;
> + s->int_cause = 0;
> + } else { // otherwise just schedule it for later.
> + qemu_bh_schedule_idle(s->int_bh);
> + }
> +}
> +#else /* !MITIGATION */
> set_ics(s, 0, cause);
> +#endif
> }
>
--
error compiling committee.c: too many arguments to function