Hi Ricardo, Thank you for the patch. On Mon, May 01, 2023 at 04:49:31PM +0200, Ricardo Ribalda wrote: > Struct uvc_frame and uvc_format are packaged together on > streaming->formats on a sigle allocation. s/sigle/single/ > > This is working fine because both structures have a field with a > pointer, but it will stop working when the sizeof() of any of those > structs is not a muliple of the sizeof(void*). > > Make that aligment contract explicit. > > Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > --- > This is better than 3 allocations, and do not have any performance > penalty. > --- > drivers/media/usb/uvc/uvcvideo.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > index 9a596c8d894a..03e8a543c8e6 100644 > --- a/drivers/media/usb/uvc/uvcvideo.h > +++ b/drivers/media/usb/uvc/uvcvideo.h > @@ -252,7 +252,7 @@ struct uvc_frame { > u8 bFrameIntervalType; > u32 dwDefaultFrameInterval; > u32 *dwFrameInterval; > -}; > +} __aligned(sizeof(void *)); /* uvc_frame is packed on streaming->formats. */ Don't we need u32 alignment here, not void * alignment, given that uvc_frame is followed by an array of u32 ? > > struct uvc_format { > u8 type; > @@ -266,7 +266,7 @@ struct uvc_format { > > unsigned int nframes; > struct uvc_frame *frame; > -}; > +} __aligned(sizeof(void *)); /* uvc_format is packed on streaming->formats. */ Same here, technically we need to ensure that the following uvc_frame will be aligned. void * alignment will give us that now, but that's not the actual constraint. Wouldn't it be better to handle the alignment constraints explicitly when allocating the memory ? It's not that uvc_frame and uvc_format have intrinsic alignment constraints, the constraints are only needed because of the way memory is allocated. > > struct uvc_streaming_header { > u8 bNumFormats; > > --- > base-commit: 58390c8ce1bddb6c623f62e7ed36383e7fa5c02f > change-id: 20230501-uvc-align-6ff202b68dab -- Regards, Laurent Pinchart