Message ID | 20200316193305.428378-3-helen.koike@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: add v4l2_pipeline_stream_{enable,disable} helpers | expand |
On 3/16/20 4:33 PM, Helen Koike wrote: > Add v4l2_pipeline_stream_{enable,disable} helper functions to iterate > through the subdevices in a given stream (i.e following links from sink > to source) and call .s_stream() callback. > > Add stream_count on the subdevice object for simultaneous streaming from > different video devices which shares subdevices. > > Prevent calling .s_stream(true) if it was already called previously by > another stream. > > Prevent calling .s_stream(false) from one stream when there are still > others active. > > Signed-off-by: Helen Koike <helen.koike@collabora.com> > --- > > drivers/media/v4l2-core/v4l2-common.c | 99 +++++++++++++++++++++++++++ > include/media/v4l2-common.h | 30 ++++++++ > include/media/v4l2-subdev.h | 2 + > 3 files changed, 131 insertions(+) > > diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c > index d0e5ebc736f9..6a5a3d2c282e 100644 > --- a/drivers/media/v4l2-core/v4l2-common.c > +++ b/drivers/media/v4l2-core/v4l2-common.c > @@ -441,3 +441,102 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > return 0; > } > EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt); > + > +int v4l2_pipeline_stream_disable(struct media_entity *entity, > + struct media_pipeline *pipe) > +{ > + struct media_device *mdev = entity->graph_obj.mdev; > + int ret = 0; > + > + mutex_lock(&mdev->graph_mutex); > + > + if (!pipe->streaming_count) { > + ret = media_graph_walk_init(&pipe->graph, mdev); > + if (ret) { > + mutex_unlock(&mdev->graph_mutex); > + return ret; > + } > + } > + > + media_graph_walk_start(&pipe->graph, entity); > + > + while ((entity = media_graph_walk_next_stream(&pipe->graph))) { > + struct v4l2_subdev *sd; > + > + if (!is_media_entity_v4l2_subdev(entity)) > + continue; > + > + sd = media_entity_to_v4l2_subdev(entity); > + if (!sd->stream_count || --sd->stream_count) > + continue; > + > + ret = v4l2_subdev_call(sd, video, s_stream, false); > + if (ret && ret != -ENOIOCTLCMD) argh..., there is a missing open curly braces here (skipped when I added the check for -ENOIOCTLCMD), sorry about that (/me embarrassed). Fixed version can be found here https://gitlab.collabora.com/koike/linux/tree/v4l2/s_stream I'll submit v2 after having your comments. > + dev_dbg(mdev->dev, > + "couldn't disable stream for subdevice '%s'\n", > + entity->name); > + break; > + } > + > + dev_dbg(mdev->dev, > + "stream disabled for subdevice '%s'\n", entity->name); > + } > + > + if (!pipe->streaming_count) > + media_graph_walk_cleanup(&pipe->graph); > + > + mutex_unlock(&mdev->graph_mutex); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(v4l2_pipeline_stream_disable); > + > +__must_check int v4l2_pipeline_stream_enable(struct media_entity *entity, > + struct media_pipeline *pipe) > +{ > + struct media_device *mdev = entity->graph_obj.mdev; > + int ret = 0; > + > + mutex_lock(&mdev->graph_mutex); > + > + if (!pipe->streaming_count) { > + ret = media_graph_walk_init(&pipe->graph, mdev); > + if (ret) { > + mutex_unlock(&mdev->graph_mutex); > + return ret; > + } > + } > + > + media_graph_walk_start(&pipe->graph, entity); > + > + while ((entity = media_graph_walk_next_stream(&pipe->graph))) { > + struct v4l2_subdev *sd; > + > + if (!is_media_entity_v4l2_subdev(entity)) > + continue; > + > + sd = media_entity_to_v4l2_subdev(entity); > + if (sd->stream_count++) > + continue; > + > + ret = v4l2_subdev_call(sd, video, s_stream, true); > + if (ret && ret != -ENOIOCTLCMD) Same here Thanks, Helen > + dev_dbg(mdev->dev, > + "couldn't enable stream for subdevice '%s'\n", > + entity->name); > + v4l2_pipeline_stream_disable(entity, pipe); > + break; > + } > + > + dev_dbg(mdev->dev, > + "stream enabled for subdevice '%s'\n", entity->name); > + } > + > + if (!pipe->streaming_count) > + media_graph_walk_cleanup(&pipe->graph); > + > + mutex_unlock(&mdev->graph_mutex); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(v4l2_pipeline_stream_enable); > diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h > index 150ee16ebd81..46c0857d07c4 100644 > --- a/include/media/v4l2-common.h > +++ b/include/media/v4l2-common.h > @@ -519,6 +519,36 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, > int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, > u32 width, u32 height); > > +/** > + * media_pipeline_stop - Mark a pipeline as not streaming > + * @entity: Starting entity > + * @pipe: Media pipeline to iterate through the topology > + * > + * Call .s_stream(false) callback in all the subdevices participating in the > + * stream, i.e. following links from sink to source. > + * > + * If multiple calls to v4l2_pipeline_stream_enable() have been made, the > + * same number of calls to this function are required. > + */ > +int v4l2_pipeline_stream_disable(struct media_entity *entity, > + struct media_pipeline *pipe); > + > +/** > + * v4l2_pipeline_stream_enable - Call .s_stream(true) callbacks in the stream > + * @entity: Starting entity > + * @pipe: Media pipeline to iterate through the topology > + * > + * Call .s_stream(true) callback in all the subdevices participating in the > + * stream, i.e. following links from sink to source. > + * > + * Calls to this function can be nested, in which case the same number of > + * v4l2_pipeline_stream_disable() calls will be required to stop streaming. > + * The pipeline pointer must be identical for all nested calls to > + * v4l2_pipeline_stream_enable(). > + */ > +__must_check int v4l2_pipeline_stream_enable(struct media_entity *entity, > + struct media_pipeline *pipe); > + > static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf) > { > /* > diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h > index a4848de59852..20f913a9f70c 100644 > --- a/include/media/v4l2-subdev.h > +++ b/include/media/v4l2-subdev.h > @@ -838,6 +838,7 @@ struct v4l2_subdev_platform_data { > * @subdev_notifier: A sub-device notifier implicitly registered for the sub- > * device using v4l2_device_register_sensor_subdev(). > * @pdata: common part of subdevice platform data > + * @stream_count: Stream count for the subdevice. > * > * Each instance of a subdev driver should create this struct, either > * stand-alone or embedded in a larger struct. > @@ -869,6 +870,7 @@ struct v4l2_subdev { > struct v4l2_async_notifier *notifier; > struct v4l2_async_notifier *subdev_notifier; > struct v4l2_subdev_platform_data *pdata; > + unsigned int stream_count; > }; > > >
Hi Helen, I love your patch! Yet something to improve: [auto build test ERROR on linuxtv-media/master] [also build test ERROR on v5.6-rc6 next-20200312] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Helen-Koike/media-add-v4l2_pipeline_stream_-enable-disable-helpers/20200317-080751 base: git://linuxtv.org/media_tree.git master config: arm-at91_dt_defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (GCC) 9.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=9.2.0 make.cross ARCH=arm If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media/v4l2-core/v4l2-common.c:37: drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': >> include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:330:9: note: in definition of macro '__compiletime_assert' 330 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ >> drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: >> include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ >> drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c: At top level: >> drivers/media/v4l2-core/v4l2-common.c:485:2: error: expected identifier or '(' before 'if' 485 | if (!pipe->streaming_count) | ^~ >> drivers/media/v4l2-core/v4l2-common.c:488:15: error: expected declaration specifiers or '...' before '&' token 488 | mutex_unlock(&mdev->graph_mutex); | ^ >> drivers/media/v4l2-core/v4l2-common.c:490:2: error: expected identifier or '(' before 'return' 490 | return ret; | ^~~~~~ >> drivers/media/v4l2-core/v4l2-common.c:491:1: error: expected identifier or '(' before '}' token 491 | } | ^ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media/v4l2-core/v4l2-common.c:37: drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': >> include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:330:9: note: in definition of macro '__compiletime_assert' 330 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: >> include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c: At top level: drivers/media/v4l2-core/v4l2-common.c:535:2: error: expected identifier or '(' before 'if' 535 | if (!pipe->streaming_count) | ^~ drivers/media/v4l2-core/v4l2-common.c:538:15: error: expected declaration specifiers or '...' before '&' token 538 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media/v4l2-core/v4l2-common.c:540:2: error: expected identifier or '(' before 'return' 540 | return ret; | ^~~~~~ drivers/media/v4l2-core/v4l2-common.c:541:1: error: expected identifier or '(' before '}' token 541 | } | ^ drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': >> drivers/media/v4l2-core/v4l2-common.c:483:2: warning: control reaches end of non-void function [-Wreturn-type] 483 | } | ^ drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': drivers/media/v4l2-core/v4l2-common.c:533:2: warning: control reaches end of non-void function [-Wreturn-type] 533 | } | ^ -- In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media//v4l2-core/v4l2-common.c:37: drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': >> include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:330:9: note: in definition of macro '__compiletime_assert' 330 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: >> include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c: At top level: drivers/media//v4l2-core/v4l2-common.c:485:2: error: expected identifier or '(' before 'if' 485 | if (!pipe->streaming_count) | ^~ drivers/media//v4l2-core/v4l2-common.c:488:15: error: expected declaration specifiers or '...' before '&' token 488 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media//v4l2-core/v4l2-common.c:490:2: error: expected identifier or '(' before 'return' 490 | return ret; | ^~~~~~ drivers/media//v4l2-core/v4l2-common.c:491:1: error: expected identifier or '(' before '}' token 491 | } | ^ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media//v4l2-core/v4l2-common.c:37: drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': >> include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:330:9: note: in definition of macro '__compiletime_assert' 330 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: >> include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ >> include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c: At top level: drivers/media//v4l2-core/v4l2-common.c:535:2: error: expected identifier or '(' before 'if' 535 | if (!pipe->streaming_count) | ^~ drivers/media//v4l2-core/v4l2-common.c:538:15: error: expected declaration specifiers or '...' before '&' token 538 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media//v4l2-core/v4l2-common.c:540:2: error: expected identifier or '(' before 'return' 540 | return ret; | ^~~~~~ drivers/media//v4l2-core/v4l2-common.c:541:1: error: expected identifier or '(' before '}' token 541 | } | ^ drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': drivers/media//v4l2-core/v4l2-common.c:483:2: warning: control reaches end of non-void function [-Wreturn-type] 483 | } | ^ drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': drivers/media//v4l2-core/v4l2-common.c:533:2: warning: control reaches end of non-void function [-Wreturn-type] 533 | } | ^ vim +987 include/linux/kernel.h cf14f27f82af78 Alexei Starovoitov 2018-03-28 977 ^1da177e4c3f41 Linus Torvalds 2005-04-16 978 /** ^1da177e4c3f41 Linus Torvalds 2005-04-16 979 * container_of - cast a member of a structure out to the containing structure ^1da177e4c3f41 Linus Torvalds 2005-04-16 980 * @ptr: the pointer to the member. ^1da177e4c3f41 Linus Torvalds 2005-04-16 981 * @type: the type of the container struct this is embedded in. ^1da177e4c3f41 Linus Torvalds 2005-04-16 982 * @member: the name of the member within the struct. ^1da177e4c3f41 Linus Torvalds 2005-04-16 983 * ^1da177e4c3f41 Linus Torvalds 2005-04-16 984 */ ^1da177e4c3f41 Linus Torvalds 2005-04-16 985 #define container_of(ptr, type, member) ({ \ c7acec713d14c6 Ian Abbott 2017-07-12 986 void *__mptr = (void *)(ptr); \ c7acec713d14c6 Ian Abbott 2017-07-12 @987 BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ c7acec713d14c6 Ian Abbott 2017-07-12 988 !__same_type(*(ptr), void), \ c7acec713d14c6 Ian Abbott 2017-07-12 989 "pointer type mismatch in container_of()"); \ c7acec713d14c6 Ian Abbott 2017-07-12 990 ((type *)(__mptr - offsetof(type, member))); }) ^1da177e4c3f41 Linus Torvalds 2005-04-16 991 :::::: The code at line 987 was first introduced by commit :::::: c7acec713d14c6ce8a20154f9dfda258d6bcad3b kernel.h: handle pointers to arrays better in container_of() :::::: TO: Ian Abbott <abbotti@mev.co.uk> :::::: CC: Linus Torvalds <torvalds@linux-foundation.org> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Helen, I love your patch! Yet something to improve: [auto build test ERROR on linuxtv-media/master] [also build test ERROR on v5.6-rc6 next-20200316] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Helen-Koike/media-add-v4l2_pipeline_stream_-enable-disable-helpers/20200317-080751 base: git://linuxtv.org/media_tree.git master config: s390-randconfig-a001-20200316 (attached as .config) compiler: s390-linux-gcc (GCC) 9.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=9.2.0 make.cross ARCH=s390 If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:61: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:69:3: note: in definition of macro '__trace_if_value' 69 | (cond) ? \ | ^~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media/v4l2-core/v4l2-common.c:37: drivers/media/v4l2-core/v4l2-common.c: At top level: >> include/linux/compiler.h:56:23: error: expected identifier or '(' before 'if' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~ >> drivers/media/v4l2-core/v4l2-common.c:485:2: note: in expansion of macro 'if' 485 | if (!pipe->streaming_count) | ^~ >> include/linux/compiler.h:72:2: error: expected identifier or '(' before ')' token 72 | }) | ^ include/linux/compiler.h:58:69: note: in expansion of macro '__trace_if_value' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~~~~~~~~~~~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ >> drivers/media/v4l2-core/v4l2-common.c:485:2: note: in expansion of macro 'if' 485 | if (!pipe->streaming_count) | ^~ drivers/media/v4l2-core/v4l2-common.c:488:15: error: expected declaration specifiers or '...' before '&' token 488 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media/v4l2-core/v4l2-common.c:490:2: error: expected identifier or '(' before 'return' 490 | return ret; | ^~~~~~ drivers/media/v4l2-core/v4l2-common.c:491:1: error: expected identifier or '(' before '}' token 491 | } | ^ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media/v4l2-core/v4l2-common.c:37: drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:52: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:61: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:69:3: note: in definition of macro '__trace_if_value' 69 | (cond) ? \ | ^~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media/v4l2-core/v4l2-common.c:37: drivers/media/v4l2-core/v4l2-common.c: At top level: >> include/linux/compiler.h:56:23: error: expected identifier or '(' before 'if' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~ drivers/media/v4l2-core/v4l2-common.c:535:2: note: in expansion of macro 'if' 535 | if (!pipe->streaming_count) | ^~ >> include/linux/compiler.h:72:2: error: expected identifier or '(' before ')' token 72 | }) | ^ include/linux/compiler.h:58:69: note: in expansion of macro '__trace_if_value' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~~~~~~~~~~~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ drivers/media/v4l2-core/v4l2-common.c:535:2: note: in expansion of macro 'if' 535 | if (!pipe->streaming_count) | ^~ drivers/media/v4l2-core/v4l2-common.c:538:15: error: expected declaration specifiers or '...' before '&' token 538 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media/v4l2-core/v4l2-common.c:540:2: error: expected identifier or '(' before 'return' 540 | return ret; | ^~~~~~ drivers/media/v4l2-core/v4l2-common.c:541:1: error: expected identifier or '(' before '}' token 541 | } | ^ drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': drivers/media/v4l2-core/v4l2-common.c:483:2: warning: control reaches end of non-void function [-Wreturn-type] 483 | } | ^ drivers/media/v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': drivers/media/v4l2-core/v4l2-common.c:533:2: warning: control reaches end of non-void function [-Wreturn-type] 533 | } | ^ -- | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:61: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:69:3: note: in definition of macro '__trace_if_value' 69 | (cond) ? \ | ^~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:469:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 469 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media//v4l2-core/v4l2-common.c:37: drivers/media//v4l2-core/v4l2-common.c: At top level: >> include/linux/compiler.h:56:23: error: expected identifier or '(' before 'if' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~ drivers/media//v4l2-core/v4l2-common.c:485:2: note: in expansion of macro 'if' 485 | if (!pipe->streaming_count) | ^~ >> include/linux/compiler.h:72:2: error: expected identifier or '(' before ')' token 72 | }) | ^ include/linux/compiler.h:58:69: note: in expansion of macro '__trace_if_value' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~~~~~~~~~~~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:485:2: note: in expansion of macro 'if' 485 | if (!pipe->streaming_count) | ^~ drivers/media//v4l2-core/v4l2-common.c:488:15: error: expected declaration specifiers or '...' before '&' token 488 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media//v4l2-core/v4l2-common.c:490:2: error: expected identifier or '(' before 'return' 490 | return ret; | ^~~~~~ drivers/media//v4l2-core/v4l2-common.c:491:1: error: expected identifier or '(' before '}' token 491 | } | ^ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media//v4l2-core/v4l2-common.c:37: drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:52: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:58:61: note: in definition of macro '__trace_if_var' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:51: error: 'struct v4l2_subdev' has no member named 'entity' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~ include/linux/compiler.h:69:3: note: in definition of macro '__trace_if_value' 69 | (cond) ? \ | ^~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ include/linux/compiler.h:330:3: note: in expansion of macro 'if' 330 | if (!(condition)) \ | ^~ include/linux/compiler.h:338:2: note: in expansion of macro '__compiletime_assert' 338 | __compiletime_assert(condition, msg, prefix, suffix) | ^~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:350:2: note: in expansion of macro '_compiletime_assert' 350 | _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) | ^~~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert' 39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ^~~~~~~~~~~~~~~~~~ include/linux/kernel.h:987:2: note: in expansion of macro 'BUILD_BUG_ON_MSG' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~~~~~~ include/linux/kernel.h:987:20: note: in expansion of macro '__same_type' 987 | BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ | ^~~~~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from <command-line>: include/linux/compiler_types.h:129:35: error: 'struct v4l2_subdev' has no member named 'entity' 129 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b) | ^~~~~~~~~~~~~~~~~~ include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof' 17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~~ include/linux/kernel.h:990:21: note: in expansion of macro 'offsetof' 990 | ((type *)(__mptr - offsetof(type, member))); }) | ^~~~~~~~ include/media/v4l2-subdev.h:888:3: note: in expansion of macro 'container_of' 888 | container_of(__me_sd_ent, struct v4l2_subdev, entity) : \ | ^~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:518:8: note: in expansion of macro 'media_entity_to_v4l2_subdev' 518 | sd = media_entity_to_v4l2_subdev(entity); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/module.h:12, from drivers/media//v4l2-core/v4l2-common.c:37: drivers/media//v4l2-core/v4l2-common.c: At top level: >> include/linux/compiler.h:56:23: error: expected identifier or '(' before 'if' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~ drivers/media//v4l2-core/v4l2-common.c:535:2: note: in expansion of macro 'if' 535 | if (!pipe->streaming_count) | ^~ >> include/linux/compiler.h:72:2: error: expected identifier or '(' before ')' token 72 | }) | ^ include/linux/compiler.h:58:69: note: in expansion of macro '__trace_if_value' 58 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond)) | ^~~~~~~~~~~~~~~~ include/linux/compiler.h:56:28: note: in expansion of macro '__trace_if_var' 56 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) ) | ^~~~~~~~~~~~~~ drivers/media//v4l2-core/v4l2-common.c:535:2: note: in expansion of macro 'if' 535 | if (!pipe->streaming_count) | ^~ drivers/media//v4l2-core/v4l2-common.c:538:15: error: expected declaration specifiers or '...' before '&' token 538 | mutex_unlock(&mdev->graph_mutex); | ^ drivers/media//v4l2-core/v4l2-common.c:540:2: error: expected identifier or '(' before 'return' 540 | return ret; | ^~~~~~ drivers/media//v4l2-core/v4l2-common.c:541:1: error: expected identifier or '(' before '}' token 541 | } | ^ drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_disable': drivers/media//v4l2-core/v4l2-common.c:483:2: warning: control reaches end of non-void function [-Wreturn-type] 483 | } | ^ drivers/media//v4l2-core/v4l2-common.c: In function 'v4l2_pipeline_stream_enable': drivers/media//v4l2-core/v4l2-common.c:533:2: warning: control reaches end of non-void function [-Wreturn-type] 533 | } | ^ vim +/if +485 drivers/media/v4l2-core/v4l2-common.c 444 445 int v4l2_pipeline_stream_disable(struct media_entity *entity, 446 struct media_pipeline *pipe) 447 { 448 struct media_device *mdev = entity->graph_obj.mdev; 449 int ret = 0; 450 451 mutex_lock(&mdev->graph_mutex); 452 453 if (!pipe->streaming_count) { 454 ret = media_graph_walk_init(&pipe->graph, mdev); 455 if (ret) { 456 mutex_unlock(&mdev->graph_mutex); 457 return ret; 458 } 459 } 460 461 media_graph_walk_start(&pipe->graph, entity); 462 463 while ((entity = media_graph_walk_next_stream(&pipe->graph))) { 464 struct v4l2_subdev *sd; 465 466 if (!is_media_entity_v4l2_subdev(entity)) 467 continue; 468 469 sd = media_entity_to_v4l2_subdev(entity); 470 if (!sd->stream_count || --sd->stream_count) 471 continue; 472 473 ret = v4l2_subdev_call(sd, video, s_stream, false); 474 if (ret && ret != -ENOIOCTLCMD) 475 dev_dbg(mdev->dev, 476 "couldn't disable stream for subdevice '%s'\n", 477 entity->name); 478 break; 479 } 480 481 dev_dbg(mdev->dev, 482 "stream disabled for subdevice '%s'\n", entity->name); 483 } 484 > 485 if (!pipe->streaming_count) 486 media_graph_walk_cleanup(&pipe->graph); 487 488 mutex_unlock(&mdev->graph_mutex); 489 490 return ret; 491 } 492 EXPORT_SYMBOL_GPL(v4l2_pipeline_stream_disable); 493 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index d0e5ebc736f9..6a5a3d2c282e 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -441,3 +441,102 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, return 0; } EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt); + +int v4l2_pipeline_stream_disable(struct media_entity *entity, + struct media_pipeline *pipe) +{ + struct media_device *mdev = entity->graph_obj.mdev; + int ret = 0; + + mutex_lock(&mdev->graph_mutex); + + if (!pipe->streaming_count) { + ret = media_graph_walk_init(&pipe->graph, mdev); + if (ret) { + mutex_unlock(&mdev->graph_mutex); + return ret; + } + } + + media_graph_walk_start(&pipe->graph, entity); + + while ((entity = media_graph_walk_next_stream(&pipe->graph))) { + struct v4l2_subdev *sd; + + if (!is_media_entity_v4l2_subdev(entity)) + continue; + + sd = media_entity_to_v4l2_subdev(entity); + if (!sd->stream_count || --sd->stream_count) + continue; + + ret = v4l2_subdev_call(sd, video, s_stream, false); + if (ret && ret != -ENOIOCTLCMD) + dev_dbg(mdev->dev, + "couldn't disable stream for subdevice '%s'\n", + entity->name); + break; + } + + dev_dbg(mdev->dev, + "stream disabled for subdevice '%s'\n", entity->name); + } + + if (!pipe->streaming_count) + media_graph_walk_cleanup(&pipe->graph); + + mutex_unlock(&mdev->graph_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(v4l2_pipeline_stream_disable); + +__must_check int v4l2_pipeline_stream_enable(struct media_entity *entity, + struct media_pipeline *pipe) +{ + struct media_device *mdev = entity->graph_obj.mdev; + int ret = 0; + + mutex_lock(&mdev->graph_mutex); + + if (!pipe->streaming_count) { + ret = media_graph_walk_init(&pipe->graph, mdev); + if (ret) { + mutex_unlock(&mdev->graph_mutex); + return ret; + } + } + + media_graph_walk_start(&pipe->graph, entity); + + while ((entity = media_graph_walk_next_stream(&pipe->graph))) { + struct v4l2_subdev *sd; + + if (!is_media_entity_v4l2_subdev(entity)) + continue; + + sd = media_entity_to_v4l2_subdev(entity); + if (sd->stream_count++) + continue; + + ret = v4l2_subdev_call(sd, video, s_stream, true); + if (ret && ret != -ENOIOCTLCMD) + dev_dbg(mdev->dev, + "couldn't enable stream for subdevice '%s'\n", + entity->name); + v4l2_pipeline_stream_disable(entity, pipe); + break; + } + + dev_dbg(mdev->dev, + "stream enabled for subdevice '%s'\n", entity->name); + } + + if (!pipe->streaming_count) + media_graph_walk_cleanup(&pipe->graph); + + mutex_unlock(&mdev->graph_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(v4l2_pipeline_stream_enable); diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 150ee16ebd81..46c0857d07c4 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -519,6 +519,36 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, u32 width, u32 height); +/** + * media_pipeline_stop - Mark a pipeline as not streaming + * @entity: Starting entity + * @pipe: Media pipeline to iterate through the topology + * + * Call .s_stream(false) callback in all the subdevices participating in the + * stream, i.e. following links from sink to source. + * + * If multiple calls to v4l2_pipeline_stream_enable() have been made, the + * same number of calls to this function are required. + */ +int v4l2_pipeline_stream_disable(struct media_entity *entity, + struct media_pipeline *pipe); + +/** + * v4l2_pipeline_stream_enable - Call .s_stream(true) callbacks in the stream + * @entity: Starting entity + * @pipe: Media pipeline to iterate through the topology + * + * Call .s_stream(true) callback in all the subdevices participating in the + * stream, i.e. following links from sink to source. + * + * Calls to this function can be nested, in which case the same number of + * v4l2_pipeline_stream_disable() calls will be required to stop streaming. + * The pipeline pointer must be identical for all nested calls to + * v4l2_pipeline_stream_enable(). + */ +__must_check int v4l2_pipeline_stream_enable(struct media_entity *entity, + struct media_pipeline *pipe); + static inline u64 v4l2_buffer_get_timestamp(const struct v4l2_buffer *buf) { /* diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index a4848de59852..20f913a9f70c 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -838,6 +838,7 @@ struct v4l2_subdev_platform_data { * @subdev_notifier: A sub-device notifier implicitly registered for the sub- * device using v4l2_device_register_sensor_subdev(). * @pdata: common part of subdevice platform data + * @stream_count: Stream count for the subdevice. * * Each instance of a subdev driver should create this struct, either * stand-alone or embedded in a larger struct. @@ -869,6 +870,7 @@ struct v4l2_subdev { struct v4l2_async_notifier *notifier; struct v4l2_async_notifier *subdev_notifier; struct v4l2_subdev_platform_data *pdata; + unsigned int stream_count; };
Add v4l2_pipeline_stream_{enable,disable} helper functions to iterate through the subdevices in a given stream (i.e following links from sink to source) and call .s_stream() callback. Add stream_count on the subdevice object for simultaneous streaming from different video devices which shares subdevices. Prevent calling .s_stream(true) if it was already called previously by another stream. Prevent calling .s_stream(false) from one stream when there are still others active. Signed-off-by: Helen Koike <helen.koike@collabora.com> --- drivers/media/v4l2-core/v4l2-common.c | 99 +++++++++++++++++++++++++++ include/media/v4l2-common.h | 30 ++++++++ include/media/v4l2-subdev.h | 2 + 3 files changed, 131 insertions(+)