diff mbox series

[-next] MIPS: fix debugfs_simple_attr.cocci warnings

Message ID 1548384137-171488-1-git-send-email-yuehaibing@huawei.com (mailing list archive)
State Rejected
Headers show
Series [-next] MIPS: fix debugfs_simple_attr.cocci warnings | expand

Commit Message

Yue Haibing Jan. 25, 2019, 2:42 a.m. UTC
Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE
for debugfs files.

Semantic patch information:
Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file()
imposes some significant overhead as compared to
DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe().

Generated by: scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci

Signed-off-by: YueHaibing <yuehaibing@huawei.com>
---
 arch/mips/kernel/spinlock_test.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

Greg KH Jan. 25, 2019, 7:11 a.m. UTC | #1
On Fri, Jan 25, 2019 at 02:42:17AM +0000, YueHaibing wrote:
> Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE
> for debugfs files.
> 
> Semantic patch information:
> Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file()
> imposes some significant overhead as compared to
> DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe().

What kind of overhead is this adding, and how are you measuring it?

> 
> Generated by: scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci
> 
> Signed-off-by: YueHaibing <yuehaibing@huawei.com>
> ---
>  arch/mips/kernel/spinlock_test.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/mips/kernel/spinlock_test.c b/arch/mips/kernel/spinlock_test.c
> index ab4e3e1..509de1e 100644
> --- a/arch/mips/kernel/spinlock_test.c
> +++ b/arch/mips/kernel/spinlock_test.c
> @@ -35,7 +35,7 @@ static int ss_get(void *data, u64 *val)
>  	return 0;
>  }
>  
> -DEFINE_SIMPLE_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
> +DEFINE_DEBUGFS_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
>  
>  
>  
> @@ -114,14 +114,14 @@ static int multi_get(void *data, u64 *val)
>  	return 0;
>  }
>  
> -DEFINE_SIMPLE_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
> +DEFINE_DEBUGFS_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
>  
>  static int __init spinlock_test(void)
>  {
> -	debugfs_create_file("spin_single", S_IRUGO, mips_debugfs_dir, NULL,
> -			    &fops_ss);
> -	debugfs_create_file("spin_multi", S_IRUGO, mips_debugfs_dir, NULL,
> -			    &fops_multi);
> +	debugfs_create_file_unsafe("spin_single", 0444, mips_debugfs_dir,
> +				   NULL, &fops_ss);
> +	debugfs_create_file_unsafe("spin_multi", 0444, mips_debugfs_dir,
> +				   NULL, &fops_multi);
>  	return 0;
>  }
>  device_initcall(spinlock_test);

This is just testing code, right?  Why is using the unsafe methods
needed?

thanks,

greg k-h
Yue Haibing Jan. 25, 2019, 7:43 a.m. UTC | #2
On 2019/1/25 15:11, Greg Kroah-Hartman wrote:
> On Fri, Jan 25, 2019 at 02:42:17AM +0000, YueHaibing wrote:
>> Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE
>> for debugfs files.
>>
>> Semantic patch information:
>> Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file()
>> imposes some significant overhead as compared to
>> DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe().
> 
> What kind of overhead is this adding, and how are you measuring it?

The log message on the commit introducing the semantic patch says the
following:

commit 5103068eaca2 ("debugfs, coccinelle: check for obsolete DEFINE_SIMPLE_ATTRIBUTE() usage")

    In order to protect against file removal races, debugfs files created via
    debugfs_create_file() now get wrapped by a struct file_operations at their
    opening.

    If the original struct file_operations are known to be safe against removal
    races by themselves already, the proxy creation may be bypassed by creating
    the files through debugfs_create_file_unsafe().

    In order to help debugfs users who use the common
      DEFINE_SIMPLE_ATTRIBUTE() + debugfs_create_file()
    idiom to transition to removal safe struct file_operations, the helper
    macro DEFINE_DEBUGFS_ATTRIBUTE() has been introduced.

    Thus, the preferred strategy is to use
      DEFINE_DEBUGFS_ATTRIBUTE() + debugfs_create_file_unsafe()
    now.


> 
>>
>> Generated by: scripts/coccinelle/api/debugfs/debugfs_simple_attr.cocci
>>
>> Signed-off-by: YueHaibing <yuehaibing@huawei.com>
>> ---
>>  arch/mips/kernel/spinlock_test.c | 12 ++++++------
>>  1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/arch/mips/kernel/spinlock_test.c b/arch/mips/kernel/spinlock_test.c
>> index ab4e3e1..509de1e 100644
>> --- a/arch/mips/kernel/spinlock_test.c
>> +++ b/arch/mips/kernel/spinlock_test.c
>> @@ -35,7 +35,7 @@ static int ss_get(void *data, u64 *val)
>>  	return 0;
>>  }
>>  
>> -DEFINE_SIMPLE_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
>> +DEFINE_DEBUGFS_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
>>  
>>  
>>  
>> @@ -114,14 +114,14 @@ static int multi_get(void *data, u64 *val)
>>  	return 0;
>>  }
>>  
>> -DEFINE_SIMPLE_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
>> +DEFINE_DEBUGFS_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
>>  
>>  static int __init spinlock_test(void)
>>  {
>> -	debugfs_create_file("spin_single", S_IRUGO, mips_debugfs_dir, NULL,
>> -			    &fops_ss);
>> -	debugfs_create_file("spin_multi", S_IRUGO, mips_debugfs_dir, NULL,
>> -			    &fops_multi);
>> +	debugfs_create_file_unsafe("spin_single", 0444, mips_debugfs_dir,
>> +				   NULL, &fops_ss);
>> +	debugfs_create_file_unsafe("spin_multi", 0444, mips_debugfs_dir,
>> +				   NULL, &fops_multi);
>>  	return 0;
>>  }
>>  device_initcall(spinlock_test);
> 
> This is just testing code, right?  Why is using the unsafe methods
> needed?
> 
> thanks,
> 
> greg k-h
> 
> .
>
Greg KH Jan. 25, 2019, 7:54 a.m. UTC | #3
On Fri, Jan 25, 2019 at 03:43:21PM +0800, YueHaibing wrote:
> On 2019/1/25 15:11, Greg Kroah-Hartman wrote:
> > On Fri, Jan 25, 2019 at 02:42:17AM +0000, YueHaibing wrote:
> >> Use DEFINE_DEBUGFS_ATTRIBUTE rather than DEFINE_SIMPLE_ATTRIBUTE
> >> for debugfs files.
> >>
> >> Semantic patch information:
> >> Rationale: DEFINE_SIMPLE_ATTRIBUTE + debugfs_create_file()
> >> imposes some significant overhead as compared to
> >> DEFINE_DEBUGFS_ATTRIBUTE + debugfs_create_file_unsafe().
> > 
> > What kind of overhead is this adding, and how are you measuring it?
> 
> The log message on the commit introducing the semantic patch says the
> following:
> 
> commit 5103068eaca2 ("debugfs, coccinelle: check for obsolete DEFINE_SIMPLE_ATTRIBUTE() usage")
> 
>     In order to protect against file removal races, debugfs files created via
>     debugfs_create_file() now get wrapped by a struct file_operations at their
>     opening.
> 
>     If the original struct file_operations are known to be safe against removal
>     races by themselves already, the proxy creation may be bypassed by creating
>     the files through debugfs_create_file_unsafe().
> 
>     In order to help debugfs users who use the common
>       DEFINE_SIMPLE_ATTRIBUTE() + debugfs_create_file()
>     idiom to transition to removal safe struct file_operations, the helper
>     macro DEFINE_DEBUGFS_ATTRIBUTE() has been introduced.
> 
>     Thus, the preferred strategy is to use
>       DEFINE_DEBUGFS_ATTRIBUTE() + debugfs_create_file_unsafe()
>     now.


That is true.  So, are you saying that you "know" when you remove these
files everything is safe?  Are you seeing some sort of problem with
these files as-is?  If not, why change them to the "unsafe" method?

thanks,

greg k-h
diff mbox series

Patch

diff --git a/arch/mips/kernel/spinlock_test.c b/arch/mips/kernel/spinlock_test.c
index ab4e3e1..509de1e 100644
--- a/arch/mips/kernel/spinlock_test.c
+++ b/arch/mips/kernel/spinlock_test.c
@@ -35,7 +35,7 @@  static int ss_get(void *data, u64 *val)
 	return 0;
 }
 
-DEFINE_SIMPLE_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
+DEFINE_DEBUGFS_ATTRIBUTE(fops_ss, ss_get, NULL, "%llu\n");
 
 
 
@@ -114,14 +114,14 @@  static int multi_get(void *data, u64 *val)
 	return 0;
 }
 
-DEFINE_SIMPLE_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
+DEFINE_DEBUGFS_ATTRIBUTE(fops_multi, multi_get, NULL, "%llu\n");
 
 static int __init spinlock_test(void)
 {
-	debugfs_create_file("spin_single", S_IRUGO, mips_debugfs_dir, NULL,
-			    &fops_ss);
-	debugfs_create_file("spin_multi", S_IRUGO, mips_debugfs_dir, NULL,
-			    &fops_multi);
+	debugfs_create_file_unsafe("spin_single", 0444, mips_debugfs_dir,
+				   NULL, &fops_ss);
+	debugfs_create_file_unsafe("spin_multi", 0444, mips_debugfs_dir,
+				   NULL, &fops_multi);
 	return 0;
 }
 device_initcall(spinlock_test);