[v2,1/2] device property: Get rid of __PROPERTY_ENTRY_ARRAY_EL*SIZE*()

Message ID 20221111121518.44145-1-andriy.shevchenko@linux.intel.com
State New
Headers
Series [v2,1/2] device property: Get rid of __PROPERTY_ENTRY_ARRAY_EL*SIZE*() |

Commit Message

Andy Shevchenko Nov. 11, 2022, 12:15 p.m. UTC
  First of all, _ELEMENT_SIZE() repeats existing sizeof_field() macro.
Second, usage of _ARRAY_ELSIZE_LEN() adds unnecessary indirection
to the data layout. It's more understandable when the data structure
is placed explicitly. That said, get rid of those macros by replacing
them with the existing helper and explicit data structure layout.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v2: rebased on latest Linux Next, fixed anon union assignment
 include/linux/property.h | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)
  

Comments

kernel test robot Nov. 11, 2022, 2:31 p.m. UTC | #1
Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on next-20221111]
[also build test ERROR on v6.1-rc4]
[cannot apply to linus/master sailus-media-tree/streams v6.1-rc4 v6.1-rc3 v6.1-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/device-property-Get-rid-of-__PROPERTY_ENTRY_ARRAY_EL-SIZE/20221111-201519
patch link:    https://lore.kernel.org/r/20221111121518.44145-1-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v2 1/2] device property: Get rid of __PROPERTY_ENTRY_ARRAY_EL*SIZE*()
config: arm-randconfig-r024-20221111
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 463da45892e2d2a262277b91b96f5f8c05dc25d0)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/intel-lab-lkp/linux/commit/5e456016551f46fb1ac6d6e105c5f643ec45dfd5
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Andy-Shevchenko/device-property-Get-rid-of-__PROPERTY_ENTRY_ARRAY_EL-SIZE/20221111-201519
        git checkout 5e456016551f46fb1ac6d6e105c5f643ec45dfd5
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/base/test/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/base/test/property-entry-test.c:422:3: error: use of undeclared identifier 'DEV_PROP__Type_'; did you mean 'DEV_PROP_STRING'?
                   PROPERTY_ENTRY_REF_ARRAY("ref-3", refs),
                   ^
   include/linux/property.h:352:2: note: expanded from macro 'PROPERTY_ENTRY_REF_ARRAY'
           PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
           ^
   include/linux/property.h:337:10: note: expanded from macro 'PROPERTY_ENTRY_REF_ARRAY_LEN'
           .type = DEV_PROP_##_Type_,                                      \
                   ^
   <scratch space>:114:1: note: expanded from here
   DEV_PROP__Type_
   ^
   include/linux/property.h:26:2: note: 'DEV_PROP_STRING' declared here
           DEV_PROP_STRING,
           ^
   1 error generated.


vim +422 drivers/base/test/property-entry-test.c

c032ace71c29d5 Dmitry Torokhov 2019-12-04  404  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  405  /* Handling of reference properties */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  406  static void pe_test_reference(struct kunit *test)
c032ace71c29d5 Dmitry Torokhov 2019-12-04  407  {
c032ace71c29d5 Dmitry Torokhov 2019-12-04  408  	static const struct software_node nodes[] = {
c032ace71c29d5 Dmitry Torokhov 2019-12-04  409  		{ .name = "1", },
c032ace71c29d5 Dmitry Torokhov 2019-12-04  410  		{ .name = "2", },
eabd5e7d8bf599 Qian Cai        2020-01-06  411  		{ }
c032ace71c29d5 Dmitry Torokhov 2019-12-04  412  	};
c032ace71c29d5 Dmitry Torokhov 2019-12-04  413  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  414  	static const struct software_node_ref_args refs[] = {
e588fead04ec51 Andy Shevchenko 2021-03-29  415  		SOFTWARE_NODE_REFERENCE(&nodes[0]),
e588fead04ec51 Andy Shevchenko 2021-03-29  416  		SOFTWARE_NODE_REFERENCE(&nodes[1], 3, 4),
c032ace71c29d5 Dmitry Torokhov 2019-12-04  417  	};
c032ace71c29d5 Dmitry Torokhov 2019-12-04  418  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  419  	const struct property_entry entries[] = {
c032ace71c29d5 Dmitry Torokhov 2019-12-04  420  		PROPERTY_ENTRY_REF("ref-1", &nodes[0]),
c032ace71c29d5 Dmitry Torokhov 2019-12-04  421  		PROPERTY_ENTRY_REF("ref-2", &nodes[1], 1, 2),
c032ace71c29d5 Dmitry Torokhov 2019-12-04 @422  		PROPERTY_ENTRY_REF_ARRAY("ref-3", refs),
c032ace71c29d5 Dmitry Torokhov 2019-12-04  423  		{ }
c032ace71c29d5 Dmitry Torokhov 2019-12-04  424  	};
c032ace71c29d5 Dmitry Torokhov 2019-12-04  425  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  426  	struct fwnode_handle *node;
c032ace71c29d5 Dmitry Torokhov 2019-12-04  427  	struct fwnode_reference_args ref;
c032ace71c29d5 Dmitry Torokhov 2019-12-04  428  	int error;
c032ace71c29d5 Dmitry Torokhov 2019-12-04  429  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  430  	error = software_node_register_nodes(nodes);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  431  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  432  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  433  	node = fwnode_create_software_node(entries, NULL);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  434  	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  435  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  436  	error = fwnode_property_get_reference_args(node, "ref-1", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  437  						   0, 0, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  438  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  439  	KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[0]);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  440  	KUNIT_EXPECT_EQ(test, ref.nargs, 0U);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  441  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  442  	/* wrong index */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  443  	error = fwnode_property_get_reference_args(node, "ref-1", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  444  						   0, 1, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  445  	KUNIT_EXPECT_NE(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  446  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  447  	error = fwnode_property_get_reference_args(node, "ref-2", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  448  						   1, 0, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  449  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  450  	KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  451  	KUNIT_EXPECT_EQ(test, ref.nargs, 1U);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  452  	KUNIT_EXPECT_EQ(test, ref.args[0], 1LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  453  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  454  	/* asking for more args, padded with zero data */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  455  	error = fwnode_property_get_reference_args(node, "ref-2", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  456  						   3, 0, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  457  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  458  	KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  459  	KUNIT_EXPECT_EQ(test, ref.nargs, 3U);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  460  	KUNIT_EXPECT_EQ(test, ref.args[0], 1LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  461  	KUNIT_EXPECT_EQ(test, ref.args[1], 2LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  462  	KUNIT_EXPECT_EQ(test, ref.args[2], 0LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  463  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  464  	/* wrong index */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  465  	error = fwnode_property_get_reference_args(node, "ref-2", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  466  						   2, 1, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  467  	KUNIT_EXPECT_NE(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  468  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  469  	/* array of references */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  470  	error = fwnode_property_get_reference_args(node, "ref-3", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  471  						   0, 0, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  472  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  473  	KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[0]);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  474  	KUNIT_EXPECT_EQ(test, ref.nargs, 0U);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  475  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  476  	/* second reference in the array */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  477  	error = fwnode_property_get_reference_args(node, "ref-3", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  478  						   2, 1, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  479  	KUNIT_ASSERT_EQ(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  480  	KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  481  	KUNIT_EXPECT_EQ(test, ref.nargs, 2U);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  482  	KUNIT_EXPECT_EQ(test, ref.args[0], 3LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  483  	KUNIT_EXPECT_EQ(test, ref.args[1], 4LLU);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  484  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  485  	/* wrong index */
c032ace71c29d5 Dmitry Torokhov 2019-12-04  486  	error = fwnode_property_get_reference_args(node, "ref-1", NULL,
c032ace71c29d5 Dmitry Torokhov 2019-12-04  487  						   0, 2, &ref);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  488  	KUNIT_EXPECT_NE(test, error, 0);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  489  
c032ace71c29d5 Dmitry Torokhov 2019-12-04  490  	fwnode_remove_software_node(node);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  491  	software_node_unregister_nodes(nodes);
c032ace71c29d5 Dmitry Torokhov 2019-12-04  492  }
c032ace71c29d5 Dmitry Torokhov 2019-12-04  493
  
kernel test robot Nov. 11, 2022, 2:31 p.m. UTC | #2
Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on next-20221111]
[also build test ERROR on v6.1-rc4]
[cannot apply to linus/master sailus-media-tree/streams v6.1-rc4 v6.1-rc3 v6.1-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/device-property-Get-rid-of-__PROPERTY_ENTRY_ARRAY_EL-SIZE/20221111-201519
patch link:    https://lore.kernel.org/r/20221111121518.44145-1-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v2 1/2] device property: Get rid of __PROPERTY_ENTRY_ARRAY_EL*SIZE*()
config: sh-randconfig-r002-20221111
compiler: sh4-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/5e456016551f46fb1ac6d6e105c5f643ec45dfd5
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Andy-Shevchenko/device-property-Get-rid-of-__PROPERTY_ENTRY_ARRAY_EL-SIZE/20221111-201519
        git checkout 5e456016551f46fb1ac6d6e105c5f643ec45dfd5
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh SHELL=/bin/bash drivers/base/test/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from drivers/base/test/property-entry-test.c:7:
   drivers/base/test/property-entry-test.c: In function 'pe_test_reference':
>> include/linux/property.h:337:17: error: 'DEV_PROP__Type_' undeclared (first use in this function); did you mean 'DEV_PROP_STRING'?
     337 |         .type = DEV_PROP_##_Type_,                                      \
         |                 ^~~~~~~~~
   include/linux/property.h:352:9: note: in expansion of macro 'PROPERTY_ENTRY_REF_ARRAY_LEN'
     352 |         PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/base/test/property-entry-test.c:422:17: note: in expansion of macro 'PROPERTY_ENTRY_REF_ARRAY'
     422 |                 PROPERTY_ENTRY_REF_ARRAY("ref-3", refs),
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/property.h:337:17: note: each undeclared identifier is reported only once for each function it appears in
     337 |         .type = DEV_PROP_##_Type_,                                      \
         |                 ^~~~~~~~~
   include/linux/property.h:352:9: note: in expansion of macro 'PROPERTY_ENTRY_REF_ARRAY_LEN'
     352 |         PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/base/test/property-entry-test.c:422:17: note: in expansion of macro 'PROPERTY_ENTRY_REF_ARRAY'
     422 |                 PROPERTY_ENTRY_REF_ARRAY("ref-3", refs),
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~


vim +337 include/linux/property.h

   322	
   323	#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_)		\
   324		__PROPERTY_ENTRY_ARRAY_LEN(_name_, u8_data, U8, _val_, _len_)
   325	#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_)		\
   326		__PROPERTY_ENTRY_ARRAY_LEN(_name_, u16_data, U16, _val_, _len_)
   327	#define PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, _len_)		\
   328		__PROPERTY_ENTRY_ARRAY_LEN(_name_, u32_data, U32, _val_, _len_)
   329	#define PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, _len_)		\
   330		__PROPERTY_ENTRY_ARRAY_LEN(_name_, u64_data, U64, _val_, _len_)
   331	#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_)		\
   332		__PROPERTY_ENTRY_ARRAY_LEN(_name_, str, STRING, _val_, _len_)
   333	#define PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, _len_)		\
   334	(struct property_entry) {						\
   335		.name = _name_,							\
   336		.length = (_len_) * sizeof(struct software_node_ref_args),	\
 > 337		.type = DEV_PROP_##_Type_,					\
   338		{ .pointer = _val_ },						\
   339	}
   340
  

Patch

diff --git a/include/linux/property.h b/include/linux/property.h
index 5d840299146d..aa58d4e8a21c 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -12,6 +12,7 @@ 
 
 #include <linux/bits.h>
 #include <linux/fwnode.h>
+#include <linux/stddef.h>
 #include <linux/types.h>
 
 struct device;
@@ -311,24 +312,14 @@  struct property_entry {
  * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
  * and structs.
  */
-
-#define __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_)				\
-	sizeof(((struct property_entry *)NULL)->value._elem_[0])
-
-#define __PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_, _elsize_, _Type_,	\
-					  _val_, _len_)			\
-(struct property_entry) {						\
-	.name = _name_,							\
-	.length = (_len_) * (_elsize_),					\
-	.type = DEV_PROP_##_Type_,					\
-	{ .pointer = _val_ },						\
+#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)		\
+(struct property_entry) {								\
+	.name = _name_,									\
+	.length = (_len_) * sizeof_field(struct property_entry, value._elem_[0]),	\
+	.type = DEV_PROP_##_Type_,							\
+	{ .pointer = _val_ },								\
 }
 
-#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)\
-	__PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_,			\
-				__PROPERTY_ENTRY_ELEMENT_SIZE(_elem_),	\
-				_Type_, _val_, _len_)
-
 #define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_)		\
 	__PROPERTY_ENTRY_ARRAY_LEN(_name_, u8_data, U8, _val_, _len_)
 #define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_)		\
@@ -340,9 +331,12 @@  struct property_entry {
 #define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_)		\
 	__PROPERTY_ENTRY_ARRAY_LEN(_name_, str, STRING, _val_, _len_)
 #define PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, _len_)		\
-	__PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_,			\
-				sizeof(struct software_node_ref_args),	\
-				REF, _val_, _len_)
+(struct property_entry) {						\
+	.name = _name_,							\
+	.length = (_len_) * sizeof(struct software_node_ref_args),	\
+	.type = DEV_PROP_##_Type_,					\
+	{ .pointer = _val_ },						\
+}
 
 #define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)				\
 	PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
@@ -360,7 +354,7 @@  struct property_entry {
 #define __PROPERTY_ENTRY_ELEMENT(_name_, _elem_, _Type_, _val_)		\
 (struct property_entry) {						\
 	.name = _name_,							\
-	.length = __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_),		\
+	.length = sizeof_field(struct property_entry, value._elem_[0]),	\
 	.is_inline = true,						\
 	.type = DEV_PROP_##_Type_,					\
 	{ .value = { ._elem_[0] = _val_ } },				\