Signed-off-by: Peng He <hepeng.0...@bytedance.com> Signed-off-by: Peng He <xnhp0...@gmail.com> Acked-by: Eelco Chaudron <echau...@redhat.com> Acked-by: Aaron Conole <acon...@redhat.com> --- tests/checkpatch.at | 29 +++++++++++++++++++++++++++++ utilities/checkpatch.py | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/tests/checkpatch.at b/tests/checkpatch.at index fadb625e9..f77a55d76 100755 --- a/tests/checkpatch.at +++ b/tests/checkpatch.at @@ -170,6 +170,17 @@ m4_define([COMMON_PATCH_HEADER], [dnl +++ b/A.c @@ -1,1 +1,1 @@]) +m4_define([PATCH_HEADER], [dnl + Author: A + + Signed-off-by: A + --- + diff --git a/$1 b/$1 + index 0000000..1111111 100644 + --- a/$1 + +++ b/$1 + @@ -1,1 +1,1 @@]) + AT_SETUP([checkpatch - parenthesized constructs]) for ctr in 'if' 'while' 'switch' 'HMAP_FOR_EACH' 'BITMAP_FOR_EACH_1'; do @@ -348,6 +359,24 @@ try_checkpatch \ AT_CLEANUP +AT_SETUP([checkpatch - check misuse APIs]) +try_checkpatch \ + "PATCH_HEADER([a.c]) + + ovsrcu_barrier(); + " \ + "WARNING: Are you sure you need to use ovsrcu_barrier(), "\ +"in most cases ovsrcu_synchronize() will be fine? + #8 FILE: a.c:1: + ovsrcu_barrier(); +" + +try_checkpatch \ + "PATCH_HEADER([lib/ovs-rcu.c]) + + ovsrcu_barrier(); + " + +AT_CLEANUP + AT_SETUP([checkpatch - whitespace around cast]) try_checkpatch \ "COMMON_PATCH_HEADER diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py index 8c7faa419..8c02ac3ce 100755 --- a/utilities/checkpatch.py +++ b/utilities/checkpatch.py @@ -620,6 +620,10 @@ def regex_error_factory(description): return lambda: print_error(description) +def regex_warn_factory(description): + return lambda: print_warning(description) + + std_functions = [ ('malloc', 'Use xmalloc() in place of malloc()'), ('calloc', 'Use xcalloc() in place of calloc()'), @@ -636,6 +640,7 @@ std_functions = [ ('assert', 'Use ovs_assert() in place of assert()'), ('error', 'Use ovs_error() in place of error()'), ] + checks += [ {'regex': r'(\.c|\.h)(\.in)?$', 'match_name': None, @@ -644,6 +649,21 @@ checks += [ 'print': regex_error_factory(description)} for (function_name, description) in std_functions] +easy_to_misuse_api = [ + ('ovsrcu_barrier', + 'lib/ovs-rcu.c', + 'Are you sure you need to use ovsrcu_barrier(), ' + 'in most cases ovsrcu_synchronize() will be fine?'), + ] + +checks += [ + {'regex': r'(\.c)(\.in)?$', + 'match_name': lambda x: x != location, + 'prereq': lambda x: not is_comment_line(x), + 'check': regex_function_factory(function_name), + 'print': regex_warn_factory(description)} + for (function_name, location, description) in easy_to_misuse_api] + def regex_operator_factory(operator): regex = re.compile(r'^[^#][^"\']*[^ "]%s[^ "\'][^"]*' % operator) @@ -676,12 +696,22 @@ def get_file_type_checks(filename): global checks checkList = [] for check in checks: + regex_check = True + match_check = True + if check['regex'] is None and check['match_name'] is None: checkList.append(check) + continue + if check['regex'] is not None and \ - re.compile(check['regex']).search(filename) is not None: - checkList.append(check) - elif check['match_name'] is not None and check['match_name'](filename): + re.compile(check['regex']).search(filename) is None: + regex_check = False + + if check['match_name'] is not None and \ + not check['match_name'](filename): + match_check = False + + if regex_check and match_check: checkList.append(check) return checkList -- 2.25.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev