[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen: Add RING_COPY_RESPONSE()
On 28.01.2021 06:38, Jürgen Groß wrote: > On 28.01.21 04:16, Marek Marczykowski-Górecki wrote: >> Using RING_GET_RESPONSE() on a shared ring is easy to use incorrectly >> (i.e., by not considering that the other end may alter the data in the >> shared ring while it is being inspected). Safe usage of a response >> generally requires taking a local copy. >> >> Provide a RING_COPY_RESPONSE() macro to use instead of >> RING_GET_RESPONSE() and an open-coded memcpy(). This takes care of >> ensuring that the copy is done correctly regardless of any possible >> compiler optimizations. >> >> Use a volatile source to prevent the compiler from reordering or >> omitting the copy. >> >> This generalizes similar RING_COPY_REQUEST() macro added in 3f20b8def0. >> >> Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> >> --- >> xen/include/public/io/ring.h | 15 +++++++++------ >> 1 file changed, 9 insertions(+), 6 deletions(-) >> >> diff --git a/xen/include/public/io/ring.h b/xen/include/public/io/ring.h >> index d68615ae2f67..b63d7362f0e9 100644 >> --- a/xen/include/public/io/ring.h >> +++ b/xen/include/public/io/ring.h >> @@ -231,22 +231,25 @@ typedef struct __name##_back_ring __name##_back_ring_t >> #define RING_GET_REQUEST(_r, _idx) \ >> (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req)) >> >> +#define RING_GET_RESPONSE(_r, _idx) \ >> + (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) >> + >> /* >> - * Get a local copy of a request. >> + * Get a local copy of a request/response. >> * >> - * Use this in preference to RING_GET_REQUEST() so all processing is >> + * Use this in preference to RING_GET_{REQUEST,RESPONSE}() so all >> processing is >> * done on a local copy that cannot be modified by the other end. >> * >> * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 may cause >> this >> * to be ineffective where _req is a struct which consists of only >> bitfields. >> */ >> -#define RING_COPY_REQUEST(_r, _idx, _req) do { >> \ >> +#define RING_COPY_(action, _r, _idx, _req) do { >> \ > > What about renaming _req to _dest in order to reflect that it can be > a request _or_ a response? > > "action" is misnamed, IMO. What about "type"? > >> /* Use volatile to force the copy into _req. */ \ >> - *(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \ >> + *(_req) = *(volatile typeof(_req))RING_GET_##action(_r, _idx); \ >> } while (0) >> >> -#define RING_GET_RESPONSE(_r, _idx) \ >> - (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) >> +#define RING_COPY_REQUEST(_r, _idx, _req) RING_COPY_(REQUEST, _r, _idx, >> _req) >> +#define RING_COPY_RESPONSE(_r, _idx, _req) RING_COPY_(RESPONSE, _r, _idx, >> _req) > > Use _rsp instead of _req for RING_COPY_RESPONSE()? And, while at it, get rid of the leading underscores of macro parameter names wherever possible without extra code churn? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |