/// 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) lected='selected'>includemode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-01-24 16:54:39 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2017-01-24 16:54:39 -0800
commit883af14e67e8b8702b5560aa64c888c0cd0bd66c (patch)
tree74e3a6b53f5fad9f7848ab1b9f6921b7012940a4 /tools/perf/tests/attr
parent0263d4ebd94b36280608e296cba39b924b6e832b (diff)
parentaab45453ff5c77200c6da4ac909f7a4392aed17e (diff)
Merge branch 'akpm' (patches from Andrew)
Merge fixes from Andrew Morton: "26 fixes" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (26 commits) MAINTAINERS: add Dan Streetman to zbud maintainers MAINTAINERS: add Dan Streetman to zswap maintainers mm: do not export ioremap_page_range symbol for external module mn10300: fix build error of missing fpu_save() romfs: use different way to generate fsid for BLOCK or MTD frv: add missing atomic64 operations mm, page_alloc: fix premature OOM when racing with cpuset mems update mm, page_alloc: move cpuset seqcount checking to slowpath mm, page_alloc: fix fast-path race with cpuset update or removal mm, page_alloc: fix check for NULL preferred_zone kernel/panic.c: add missing \n fbdev: color map copying bounds checking frv: add atomic64_add_unless() mm/mempolicy.c: do not put mempolicy before using its nodemask radix-tree: fix private list warnings Documentation/filesystems/proc.txt: add VmPin mm, memcg: do not retry precharge charges proc: add a schedule point in proc_pid_readdir() mm: alloc_contig: re-allow CMA to compact FS pages mm/slub.c: trace free objects at KERN_INFO ...
Diffstat (limited to 'tools/perf/tests/attr')