pm_runtime.cocci 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE
  3. ///
  4. // Keywords: pm_runtime
  5. // Confidence: Medium
  6. // Copyright (C) 2013 Texas Instruments Incorporated -
  7. // URL: https://coccinelle.gitlabpages.inria.fr/website
  8. // Options: --include-headers
  9. virtual patch
  10. virtual context
  11. virtual org
  12. virtual report
  13. //----------------------------------------------------------
  14. // Detection
  15. //----------------------------------------------------------
  16. @runtime_bad_err_handle exists@
  17. expression ret;
  18. position p;
  19. @@
  20. (
  21. ret@p = \(pm_runtime_idle\|
  22. pm_runtime_suspend\|
  23. pm_runtime_autosuspend\|
  24. pm_runtime_resume\|
  25. pm_request_idle\|
  26. pm_request_resume\|
  27. pm_request_autosuspend\|
  28. pm_runtime_get\|
  29. pm_runtime_get_sync\|
  30. pm_runtime_put\|
  31. pm_runtime_put_autosuspend\|
  32. pm_runtime_put_sync\|
  33. pm_runtime_put_sync_suspend\|
  34. pm_runtime_put_sync_autosuspend\|
  35. pm_runtime_set_active\|
  36. pm_schedule_suspend\|
  37. pm_runtime_barrier\|
  38. pm_generic_runtime_suspend\|
  39. pm_generic_runtime_resume\)(...);
  40. ...
  41. IS_ERR_VALUE(ret)
  42. ...
  43. )
  44. //----------------------------------------------------------
  45. // For context mode
  46. //----------------------------------------------------------
  47. @depends on context@
  48. identifier pm_runtime_api;
  49. expression ret;
  50. position runtime_bad_err_handle.p;
  51. @@
  52. (
  53. ret@p = pm_runtime_api(...);
  54. ...
  55. * IS_ERR_VALUE(ret)
  56. ...
  57. )
  58. //----------------------------------------------------------
  59. // For patch mode
  60. //----------------------------------------------------------
  61. @depends on patch@
  62. identifier pm_runtime_api;
  63. expression ret;
  64. position runtime_bad_err_handle.p;
  65. @@
  66. (
  67. ret@p = pm_runtime_api(...);
  68. ...
  69. - IS_ERR_VALUE(ret)
  70. + ret < 0
  71. ...
  72. )
  73. //----------------------------------------------------------
  74. // For org and report mode
  75. //----------------------------------------------------------
  76. @r depends on (org || report) exists@
  77. position p1, p2;
  78. identifier pm_runtime_api;
  79. expression ret;
  80. position runtime_bad_err_handle.p;
  81. @@
  82. (
  83. ret@p = pm_runtime_api@p1(...);
  84. ...
  85. IS_ERR_VALUE@p2(ret)
  86. ...
  87. )
  88. @script:python depends on org@
  89. p1 << r.p1;
  90. p2 << r.p2;
  91. pm_runtime_api << r.pm_runtime_api;
  92. @@
  93. cocci.print_main(pm_runtime_api,p1)
  94. cocci.print_secs("IS_ERR_VALUE",p2)
  95. @script:python depends on report@
  96. p1 << r.p1;
  97. p2 << r.p2;
  98. pm_runtime_api << r.pm_runtime_api;
  99. @@
  100. msg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line)
  101. coccilib.report.print_report(p1[0],msg)