2015-05-17 00:06:43

by Dmitry Kalinkin

[permalink] [raw]
Subject: [PATCH] coccinelle: api: add vma_pages.cocci

This semantic patch replaces explicit computations of vma page count
with explicit function call.

Signed-off-by: Dmitry Kalinkin <[email protected]>
---
scripts/coccinelle/api/vma_pages.cocci | 66 ++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
create mode 100644 scripts/coccinelle/api/vma_pages.cocci

diff --git a/scripts/coccinelle/api/vma_pages.cocci b/scripts/coccinelle/api/vma_pages.cocci
new file mode 100644
index 0000000..2b7a748
--- /dev/null
+++ b/scripts/coccinelle/api/vma_pages.cocci
@@ -0,0 +1,66 @@
+/// Use vma_pages function on vma object instead of explicit computation.
+// Confidence: High
+// Keywords: vma_pages vma
+
+// Based on resource_size.cocci
+
+virtual context
+virtual patch
+virtual org
+virtual report
+
+//----------------------------------------------------------
+// For context mode
+//----------------------------------------------------------
+
+@r_context depends on context && !patch && !org@
+struct vm_area_struct *vma;
+@@
+
+* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
+
+//----------------------------------------------------------
+// For patch mode
+//----------------------------------------------------------
+
+@r_patch1 depends on !context && patch && !org@
+struct vm_area_struct *vma;
+@@
+
+- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
++ vma_pages(vma)
+
+@r_patch2 depends on !context && patch && !org@
+struct vm_area_struct *vma;
+@@
+
+- (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
++ vma_pages(vma)
+
+//----------------------------------------------------------
+// For org mode
+//----------------------------------------------------------
+
+@r_org depends on !context && !patch && (org || report)@
+struct vm_area_struct *vma;
+position p;
+@@
+
+ (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT
+
+@script:python depends on report@
+p << r_org.p;
+x << r_org.vma;
+@@
+
+msg="ERROR: Missing vma_pages with %s" % (x)
+coccilib.report.print_report(p[0], msg)
+
+@script:python depends on org@
+p << r_org.p;
+x << r_org.vma;
+@@
+
+msg="ERROR with %s" % (x)
+msg_safe=msg.replace("[","@(").replace("]",")")
+coccilib.org.print_todo(p[0], msg_safe)
--
1.8.3.1


2015-05-17 13:39:13

by Julia Lawall

[permalink] [raw]
Subject: Re: [PATCH] coccinelle: api: add vma_pages.cocci



On Sun, 17 May 2015, Dmitry Kalinkin wrote:

> This semantic patch replaces explicit computations of vma page count
> with explicit function call.

Thanks!

> Signed-off-by: Dmitry Kalinkin <[email protected]>
> ---
> scripts/coccinelle/api/vma_pages.cocci | 66 ++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
> create mode 100644 scripts/coccinelle/api/vma_pages.cocci
>
> diff --git a/scripts/coccinelle/api/vma_pages.cocci b/scripts/coccinelle/api/vma_pages.cocci
> new file mode 100644
> index 0000000..2b7a748
> --- /dev/null
> +++ b/scripts/coccinelle/api/vma_pages.cocci
> @@ -0,0 +1,66 @@
> +/// Use vma_pages function on vma object instead of explicit computation.

Add an extra /// here.

> +// Confidence: High
> +// Keywords: vma_pages vma
> +
> +// Based on resource_size.cocci
> +
> +virtual context
> +virtual patch
> +virtual org
> +virtual report
> +
> +//----------------------------------------------------------
> +// For context mode
> +//----------------------------------------------------------
> +
> +@r_context depends on context && !patch && !org@

Add && !report here

> +struct vm_area_struct *vma;
> +@@
> +
> +* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
> +
> +//----------------------------------------------------------
> +// For patch mode
> +//----------------------------------------------------------
> +
> +@r_patch1 depends on !context && patch && !org@

Add && !report here

> +struct vm_area_struct *vma;
> +@@
> +
> +- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
> ++ vma_pages(vma)
> +
> +@r_patch2 depends on !context && patch && !org@
> +struct vm_area_struct *vma;
> +@@
> +
> +- (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
> ++ vma_pages(vma)

This rule is not needed. An isomorphism will allow tha case with ()
around the whole thing to match the case where those parentheses are
absent.

> +//----------------------------------------------------------
> +// For org mode
> +//----------------------------------------------------------
> +
> +@r_org depends on !context && !patch && (org || report)@
> +struct vm_area_struct *vma;
> +position p;
> +@@
> +
> + (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT
> +
> +@script:python depends on report@
> +p << r_org.p;
> +x << r_org.vma;
> +@@
> +
> +msg="ERROR: Missing vma_pages with %s" % (x)

I think that the message is a bit misleading. Something like Use
vma_pages would be better.

> +coccilib.report.print_report(p[0], msg)
> +
> +@script:python depends on org@
> +p << r_org.p;
> +x << r_org.vma;
> +@@
> +
> +msg="ERROR with %s" % (x)
> +msg_safe=msg.replace("[","@(").replace("]",")")
> +coccilib.org.print_todo(p[0], msg_safe)

The message could be the same in this case as in the previous one.

It may be good to put below the keywords:

// Comments:
// Options: --all-includes

This rule relies on type information, ie knowing whether something has
type struct vm_area_struct *, so having more include files available may
make that more apparent. On the other hand, if you think the referenced
thing will always be a local variable (as opposed to a structure field),
then just using the current C file should be good enough, and it will be
faster without the --all-includes option.

I tried the rule replacing struct vm_area_struct *vma; by expression vma
and got a couple of results on other types. One could wonder if that code
could be improved in some way.

julia

2015-05-17 16:20:37

by Dmitry Kalinkin

[permalink] [raw]
Subject: Re: [PATCH] coccinelle: api: add vma_pages.cocci

On Sun, May 17, 2015 at 4:39 PM, Julia Lawall <[email protected]> wrote:
>> +@r_patch2 depends on !context && patch && !org@
>> +struct vm_area_struct *vma;
>> +@@
>> +
>> +- (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
>> ++ vma_pages(vma)
>
> This rule is not needed. An isomorphism will allow tha case with ()
> around the whole thing to match the case where those parentheses are
> absent.
So coccinelle is a real semantic tool and sees the difference between
(vma->vm_end - vma->vm_start) >> PAGE_SHIFT + 3
and
(vma->vm_end - vma->vm_start) >> PAGE_SHIFT & 3
Cool. Didn't realize that.

> It may be good to put below the keywords:
>
> // Comments:
> // Options: --all-includes
>
> This rule relies on type information, ie knowing whether something has
> type struct vm_area_struct *, so having more include files available may
> make that more apparent. On the other hand, if you think the referenced
> thing will always be a local variable (as opposed to a structure field),
> then just using the current C file should be good enough, and it will be
> faster without the --all-includes option.
There probably won't be any benefit in doing that. The statement is long
enough already long enough as it is. So it is unlikely that any code like
(dev->priv->vma->vm_end@p - dev->priv->vma->vm_start) >> PAGE_SHIFT
is to appear.
I also just checked and saw that using --all-includes doesn't produce
additional triggers anywhere on the current code (except for false fire
on mm.h at vma_pages() itself).
>
> I tried the rule replacing struct vm_area_struct *vma; by expression vma
> and got a couple of results on other types. One could wonder if that code
> could be improved in some way.
Indeed, there are such cases. I checked a couple manually and they turned
out to be some different third party structures having fields called vm_end
and vm_start used for vma-related accounting. These may or may not be a
justifiable uses. We could report them, but not propose an automatic patch

Kind regards,
Dmitry

2015-05-17 16:23:49

by Dmitry Kalinkin

[permalink] [raw]
Subject: [PATCHv2] coccinelle: api: add vma_pages.cocci

This semantic patch replaces explicit computations of vma page count
with explicit function call.

Signed-off-by: Dmitry Kalinkin <[email protected]>
---
scripts/coccinelle/api/vma_pages.cocci | 60 ++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
create mode 100644 scripts/coccinelle/api/vma_pages.cocci

diff --git a/scripts/coccinelle/api/vma_pages.cocci b/scripts/coccinelle/api/vma_pages.cocci
new file mode 100644
index 0000000..3e52e11
--- /dev/null
+++ b/scripts/coccinelle/api/vma_pages.cocci
@@ -0,0 +1,60 @@
+///
+/// Use vma_pages function on vma object instead of explicit computation.
+///
+// Confidence: High
+// Keywords: vma_pages vma
+// Comment: Based on resource_size.cocci
+
+virtual context
+virtual patch
+virtual org
+virtual report
+
+//----------------------------------------------------------
+// For context mode
+//----------------------------------------------------------
+
+@r_context depends on context && !patch && !org && !report@
+struct vm_area_struct *vma;
+@@
+
+* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
+
+//----------------------------------------------------------
+// For patch mode
+//----------------------------------------------------------
+
+@r_patch depends on !context && patch && !org && !report@
+struct vm_area_struct *vma;
+@@
+
+- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
++ vma_pages(vma)
+
+//----------------------------------------------------------
+// For org mode
+//----------------------------------------------------------
+
+@r_org depends on !context && !patch && (org || report)@
+struct vm_area_struct *vma;
+position p;
+@@
+
+ (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT
+
+@script:python depends on report@
+p << r_org.p;
+x << r_org.vma;
+@@
+
+msg="WARNING: Consider using vma_pages helper on %s" % (x)
+coccilib.report.print_report(p[0], msg)
+
+@script:python depends on org@
+p << r_org.p;
+x << r_org.vma;
+@@
+
+msg="WARNING: Consider using vma_pages helper on %s" % (x)
+msg_safe=msg.replace("[","@(").replace("]",")")
+coccilib.org.print_todo(p[0], msg_safe)
--
1.8.3.1

2015-05-17 20:25:55

by Julia Lawall

[permalink] [raw]
Subject: Re: [PATCHv2] coccinelle: api: add vma_pages.cocci

Acked-by: Julia Lawall <[email protected]>

Thanks!

On Sun, 17 May 2015, Dmitry Kalinkin wrote:

> This semantic patch replaces explicit computations of vma page count
> with explicit function call.
>
> Signed-off-by: Dmitry Kalinkin <[email protected]>
> ---
> scripts/coccinelle/api/vma_pages.cocci | 60 ++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
> create mode 100644 scripts/coccinelle/api/vma_pages.cocci
>
> diff --git a/scripts/coccinelle/api/vma_pages.cocci b/scripts/coccinelle/api/vma_pages.cocci
> new file mode 100644
> index 0000000..3e52e11
> --- /dev/null
> +++ b/scripts/coccinelle/api/vma_pages.cocci
> @@ -0,0 +1,60 @@
> +///
> +/// Use vma_pages function on vma object instead of explicit computation.
> +///
> +// Confidence: High
> +// Keywords: vma_pages vma
> +// Comment: Based on resource_size.cocci
> +
> +virtual context
> +virtual patch
> +virtual org
> +virtual report
> +
> +//----------------------------------------------------------
> +// For context mode
> +//----------------------------------------------------------
> +
> +@r_context depends on context && !patch && !org && !report@
> +struct vm_area_struct *vma;
> +@@
> +
> +* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT
> +
> +//----------------------------------------------------------
> +// For patch mode
> +//----------------------------------------------------------
> +
> +@r_patch depends on !context && patch && !org && !report@
> +struct vm_area_struct *vma;
> +@@
> +
> +- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
> ++ vma_pages(vma)
> +
> +//----------------------------------------------------------
> +// For org mode
> +//----------------------------------------------------------
> +
> +@r_org depends on !context && !patch && (org || report)@
> +struct vm_area_struct *vma;
> +position p;
> +@@
> +
> + (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT
> +
> +@script:python depends on report@
> +p << r_org.p;
> +x << r_org.vma;
> +@@
> +
> +msg="WARNING: Consider using vma_pages helper on %s" % (x)
> +coccilib.report.print_report(p[0], msg)
> +
> +@script:python depends on org@
> +p << r_org.p;
> +x << r_org.vma;
> +@@
> +
> +msg="WARNING: Consider using vma_pages helper on %s" % (x)
> +msg_safe=msg.replace("[","@(").replace("]",")")
> +coccilib.org.print_todo(p[0], msg_safe)
> --
> 1.8.3.1
>
>

2015-05-21 06:28:22

by Michal Marek

[permalink] [raw]
Subject: Re: [PATCHv2] coccinelle: api: add vma_pages.cocci

Dne 18.5.2015 v 04:25 Julia Lawall napsal(a):
> On Sun, 17 May 2015, Dmitry Kalinkin wrote:
>> This semantic patch replaces explicit computations of vma page count
>> with explicit function call.
>>
>> Signed-off-by: Dmitry Kalinkin <[email protected]>
> Acked-by: Julia Lawall <[email protected]>

Thanks, applied to kbuild.git#misc.

Michal