Re: [PATCH] moduleparam: Resolve missing-field-initializer warning

From: Rustad, Mark D
Date: Tue Sep 02 2014 - 14:01:44 EST


On Aug 31, 2014, at 5:52 PM, Rusty Russell <rusty@xxxxxxxxxxxxxxx> wrote:

> Jeff Kirsher <jeffrey.t.kirsher@xxxxxxxxx> writes:
>> From: Mark Rustad <mark.d.rustad@xxxxxxxxx>
>>
>> Resolve a missing-field-initializer warning, that is produced
>> by every reference to module_param_call, by using designated
>> initialization for the first field. That is enough to silence
>> the complaint.
>>
>> Signed-off-by: Mark Rustad <mark.d.rustad@xxxxxxxxx>
>> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@xxxxxxxxx>
>> ---
>> include/linux/moduleparam.h | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> Strange, I haven't seen this warning. Compiler version? And it's good
> to quote the error message, so people can google it.

The message is only seen when doing a W=2 build. I happened to be using gcc 4.8.3, but I think most versions would produce the warning when it is enabled. It can either be silenced by using even a single designated initializer as I did here, or providing values for all of the fields. Because of the number of references to the macro, this change silences many warnings in W=2 builds.

One instance of the full warning message looks like this:

/home/share/git/nn-mdr/include/linux/moduleparam.h:198:16: warning: missing initializer for field ‘free’ of ‘struct kernel_param_ops’ [-Wmissing-field-initializers]
static struct kernel_param_ops __param_ops_##name = \
^
/home/share/git/nn-mdr/fs/fuse/inode.c:35:1: note: in expansion of macro ‘module_param_call’
module_param_call(max_user_bgreq, set_global_limit, param_get_uint,
^
/home/share/git/nn-mdr/include/linux/moduleparam.h:56:9: note: ‘free’ declared here
void (*free)(void *arg);


> Cheers,
> Rusty.
>
>> diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
>> index 494f99e..d99a9e9 100644
>> --- a/include/linux/moduleparam.h
>> +++ b/include/linux/moduleparam.h
>> @@ -196,7 +196,7 @@ struct kparam_array
>> /* Obsolete - use module_param_cb() */
>> #define module_param_call(name, set, get, arg, perm) \
>> static struct kernel_param_ops __param_ops_##name = \
>> - { 0, (void *)set, (void *)get }; \
>> + { .flags = 0, (void *)set, (void *)get }; \

This could also be resolved by adding a ", NULL" to the initializer above instead of the designated initializer. The designated initializer means that if additional "optional" fields were to be added in the future, this would not have to be touched to avoid generating the warning. However you prefer it. If instead you would prefer to designate all fields, the formal parameter names would have to change, since get and set would get substituted for the field designators .get and .set.

>> __module_param_call(MODULE_PARAM_PREFIX, \
>> name, &__param_ops_##name, arg, \
>> (perm) + sizeof(__check_old_set_param(set))*0, -1)
>> --
>> 1.9.3

--
Mark Rustad, Networking Division, Intel Corporation

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail