Intel 10Gb
Andrew Gallatin
gallatin at cs.duke.edu
Fri May 14 16:22:30 UTC 2010
Alexander Sack wrote:
>> To use DCA you need:
>>
>> - A DCA driver to talk to the IOATDMA/DCA pcie device, and obtain the tag
>> table
>> - An interface that a client device (eg, NIC driver) can use to obtain
>> either the tag table, or at least the correct tag for the CPU
>> that the interrupt handler is bound to. The basic support in
>> a NIC driver boils down to something like:
>>
>> nic_interrupt_handler()
>> {
>> if (sc->dca.enabled && (curcpu != sc->dca.last_cpu)) {
>> sc->dca.last_cpu = curcpu;
>> tag = dca_get_tag(curcpu);
>> WRITE_REG(sc, DCA_TAG, tag);
>> }
>> }
>
> Drew, at least in the Intel documentation, it seems the NIC uses the
> LAPIC id to tell the PCIe TLPs where to put inbound NIC I/O (in the
> TLP the DCA info is stored) to the appropriate core's cache. i.e. the
> heuristic you gave above is more granular than what I think Intel
The pseudo-code above was intended to be the MSI-X interrupt handler
for a single queue, not some dispatcher for multiple queues.
Sorry that wasn't clear. So yes, the DCA tag value may be different
per queue.
> does. I could be wrong, maybe Jack can chime in and correct me. But
> it seems with Intel chipsets it is a per queue parameter which allows
> you to bind a core cache's to a queue via DCA. The added piece to
> this for at least bpf(4) consumers is to have bpf(4) subscribe to
> these queues AND to allow an interface for libpcap applications to
> know where what queue is on what core and THEN bind to it.
Yes, everything associated with a queue must be bound to the same
core (or at least to cores which share a cache).
Drew
More information about the freebsd-net
mailing list