@@ -164,10 +164,10 @@ m4_define([COMMON_PATCH_HEADER], [dnl
Signed-off-by: A
---
- diff --git a/A.c b/A.c
+ diff --git a/$([[ ! -z "$1" ]] && echo "$1" || echo "A.c") b/$([[ ! -z "$1" ]] && echo "$1" || echo "A.c")
index 0000000..1111111 100644
- --- a/A.c
- +++ b/A.c
+ --- a/$([[ ! -z "$1" ]] && echo "$1" || echo "A.c")
+ +++ b/$([[ ! -z "$1" ]] && echo "$1" || echo "A.c")
@@ -1,1 +1,1 @@])
@@ -348,6 +348,24 @@ try_checkpatch \
AT_CLEANUP
+AT_SETUP([checkpatch - check misuse APIs])
+try_checkpatch \
+ "COMMON_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 \
+ "COMMON_PATCH_HEADER([lib/ovs-rcu.c])
+ + ovsrcu_barrier();
+ "
+
+AT_CLEANUP
+
AT_SETUP([checkpatch - whitespace around cast])
try_checkpatch \
"COMMON_PATCH_HEADER
@@ -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