mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Coccinelle: Add api/setup_timer.cocci
Use the timer API function setup_timer instead of structure field assignments to initialize a timer. Signed-off-by: Vaishali Thakkar <vaishali.thakkar@oracle.com> Acked-by: Julia Lawall <julia.lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.com>
This commit is contained in:
		
							parent
							
								
									f75621c6ec
								
							
						
					
					
						commit
						c5eda8fd10
					
				
					 1 changed files with 199 additions and 0 deletions
				
			
		
							
								
								
									
										199
									
								
								scripts/coccinelle/api/setup_timer.cocci
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								scripts/coccinelle/api/setup_timer.cocci
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,199 @@
 | 
			
		|||
/// Use setup_timer function instead of initializing timer with the function
 | 
			
		||||
/// and data fields
 | 
			
		||||
// Confidence: High
 | 
			
		||||
// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2
 | 
			
		||||
// Options: --no-includes --include-headers
 | 
			
		||||
// Keywords: init_timer, setup_timer
 | 
			
		||||
 | 
			
		||||
virtual patch
 | 
			
		||||
virtual context
 | 
			
		||||
virtual org
 | 
			
		||||
virtual report
 | 
			
		||||
 | 
			
		||||
@match_immediate_function_data_after_init_timer
 | 
			
		||||
depends on patch && !context && !org && !report@
 | 
			
		||||
expression e, func, da;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
-init_timer (&e);
 | 
			
		||||
+setup_timer (&e, func, da);
 | 
			
		||||
 | 
			
		||||
(
 | 
			
		||||
-e.function = func;
 | 
			
		||||
-e.data = da;
 | 
			
		||||
|
 | 
			
		||||
-e.data = da;
 | 
			
		||||
-e.function = func;
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@match_function_and_data_after_init_timer
 | 
			
		||||
depends on patch && !context && !org && !report@
 | 
			
		||||
expression e1, e2, e3, e4, e5, a, b;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
-init_timer (&e1);
 | 
			
		||||
+setup_timer (&e1, a, b);
 | 
			
		||||
 | 
			
		||||
... when != a = e2
 | 
			
		||||
    when != b = e3
 | 
			
		||||
(
 | 
			
		||||
-e1.function = a;
 | 
			
		||||
... when != b = e4
 | 
			
		||||
-e1.data = b;
 | 
			
		||||
|
 | 
			
		||||
-e1.data = b;
 | 
			
		||||
... when != a = e5
 | 
			
		||||
-e1.function = a;
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@r1 exists@
 | 
			
		||||
identifier f;
 | 
			
		||||
position p;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
f(...) { ... when any
 | 
			
		||||
  init_timer@p(...)
 | 
			
		||||
  ... when any
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@r2 exists@
 | 
			
		||||
identifier g != r1.f;
 | 
			
		||||
struct timer_list t;
 | 
			
		||||
expression e8;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
g(...) { ... when any
 | 
			
		||||
  t.data = e8
 | 
			
		||||
  ... when any
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// It is dangerous to use setup_timer if data field is initialized
 | 
			
		||||
// in another function.
 | 
			
		||||
 | 
			
		||||
@script:python depends on r2@
 | 
			
		||||
p << r1.p;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
cocci.include_match(False)
 | 
			
		||||
 | 
			
		||||
@r3 depends on patch && !context && !org && !report@
 | 
			
		||||
expression e6, e7, c;
 | 
			
		||||
position r1.p;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
-init_timer@p (&e6);
 | 
			
		||||
+setup_timer (&e6, c, 0UL);
 | 
			
		||||
... when != c = e7
 | 
			
		||||
-e6.function = c;
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@match_immediate_function_data_after_init_timer_context
 | 
			
		||||
depends on !patch && (context || org || report)@
 | 
			
		||||
expression da, e, func;
 | 
			
		||||
position j0, j1, j2;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
* init_timer@j0 (&e);
 | 
			
		||||
(
 | 
			
		||||
* e@j1.function = func;
 | 
			
		||||
* e@j2.data = da;
 | 
			
		||||
|
 | 
			
		||||
* e@j1.data = da;
 | 
			
		||||
* e@j2.function = func;
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@match_function_and_data_after_init_timer_context
 | 
			
		||||
depends on !patch &&
 | 
			
		||||
!match_immediate_function_data_after_init_timer_context &&
 | 
			
		||||
(context || org || report)@
 | 
			
		||||
expression a, b, e1, e2, e3, e4, e5;
 | 
			
		||||
position j0, j1, j2;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
* init_timer@j0 (&e1);
 | 
			
		||||
... when != a = e2
 | 
			
		||||
    when != b = e3
 | 
			
		||||
(
 | 
			
		||||
* e1@j1.function = a;
 | 
			
		||||
... when != b = e4
 | 
			
		||||
* e1@j2.data = b;
 | 
			
		||||
|
 | 
			
		||||
* e1@j1.data = b;
 | 
			
		||||
... when != a = e5
 | 
			
		||||
* e1@j2.function = a;
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@r3_context depends on !patch &&
 | 
			
		||||
!match_immediate_function_data_after_init_timer_context &&
 | 
			
		||||
!match_function_and_data_after_init_timer_context &&
 | 
			
		||||
(context || org || report)@
 | 
			
		||||
expression c, e6, e7;
 | 
			
		||||
position r1.p;
 | 
			
		||||
position j0, j1;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
* init_timer@j0@p (&e6);
 | 
			
		||||
... when != c = e7
 | 
			
		||||
* e6@j1.function = c;
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@script:python match_immediate_function_data_after_init_timer_org
 | 
			
		||||
depends on org@
 | 
			
		||||
j0 << match_immediate_function_data_after_init_timer_context.j0;
 | 
			
		||||
j1 << match_immediate_function_data_after_init_timer_context.j1;
 | 
			
		||||
j2 << match_immediate_function_data_after_init_timer_context.j2;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function."
 | 
			
		||||
coccilib.org.print_todo(j0[0], msg)
 | 
			
		||||
coccilib.org.print_link(j1[0], "")
 | 
			
		||||
coccilib.org.print_link(j2[0], "")
 | 
			
		||||
 | 
			
		||||
@script:python match_function_and_data_after_init_timer_org depends on org@
 | 
			
		||||
j0 << match_function_and_data_after_init_timer_context.j0;
 | 
			
		||||
j1 << match_function_and_data_after_init_timer_context.j1;
 | 
			
		||||
j2 << match_function_and_data_after_init_timer_context.j2;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function."
 | 
			
		||||
coccilib.org.print_todo(j0[0], msg)
 | 
			
		||||
coccilib.org.print_link(j1[0], "")
 | 
			
		||||
coccilib.org.print_link(j2[0], "")
 | 
			
		||||
 | 
			
		||||
@script:python r3_org depends on org@
 | 
			
		||||
j0 << r3_context.j0;
 | 
			
		||||
j1 << r3_context.j1;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function."
 | 
			
		||||
coccilib.org.print_todo(j0[0], msg)
 | 
			
		||||
coccilib.org.print_link(j1[0], "")
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@script:python match_immediate_function_data_after_init_timer_report
 | 
			
		||||
depends on report@
 | 
			
		||||
j0 << match_immediate_function_data_after_init_timer_context.j0;
 | 
			
		||||
j1 << match_immediate_function_data_after_init_timer_context.j1;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function for function on line %s." % (j1[0].line)
 | 
			
		||||
coccilib.report.print_report(j0[0], msg)
 | 
			
		||||
 | 
			
		||||
@script:python match_function_and_data_after_init_timer_report depends on report@
 | 
			
		||||
j0 << match_function_and_data_after_init_timer_context.j0;
 | 
			
		||||
j1 << match_function_and_data_after_init_timer_context.j1;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function for function on line %s." % (j1[0].line)
 | 
			
		||||
coccilib.report.print_report(j0[0], msg)
 | 
			
		||||
 | 
			
		||||
@script:python r3_report depends on report@
 | 
			
		||||
j0 << r3_context.j0;
 | 
			
		||||
j1 << r3_context.j1;
 | 
			
		||||
@@
 | 
			
		||||
 | 
			
		||||
msg = "Use setup_timer function for function on line %s." % (j1[0].line)
 | 
			
		||||
coccilib.report.print_report(j0[0], msg)
 | 
			
		||||
		Loading…
	
		Reference in a new issue