diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3465-treewide-setup_timer-timer_setup-2-field.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3465-treewide-setup_timer-timer_setup-2-field.patch | 454 |
1 files changed, 454 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3465-treewide-setup_timer-timer_setup-2-field.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3465-treewide-setup_timer-timer_setup-2-field.patch new file mode 100644 index 00000000..54b44b64 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3465-treewide-setup_timer-timer_setup-2-field.patch @@ -0,0 +1,454 @@ +From 3426c5a0a2499077b60aebd2d598297774bb9df2 Mon Sep 17 00:00:00 2001 +From: Kees Cook <keescook@chromium.org> +Date: Tue, 17 Oct 2017 20:21:24 -0700 +Subject: [PATCH 3465/4131] treewide: setup_timer() -> timer_setup() (2 field) + +This converts all remaining setup_timer() calls that use a nested field +to reach a struct timer_list. Coccinelle does not have an easy way to +match multiple fields, so a new script is needed to change the matches of +"&_E->_timer" into "&_E->_field1._timer" in all the rules. + +spatch --very-quiet --all-includes --include-headers \ + -I ./arch/x86/include -I ./arch/x86/include/generated \ + -I ./include -I ./arch/x86/include/uapi \ + -I ./arch/x86/include/generated/uapi -I ./include/uapi \ + -I ./include/generated/uapi --include ./include/linux/kconfig.h \ + --dir . \ + --cocci-file ~/src/data/timer_setup-2fields.cocci + +@fix_address_of depends@ +expression e; +@@ + + setup_timer( +-&(e) ++&e + , ...) + +// Update any raw setup_timer() usages that have a NULL callback, but +// would otherwise match change_timer_function_usage, since the latter +// will update all function assignments done in the face of a NULL +// function initialization in setup_timer(). +@change_timer_function_usage_NULL@ +expression _E; +identifier _field1; +identifier _timer; +type _cast_data; +@@ + +( +-setup_timer(&_E->_field1._timer, NULL, _E); ++timer_setup(&_E->_field1._timer, NULL, 0); +| +-setup_timer(&_E->_field1._timer, NULL, (_cast_data)_E); ++timer_setup(&_E->_field1._timer, NULL, 0); +| +-setup_timer(&_E._field1._timer, NULL, &_E); ++timer_setup(&_E._field1._timer, NULL, 0); +| +-setup_timer(&_E._field1._timer, NULL, (_cast_data)&_E); ++timer_setup(&_E._field1._timer, NULL, 0); +) + +@change_timer_function_usage@ +expression _E; +identifier _field1; +identifier _timer; +struct timer_list _stl; +identifier _callback; +type _cast_func, _cast_data; +@@ + +( +-setup_timer(&_E->_field1._timer, _callback, _E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, &_callback, _E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, _callback, (_cast_data)_E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, &_callback, (_cast_data)_E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, (_cast_func)_callback, _E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, (_cast_func)&_callback, _E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, (_cast_func)_callback, (_cast_data)_E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, (_cast_func)&_callback, (_cast_data)_E); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, _callback, (_cast_data)_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, _callback, (_cast_data)&_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, &_callback, (_cast_data)_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, &_callback, (_cast_data)&_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, (_cast_func)_callback, (_cast_data)_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, (_cast_func)_callback, (_cast_data)&_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, (_cast_func)&_callback, (_cast_data)_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, (_cast_func)&_callback, (_cast_data)&_E); ++timer_setup(&_E._field1._timer, _callback, 0); +| + _E->_field1._timer@_stl.function = _callback; +| + _E->_field1._timer@_stl.function = &_callback; +| + _E->_field1._timer@_stl.function = (_cast_func)_callback; +| + _E->_field1._timer@_stl.function = (_cast_func)&_callback; +| + _E._field1._timer@_stl.function = _callback; +| + _E._field1._timer@_stl.function = &_callback; +| + _E._field1._timer@_stl.function = (_cast_func)_callback; +| + _E._field1._timer@_stl.function = (_cast_func)&_callback; +) + +// callback(unsigned long arg) +@change_callback_handle_cast + depends on change_timer_function_usage@ +identifier change_timer_function_usage._callback; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +type _origtype; +identifier _origarg; +type _handletype; +identifier _handle; +@@ + + void _callback( +-_origtype _origarg ++struct timer_list *t + ) + { +( + ... when != _origarg + _handletype *_handle = +-(_handletype *)_origarg; ++from_timer(_handle, t, _field1._timer); + ... when != _origarg +| + ... when != _origarg + _handletype *_handle = +-(void *)_origarg; ++from_timer(_handle, t, _field1._timer); + ... when != _origarg +| + ... when != _origarg + _handletype *_handle; + ... when != _handle + _handle = +-(_handletype *)_origarg; ++from_timer(_handle, t, _field1._timer); + ... when != _origarg +| + ... when != _origarg + _handletype *_handle; + ... when != _handle + _handle = +-(void *)_origarg; ++from_timer(_handle, t, _field1._timer); + ... when != _origarg +) + } + +// callback(unsigned long arg) without existing variable +@change_callback_handle_cast_no_arg + depends on change_timer_function_usage && + !change_callback_handle_cast@ +identifier change_timer_function_usage._callback; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +type _origtype; +identifier _origarg; +type _handletype; +@@ + + void _callback( +-_origtype _origarg ++struct timer_list *t + ) + { ++ _handletype *_origarg = from_timer(_origarg, t, _field1._timer); ++ + ... when != _origarg +- (_handletype *)_origarg ++ _origarg + ... when != _origarg + } + +// Avoid already converted callbacks. +@match_callback_converted + depends on change_timer_function_usage && + !change_callback_handle_cast && + !change_callback_handle_cast_no_arg@ +identifier change_timer_function_usage._callback; +identifier t; +@@ + + void _callback(struct timer_list *t) + { ... } + +// callback(struct something *handle) +@change_callback_handle_arg + depends on change_timer_function_usage && + !match_callback_converted && + !change_callback_handle_cast && + !change_callback_handle_cast_no_arg@ +identifier change_timer_function_usage._callback; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +type _handletype; +identifier _handle; +@@ + + void _callback( +-_handletype *_handle ++struct timer_list *t + ) + { ++ _handletype *_handle = from_timer(_handle, t, _field1._timer); + ... + } + +// If change_callback_handle_arg ran on an empty function, remove +// the added handler. +@unchange_callback_handle_arg + depends on change_timer_function_usage && + change_callback_handle_arg@ +identifier change_timer_function_usage._callback; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +type _handletype; +identifier _handle; +identifier t; +@@ + + void _callback(struct timer_list *t) + { +- _handletype *_handle = from_timer(_handle, t, _field1._timer); + } + +// We only want to refactor the setup_timer() data argument if we've found +// the matching callback. This undoes changes in change_timer_function_usage. +@unchange_timer_function_usage + depends on change_timer_function_usage && + !change_callback_handle_cast && + !change_callback_handle_cast_no_arg && + !change_callback_handle_arg@ +expression change_timer_function_usage._E; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +identifier change_timer_function_usage._callback; +type change_timer_function_usage._cast_data; +@@ + +( +-timer_setup(&_E->_field1._timer, _callback, 0); ++setup_timer(&_E->_field1._timer, _callback, (_cast_data)_E); +| +-timer_setup(&_E._field1._timer, _callback, 0); ++setup_timer(&_E._field1._timer, _callback, (_cast_data)&_E); +) + +// If we fixed a callback from a .function assignment, fix the +// assignment cast now. +@change_timer_function_assignment + depends on change_timer_function_usage && + (change_callback_handle_cast || + change_callback_handle_cast_no_arg || + change_callback_handle_arg)@ +expression change_timer_function_usage._E; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +identifier change_timer_function_usage._callback; +type _cast_func; +typedef TIMER_FUNC_TYPE; +@@ + +( + _E->_field1._timer.function = +-_callback ++(TIMER_FUNC_TYPE)_callback + ; +| + _E->_field1._timer.function = +-&_callback ++(TIMER_FUNC_TYPE)_callback + ; +| + _E->_field1._timer.function = +-(_cast_func)_callback; ++(TIMER_FUNC_TYPE)_callback + ; +| + _E->_field1._timer.function = +-(_cast_func)&_callback ++(TIMER_FUNC_TYPE)_callback + ; +| + _E._field1._timer.function = +-_callback ++(TIMER_FUNC_TYPE)_callback + ; +| + _E._field1._timer.function = +-&_callback; ++(TIMER_FUNC_TYPE)_callback + ; +| + _E._field1._timer.function = +-(_cast_func)_callback ++(TIMER_FUNC_TYPE)_callback + ; +| + _E._field1._timer.function = +-(_cast_func)&_callback ++(TIMER_FUNC_TYPE)_callback + ; +) + +// Sometimes timer functions are called directly. Replace matched args. +@change_timer_function_calls + depends on change_timer_function_usage && + (change_callback_handle_cast || + change_callback_handle_cast_no_arg || + change_callback_handle_arg)@ +expression _E; +identifier change_timer_function_usage._field1; +identifier change_timer_function_usage._timer; +identifier change_timer_function_usage._callback; +type _cast_data; +@@ + + _callback( +( +-(_cast_data)_E ++&_E->_field1._timer +| +-(_cast_data)&_E ++&_E._field1._timer +| +-_E ++&_E->_field1._timer +) + ) + +// If a timer has been configured without a data argument, it can be +// converted without regard to the callback argument, since it is unused. +@match_timer_function_unused_data@ +expression _E; +identifier _field1; +identifier _timer; +identifier _callback; +@@ + +( +-setup_timer(&_E->_field1._timer, _callback, 0); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, _callback, 0L); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E->_field1._timer, _callback, 0UL); ++timer_setup(&_E->_field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, _callback, 0); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, _callback, 0L); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_E._field1._timer, _callback, 0UL); ++timer_setup(&_E._field1._timer, _callback, 0); +| +-setup_timer(&_field1._timer, _callback, 0); ++timer_setup(&_field1._timer, _callback, 0); +| +-setup_timer(&_field1._timer, _callback, 0L); ++timer_setup(&_field1._timer, _callback, 0); +| +-setup_timer(&_field1._timer, _callback, 0UL); ++timer_setup(&_field1._timer, _callback, 0); +| +-setup_timer(_field1._timer, _callback, 0); ++timer_setup(_field1._timer, _callback, 0); +| +-setup_timer(_field1._timer, _callback, 0L); ++timer_setup(_field1._timer, _callback, 0); +| +-setup_timer(_field1._timer, _callback, 0UL); ++timer_setup(_field1._timer, _callback, 0); +) + +@change_callback_unused_data + depends on match_timer_function_unused_data@ +identifier match_timer_function_unused_data._callback; +type _origtype; +identifier _origarg; +@@ + + void _callback( +-_origtype _origarg ++struct timer_list *unused + ) + { + ... when != _origarg + } + +Signed-off-by: Kees Cook <keescook@chromium.org> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +index 698ad42..97449e0 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +@@ -268,9 +268,10 @@ void amdgpu_fence_process(struct amdgpu_ring *ring) + * + * Checks for fence activity. + */ +-static void amdgpu_fence_fallback(unsigned long arg) ++static void amdgpu_fence_fallback(struct timer_list *t) + { +- struct amdgpu_ring *ring = (void *)arg; ++ struct amdgpu_ring *ring = from_timer(ring, t, ++ fence_drv.fallback_timer); + + amdgpu_fence_process(ring); + } +@@ -422,8 +423,7 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring, + atomic_set(&ring->fence_drv.last_seq, 0); + ring->fence_drv.initialized = false; + +- setup_timer(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback, +- (unsigned long)ring); ++ timer_setup(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback, 0); + + ring->fence_drv.num_fences_mask = num_hw_submission * 2 - 1; + spin_lock_init(&ring->fence_drv.lock); +-- +2.7.4 + |