Thread (1 message) 1 message, 1 author, 2007-08-21

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 both
sides
quoted
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 implications
for
quoted
a bit-flip design, I don't see how you can get away with not having
both
quoted
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,
or
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help