|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] ring.h: introduce macros to handle monodirectional rings with multiple req sizes
On Tue, 21 Feb 2017, Jan Beulich wrote:
> >>> On 21.02.17 at 00:26, <sstabellini@xxxxxxxxxx> wrote:
> > On Mon, 20 Feb 2017, Jan Beulich wrote:
> >> >>> On 17.02.17 at 23:38, <sstabellini@xxxxxxxxxx> wrote:
> >> But the use of inline functions here is questionable
> >> in the first place - so far there are none, as they're not standard
> >> C89. Granted they are being used in a macro only, so won't cause
> >> immediate issues for code not using the macros, but anyway.
> >
> > I did it because it is not possible to use a macro to define another
> > macro with a variable name. In other words, the following does not work:
> >
> > #define DEFINE_XEN_FLEX_RING(name, packet_t)
> > \
> > #define name##_mask(idx, ring_size) (idx & (ring_size - 1))
> >
> > I prefer to drop C89 compliance to keep cleaner code, but if you have
> > better suggestions, I would be happy to hear them.
>
> Well, okay then, but please add a respective remark to the commit
> message then.
OK
> >> > +static inline void __name##_read_packet(char *buf,
> >> > \
> >>
> >> const
> >
> > We cannot use const char *buf, because we are about to pass buf to
> > memcpy.
>
> I don't understand: memcpy()'s second parameter is const.
Ah, right
> >> > + RING_IDX *masked_prod, RING_IDX *masked_cons,
> >> > \
> >>
> >> You don't update *masked_prod - why do you need a pointer here?
> >
> > When using this functions in pvcalls and xen-9pfs, I found that it was
> > less confusing for me if the two index parameters had the same type. In
> > fact, I started with what you suggested, then changed it back to this.
>
> I don't find this a convincing argument. The parameters will differ
> in constness anyway due to the different transfer direction, and
> using an extra layer of indirection just for aesthetic reasons seems
> at least odd to me.
All right, I'll make the change
> >> > +struct __name##_data {
> >> > \
> >> > + char *in; /* half of the allocation */
> >> > \
> >> > + char *out; /* half of the allocation */
> >> > \
> >>
> >> Why plain char? Void would seem the most neutral option here, but
> >> if arithmetic needs doing inside the header, then unsigned char may
> >> need to be used.
> >
> > The types here should match the type of the "buf" parameter used in the
> > read/write_packet functions. We cannot use void as we do arithmetic. If
> > you think unsigned char is more appropriate, I'll also change the type
> > of the buf arguments elsewhere.
>
> Yes please - plain char is mainly meant for use with strings, not
> arbitrary binary data.
OK
> >> > +struct __name##_data_intf {
> >> > \
> >> > + RING_IDX in_cons, in_prod;
> >> > \
> >> > +
> >> > \
> >> > + uint8_t pad1[56];
> >> > \
> >> > +
> >> > \
> >> > + RING_IDX out_cons, out_prod;
> >> > \
> >> > +
> >> > \
> >> > + uint8_t pad2[56];
> >> > \
> >> > +
> >> > \
> >> > + RING_IDX ring_order;
> >> > \
> >> > + grant_ref_t ref[];
> >> > \
> >> > +};
> >> > \
> >>
> >> Above you talk about the option of defining private _data_intf
> >> structures. How is that supposed to work when you define a
> >> suitably named structure already here? Other than #define-s
> >> one can't undo such a type definition.
> >
> > Yes, but it is always possible to use a different name. For example,
> > this is what I did in the pvcalls header:
> >
> > struct __pvcalls_data_intf {
> > RING_IDX in_cons, in_prod, in_error;
> >
> > uint8_t pad1[52];
> >
> > RING_IDX out_cons, out_prod, out_error;
> >
> > uint8_t pad2[52];
> >
> > RING_IDX ring_order;
> > grant_ref_t ref[];
> > };
> >
> > This struct is only here as a reference, we don't have to actually
> > define it in ring.h. If you think it's best, I could introduce it only
> > as a comment.
>
> How about having two variants of the macro - one (the base)
> version without this, and a second invoking the first and adding
> this?
Sure
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |