···11+// SPDX-License-Identifier: GPL-2.0-only22+///33+/// Find if/else condition with kmalloc/vmalloc calls.44+/// Suggest to use kvmalloc instead. Same for kvfree.55+///66+// Confidence: High77+// Copyright: (C) 2020 Denis Efremov ISPRAS88+// Options: --no-includes --include-headers99+//1010+1111+virtual patch1212+virtual report1313+virtual org1414+virtual context1515+1616+@initialize:python@1717+@@1818+filter = frozenset(['kvfree'])1919+2020+def relevant(p):2121+ return not (filter & {el.current_element for el in p})2222+2323+@kvmalloc depends on !patch@2424+expression E, E1, size;2525+identifier flags;2626+binary operator cmp = {<=, <, ==, >, >=};2727+identifier x;2828+type T;2929+position p;3030+@@3131+3232+(3333+* if (size cmp E1 || ...)@p {3434+ ...3535+* E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|3636+* kmalloc_array\|kmalloc_array_node\|kcalloc_node\)3737+* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...)3838+ ...3939+ } else {4040+ ...4141+* E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)4242+ ...4343+ }4444+|4545+* E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|4646+* kmalloc_array\|kmalloc_array_node\|kcalloc_node\)4747+* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...)4848+ ... when != E = E14949+ when != size = E15050+ when any5151+* if (E == NULL)@p {5252+ ...5353+* E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)5454+ ...5555+ }5656+|5757+* T x = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|5858+* kmalloc_array\|kmalloc_array_node\|kcalloc_node\)5959+* (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...);6060+ ... when != x = E16161+ when != size = E16262+ when any6363+* if (x == NULL)@p {6464+ ...6565+* x = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)6666+ ...6767+ }6868+)6969+7070+@kvfree depends on !patch@7171+expression E;7272+position p : script:python() { relevant(p) };7373+@@7474+7575+* if (is_vmalloc_addr(E))@p {7676+ ...7777+* vfree(E)7878+ ...7979+ } else {8080+ ... when != krealloc(E, ...)8181+ when any8282+* \(kfree\|kzfree\)(E)8383+ ...8484+ }8585+8686+@depends on patch@8787+expression E, E1, size, node;8888+binary operator cmp = {<=, <, ==, >, >=};8989+identifier flags, x;9090+type T;9191+@@9292+9393+(9494+- if (size cmp E1)9595+- E = kmalloc(size, flags);9696+- else9797+- E = vmalloc(size);9898++ E = kvmalloc(size, flags);9999+|100100+- if (size cmp E1)101101+- E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));102102+- else103103+- E = vmalloc(size);104104++ E = kvmalloc(size, GFP_KERNEL);105105+|106106+- E = kmalloc(size, flags | __GFP_NOWARN);107107+- if (E == NULL)108108+- E = vmalloc(size);109109++ E = kvmalloc(size, flags);110110+|111111+- E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));112112+- if (E == NULL)113113+- E = vmalloc(size);114114++ E = kvmalloc(size, GFP_KERNEL);115115+|116116+- T x = kmalloc(size, flags | __GFP_NOWARN);117117+- if (x == NULL)118118+- x = vmalloc(size);119119++ T x = kvmalloc(size, flags);120120+|121121+- T x = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));122122+- if (x == NULL)123123+- x = vmalloc(size);124124++ T x = kvmalloc(size, GFP_KERNEL);125125+|126126+- if (size cmp E1)127127+- E = kzalloc(size, flags);128128+- else129129+- E = vzalloc(size);130130++ E = kvzalloc(size, flags);131131+|132132+- if (size cmp E1)133133+- E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));134134+- else135135+- E = vzalloc(size);136136++ E = kvzalloc(size, GFP_KERNEL);137137+|138138+- E = kzalloc(size, flags | __GFP_NOWARN);139139+- if (E == NULL)140140+- E = vzalloc(size);141141++ E = kvzalloc(size, flags);142142+|143143+- E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));144144+- if (E == NULL)145145+- E = vzalloc(size);146146++ E = kvzalloc(size, GFP_KERNEL);147147+|148148+- T x = kzalloc(size, flags | __GFP_NOWARN);149149+- if (x == NULL)150150+- x = vzalloc(size);151151++ T x = kvzalloc(size, flags);152152+|153153+- T x = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));154154+- if (x == NULL)155155+- x = vzalloc(size);156156++ T x = kvzalloc(size, GFP_KERNEL);157157+|158158+- if (size cmp E1)159159+- E = kmalloc_node(size, flags, node);160160+- else161161+- E = vmalloc_node(size, node);162162++ E = kvmalloc_node(size, flags, node);163163+|164164+- if (size cmp E1)165165+- E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);166166+- else167167+- E = vmalloc_node(size, node);168168++ E = kvmalloc_node(size, GFP_KERNEL, node);169169+|170170+- E = kmalloc_node(size, flags | __GFP_NOWARN, node);171171+- if (E == NULL)172172+- E = vmalloc_node(size, node);173173++ E = kvmalloc_node(size, flags, node);174174+|175175+- E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);176176+- if (E == NULL)177177+- E = vmalloc_node(size, node);178178++ E = kvmalloc_node(size, GFP_KERNEL, node);179179+|180180+- T x = kmalloc_node(size, flags | __GFP_NOWARN, node);181181+- if (x == NULL)182182+- x = vmalloc_node(size, node);183183++ T x = kvmalloc_node(size, flags, node);184184+|185185+- T x = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);186186+- if (x == NULL)187187+- x = vmalloc_node(size, node);188188++ T x = kvmalloc_node(size, GFP_KERNEL, node);189189+|190190+- if (size cmp E1)191191+- E = kvzalloc_node(size, flags, node);192192+- else193193+- E = vzalloc_node(size, node);194194++ E = kvzalloc_node(size, flags, node);195195+|196196+- if (size cmp E1)197197+- E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);198198+- else199199+- E = vzalloc_node(size, node);200200++ E = kvzalloc_node(size, GFP_KERNEL, node);201201+|202202+- E = kvzalloc_node(size, flags | __GFP_NOWARN, node);203203+- if (E == NULL)204204+- E = vzalloc_node(size, node);205205++ E = kvzalloc_node(size, flags, node);206206+|207207+- E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);208208+- if (E == NULL)209209+- E = vzalloc_node(size, node);210210++ E = kvzalloc_node(size, GFP_KERNEL, node);211211+|212212+- T x = kvzalloc_node(size, flags | __GFP_NOWARN, node);213213+- if (x == NULL)214214+- x = vzalloc_node(size, node);215215++ T x = kvzalloc_node(size, flags, node);216216+|217217+- T x = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);218218+- if (x == NULL)219219+- x = vzalloc_node(size, node);220220++ T x = kvzalloc_node(size, GFP_KERNEL, node);221221+)222222+223223+@depends on patch@224224+expression E;225225+position p : script:python() { relevant(p) };226226+@@227227+228228+- if (is_vmalloc_addr(E))@p229229+- vfree(E);230230+- else231231+- kfree(E);232232++ kvfree(E);233233+234234+@script: python depends on report@235235+p << kvmalloc.p;236236+@@237237+238238+coccilib.report.print_report(p[0], "WARNING opportunity for kvmalloc")239239+240240+@script: python depends on org@241241+p << kvmalloc.p;242242+@@243243+244244+coccilib.org.print_todo(p[0], "WARNING opportunity for kvmalloc")245245+246246+@script: python depends on report@247247+p << kvfree.p;248248+@@249249+250250+coccilib.report.print_report(p[0], "WARNING opportunity for kvfree")251251+252252+@script: python depends on org@253253+p << kvfree.p;254254+@@255255+256256+coccilib.org.print_todo(p[0], "WARNING opportunity for kvfree")