RE: [kvm-devel] [PATCH 00/10] PV-IO v3
From: Dor Laor <hidden>
Date: 2007-08-21 07:33:44
quoted
quoted
Well, for cache reasons you should really try to avoid having bothsidesquoted
quoted
write to the same data. Hence two separate cache-aligned regions
is
quoted
quoted
better than one region and a flip bit.While I certainly can see what you mean about the cache implicationsforquoted
a bit-flip design, I don't see how you can get away with not havingbothquoted
sides write to the same memory in other designs either. Wouldn't you still have to adjust descriptors from one ring to the other? E.g. wouldn't both sides be writing descriptor pointer data in this case,orquoted
am I missing something?Hi Gregory, You can have separate produced and consumed counters: see for example Van Jacobson's Netchannels presentation http://www.lemis.com/grog/Documentation/vj/lca06vj.pdf page 23. This single consumed count isn't sufficient if you can consume out-of-order: for that you really want a second "reply" ringbuffer indicating what buffers are consumed.
Rusty, although your code works pretty nice, (I'll send some raw patches later on today with kvm support for virtio). I was wandering why didn't you use Xen's ring implementation? They have separate counters and also union for the request/response structure in the same descriptor. Here is some of it + lxr link: http://81.161.245.2/lxr/http/source/xen/include/public/io/ring.h?v=xen-3 .1.0-src;a=m68k 80 #define DEFINE_RING_TYPES(__name, __req_t, __rsp_t) \ 81 \ 82 /* Shared ring entry */ \ 83 union __name##_sring_entry { \ 84 __req_t req; \ 85 __rsp_t rsp; \ 86 }; \ 87 \ 88 /* Shared ring page */ \ 89 struct __name##_sring { \ 90 RING_IDX req_prod, req_event; \ 91 RING_IDX rsp_prod, rsp_event; \ 92 uint8_t pad[48]; \ 93 union __name##_sring_entry ring[1]; /* variable-length */ \ 94 }; \ 95 \ 96 /* "Front" end's private variables */ \ 97 struct __name##_front_ring { \ 98 RING_IDX req_prod_pvt; \ 99 RING_IDX rsp_cons; \ 100 unsigned int nr_ents; \ 101 struct __name##_sring *sring; \ 102 }; \ 103 \ 104 /* "Back" end's private variables */ \ 105 struct __name##_back_ring { \ 106 RING_IDX rsp_prod_pvt; \ 107 RING_IDX req_cons; \ 108 unsigned int nr_ents; \ 109 struct __name##_sring *sring; \ 110 }; \ 111 \ 112 /* Syntactic sugar */ \ 113 typedef struct __name##_sring __name##_sring_t; \ 114 typedef struct __name##_front_ring __name##_front_ring_t; \ 115 typedef struct __name##_back_ring __name##_back_ring_t