• Rusty Russell's avatar
    virtio_ring: unify direct/indirect code paths. · b25bd251
    Rusty Russell authored
    virtqueue_add() populates the virtqueue descriptor table from the sgs
    given.  If it uses an indirect descriptor table, then it puts a single
    descriptor in the descriptor table pointing to the kmalloc'ed indirect
    table where the sg is populated.
    
    Previously vring_add_indirect() did the allocation and the simple
    linear layout.  We replace that with alloc_indirect() which allocates
    the indirect table then chains it like the normal descriptor table so
    we can reuse the core logic.
    
    This slows down pktgen by less than 1/2 a percent (which uses direct
    descriptors), as well as vring_bench, but it's far neater.
    
    vring_bench before:
    	1061485790-1104800648(1.08254e+09+/-6.6e+06)ns
    vring_bench after:
    	1125610268-1183528965(1.14172e+09+/-8e+06)ns
    
    pktgen before:
       787781-796334(793165+/-2.4e+03)pps 365-369(367.5+/-1.2)Mb/sec (365530384-369498976(3.68028e+08+/-1.1e+06)bps) errors: 0
    
    pktgen after:
       779988-790404(786391+/-2.5e+03)pps 361-366(364.35+/-1.3)Mb/sec (361914432-366747456(3.64885e+08+/-1.2e+06)bps) errors: 0
    
    Now, if we make force indirect descriptors by turning off any_header_sg
    in virtio_net.c:
    
    pktgen before:
      713773-721062(718374+/-2.1e+03)pps 331-334(332.95+/-0.92)Mb/sec (331190672-334572768(3.33325e+08+/-9.6e+05)bps) errors: 0
    pktgen after:
      710542-719195(714898+/-2.4e+03)pps 329-333(331.15+/-1.1)Mb/sec (329691488-333706480(3.31713e+08+/-1.1e+06)bps) errors: 0
    Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b25bd251
virtio_ring.c 21.8 KB