* [PATCH] greybus: operation: arm the timeout timer before sending the request
@ 2026-10-17 17:17 Nguyen Ngoc Thang
2026-10-18 6:47 ` Greg Kroah-Hartman
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Nguyen Ngoc Thang @ 2026-10-17 17:17 UTC (permalink / raw)
To: Johan Hovold, Alex Elder, Greg Kroah-Hartman
Cc: greybus-dev, linux-kernel, stable, syzbot+a2e50fb40695811c2dab,
Nguyen Ngoc Thang
gb_operation_request_send() sends the request message and only then arms
the operation timer. The host driver can complete the operation before
add_timer() runs, e.g. when the transfer fails right away. The completion
work then calls timer_delete_sync() on a timer that is not armed yet,
the synchronous caller wakes up and drops the last reference, and
the operation is freed while the timer is still pending:
ODEBUG: free active (active state 0) object type: timer_list
hint: gb_operation_timeout+0x0/0xc0
WARNING: lib/debugobjects.c:629 at debug_print_object+0x198/0x2b0
kmem_cache_free+0xfd/0x6d0
gb_operation_sync_timeout+0x1c7/0x270
gb_svc_process_deferred_request+0x5f3/0x1150
Arm the timer before the message is sent. If sending fails, delete the
timer again. If it has already fired, its work is queued and drops the
active and operation references itself, so the error path must not drop
them a second time.
Fixes: dbec27298b0d ("staging: greybus: operation: add generic timeout support")
Cc: stable@vger.kernel.org
Reported-by: syzbot+a2e50fb40695811c2dab@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=a2e50fb40695811c2dab
Signed-off-by: Nguyen Ngoc Thang <ngocthang2710.1999@gmail.com>
---
drivers/greybus/operation.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/greybus/operation.c b/drivers/greybus/operation.c
index 7e12ffb2dd60..19b0cdeca498 100644
--- a/drivers/greybus/operation.c
+++ b/drivers/greybus/operation.c
@@ -766,17 +766,22 @@ int gb_operation_request_send(struct gb_operation *operation,
if (ret)
goto err_put;
- ret = gb_message_send(operation->request, gfp);
- if (ret)
- goto err_put_active;
-
+ /* Arm before sending, as the response may complete the operation at once. */
if (timeout) {
operation->timer.expires = jiffies + msecs_to_jiffies(timeout);
add_timer(&operation->timer);
}
+ ret = gb_message_send(operation->request, gfp);
+ if (ret)
+ goto err_del_timer;
+
return 0;
+err_del_timer:
+ /* A timer that already fired has queued work which drops our references. */
+ if (timeout && !timer_delete_sync(&operation->timer))
+ return ret;
err_put_active:
gb_operation_put_active(operation);
err_put:
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] greybus: operation: arm the timeout timer before sending the request
2026-10-17 17:17 [PATCH] greybus: operation: arm the timeout timer before sending the request Nguyen Ngoc Thang
@ 2026-10-18 6:47 ` Greg Kroah-Hartman
2026-10-18 6:52 ` kernel test robot
2026-10-18 9:27 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: Greg Kroah-Hartman @ 2026-10-18 6:47 UTC (permalink / raw)
To: Nguyen Ngoc Thang
Cc: Johan Hovold, Alex Elder, greybus-dev, linux-kernel, stable,
syzbot+a2e50fb40695811c2dab
On Sun, Oct 18, 2026 at 12:17:43AM +0700, Nguyen Ngoc Thang wrote:
> gb_operation_request_send() sends the request message and only then arms
> the operation timer. The host driver can complete the operation before
> add_timer() runs, e.g. when the transfer fails right away. The completion
> work then calls timer_delete_sync() on a timer that is not armed yet,
> the synchronous caller wakes up and drops the last reference, and
> the operation is freed while the timer is still pending:
>
> ODEBUG: free active (active state 0) object type: timer_list
> hint: gb_operation_timeout+0x0/0xc0
> WARNING: lib/debugobjects.c:629 at debug_print_object+0x198/0x2b0
> kmem_cache_free+0xfd/0x6d0
> gb_operation_sync_timeout+0x1c7/0x270
> gb_svc_process_deferred_request+0x5f3/0x1150
How was this generated and tested?
> Arm the timer before the message is sent. If sending fails, delete the
> timer again. If it has already fired, its work is queued and drops the
> active and operation references itself, so the error path must not drop
> them a second time.
>
> Fixes: dbec27298b0d ("staging: greybus: operation: add generic timeout support")
> Cc: stable@vger.kernel.org
> Reported-by: syzbot+a2e50fb40695811c2dab@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=a2e50fb40695811c2dab
> Signed-off-by: Nguyen Ngoc Thang <ngocthang2710.1999@gmail.com>
> ---
> drivers/greybus/operation.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/greybus/operation.c b/drivers/greybus/operation.c
> index 7e12ffb2dd60..19b0cdeca498 100644
> --- a/drivers/greybus/operation.c
> +++ b/drivers/greybus/operation.c
> @@ -766,17 +766,22 @@ int gb_operation_request_send(struct gb_operation *operation,
> if (ret)
> goto err_put;
>
> - ret = gb_message_send(operation->request, gfp);
> - if (ret)
> - goto err_put_active;
> -
> + /* Arm before sending, as the response may complete the operation at once. */
"Arm" what?
> if (timeout) {
> operation->timer.expires = jiffies + msecs_to_jiffies(timeout);
> add_timer(&operation->timer);
> }
>
> + ret = gb_message_send(operation->request, gfp);
> + if (ret)
> + goto err_del_timer;
> +
> return 0;
>
> +err_del_timer:
> + /* A timer that already fired has queued work which drops our references. */
Why is this comment needed?
> + if (timeout && !timer_delete_sync(&operation->timer))
> + return ret;
Did you just leak this:
> err_put_active:
> gb_operation_put_active(operation);
And again, how was this tested?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] greybus: operation: arm the timeout timer before sending the request
2026-10-17 17:17 [PATCH] greybus: operation: arm the timeout timer before sending the request Nguyen Ngoc Thang
2026-10-18 6:47 ` Greg Kroah-Hartman
@ 2026-10-18 6:52 ` kernel test robot
2026-10-18 9:27 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-10-18 6:52 UTC (permalink / raw)
To: Nguyen Ngoc Thang, Johan Hovold, Alex Elder, Greg Kroah-Hartman
Cc: oe-kbuild-all, greybus-dev, linux-kernel, stable,
syzbot+a2e50fb40695811c2dab, Nguyen Ngoc Thang
Hi Nguyen,
kernel test robot noticed the following build warnings:
[auto build test WARNING on linus/master]
[also build test WARNING on v7.3-rc7 next-20261016]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Nguyen-Ngoc-Thang/greybus-operation-arm-the-timeout-timer-before-sending-the-request/20261018-001743
base: linus/master
patch link: https://lore.kernel.org/r/20261017171743.24612-1-ngocthang2710.1999%40gmail.com
patch subject: [PATCH] greybus: operation: arm the timeout timer before sending the request
config: arc-randconfig-1000-20261018 (https://download.01.org/0day-ci/archive/20261018/202610181452.8uUjB47B-lkp@intel.com/config)
compiler: arc-linux-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261018/202610181452.8uUjB47B-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202610181452.8uUjB47B-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/greybus/operation.c: In function 'gb_operation_request_send':
>> drivers/greybus/operation.c:785:1: warning: label 'err_put_active' defined but not used [-Wunused-label]
785 | err_put_active:
| ^~~~~~~~~~~~~~
vim +/err_put_active +785 drivers/greybus/operation.c
10c69399043351 drivers/staging/greybus/operation.c Alex Elder 2014-11-21 703
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 704 /**
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 705 * gb_operation_request_send() - send an operation request message
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 706 * @operation: the operation to initiate
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 707 * @callback: the operation completion callback
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 708 * @timeout: operation timeout in milliseconds, or zero for no timeout
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 709 * @gfp: the memory flags to use for any allocations
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 710 *
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 711 * The caller has filled in any payload so the request message is ready to go.
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 712 * The callback function supplied will be called when the response message has
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 713 * arrived, a unidirectional request has been sent, or the operation is
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 714 * cancelled, indicating that the operation is complete. The callback function
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 715 * can fetch the result of the operation using gb_operation_result() if
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 716 * desired.
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 717 *
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 718 * Return: 0 if the request was successfully queued in the host-driver queues,
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 719 * or a negative errno.
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 720 */
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 721 int gb_operation_request_send(struct gb_operation *operation,
a52c4352aef855 drivers/staging/greybus/operation.c Johan Hovold 2015-07-01 722 gb_operation_callback callback,
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 723 unsigned int timeout,
a52c4352aef855 drivers/staging/greybus/operation.c Johan Hovold 2015-07-01 724 gfp_t gfp)
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 725 {
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 726 struct gb_connection *connection = operation->connection;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 727 struct gb_operation_msg_hdr *header;
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 728 unsigned int cycle;
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 729 int ret;
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 730
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 731 if (gb_connection_is_offloaded(connection))
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 732 return -EBUSY;
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 733
37754030b0b9f7 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 734 if (!callback)
37754030b0b9f7 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 735 return -EINVAL;
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 736
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 737 /*
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 738 * Record the callback function, which is executed in
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 739 * non-atomic (workqueue) context when the final result
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 740 * of an operation has been set.
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 741 */
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 742 operation->callback = callback;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 743
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 744 /*
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 745 * Assign the operation's id, and store it in the request header.
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 746 * Zero is a reserved operation id for unidirectional operations.
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 747 */
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 748 if (gb_operation_is_unidirectional(operation)) {
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 749 operation->id = 0;
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 750 } else {
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 751 cycle = (unsigned int)atomic_inc_return(&connection->op_cycle);
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 752 operation->id = (u16)(cycle % U16_MAX + 1);
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 753 }
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 754
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 755 header = operation->request->header;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 756 header->operation_id = cpu_to_le16(operation->id);
e8b48d1586abd6 drivers/staging/greybus/operation.c Alex Elder 2014-11-20 757
3deb37d4ad04c6 drivers/staging/greybus/operation.c Alex Elder 2014-11-25 758 gb_operation_result_set(operation, -EINPROGRESS);
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 759
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 760 /*
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 761 * Get an extra reference on the operation. It'll be dropped when the
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 762 * operation completes.
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 763 */
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 764 gb_operation_get(operation);
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 765 ret = gb_operation_get_active(operation);
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 766 if (ret)
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 767 goto err_put;
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 768
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 769 /* Arm before sending, as the response may complete the operation at once. */
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 770 if (timeout) {
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 771 operation->timer.expires = jiffies + msecs_to_jiffies(timeout);
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 772 add_timer(&operation->timer);
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 773 }
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 774
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 775 ret = gb_message_send(operation->request, gfp);
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 776 if (ret)
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 777 goto err_del_timer;
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 778
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 779 return 0;
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 780
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 781 err_del_timer:
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 782 /* A timer that already fired has queued work which drops our references. */
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 783 if (timeout && !timer_delete_sync(&operation->timer))
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 784 return ret;
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 @785 err_put_active:
3eeac7e37ce985 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 786 gb_operation_put_active(operation);
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 787 err_put:
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 788 gb_operation_put(operation);
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 789
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 790 return ret;
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 791 }
1dad6b3515b2ca drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 792 EXPORT_SYMBOL_GPL(gb_operation_request_send);
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 793
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] greybus: operation: arm the timeout timer before sending the request
2026-10-17 17:17 [PATCH] greybus: operation: arm the timeout timer before sending the request Nguyen Ngoc Thang
2026-10-18 6:47 ` Greg Kroah-Hartman
2026-10-18 6:52 ` kernel test robot
@ 2026-10-18 9:27 ` kernel test robot
2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-10-18 9:27 UTC (permalink / raw)
To: Nguyen Ngoc Thang, Johan Hovold, Alex Elder, Greg Kroah-Hartman
Cc: llvm, oe-kbuild-all, greybus-dev, linux-kernel, stable,
syzbot+a2e50fb40695811c2dab, Nguyen Ngoc Thang
Hi Nguyen,
kernel test robot noticed the following build warnings:
[auto build test WARNING on linus/master]
[also build test WARNING on v7.3-rc7 next-20261016]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Nguyen-Ngoc-Thang/greybus-operation-arm-the-timeout-timer-before-sending-the-request/20261018-001743
base: linus/master
patch link: https://lore.kernel.org/r/20261017171743.24612-1-ngocthang2710.1999%40gmail.com
patch subject: [PATCH] greybus: operation: arm the timeout timer before sending the request
config: i386-buildonly-randconfig-1000-20261018 (https://download.01.org/0day-ci/archive/20261018/202610181737.03A4hebl-lkp@intel.com/config)
compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261018/202610181737.03A4hebl-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202610181737.03A4hebl-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/greybus/operation.c:785:1: warning: unused label 'err_put_active' [-Wunused-label]
785 | err_put_active:
| ^~~~~~~~~~~~~~~
1 warning generated.
vim +/err_put_active +785 drivers/greybus/operation.c
10c69399043351 drivers/staging/greybus/operation.c Alex Elder 2014-11-21 703
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 704 /**
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 705 * gb_operation_request_send() - send an operation request message
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 706 * @operation: the operation to initiate
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 707 * @callback: the operation completion callback
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 708 * @timeout: operation timeout in milliseconds, or zero for no timeout
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 709 * @gfp: the memory flags to use for any allocations
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 710 *
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 711 * The caller has filled in any payload so the request message is ready to go.
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 712 * The callback function supplied will be called when the response message has
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 713 * arrived, a unidirectional request has been sent, or the operation is
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 714 * cancelled, indicating that the operation is complete. The callback function
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 715 * can fetch the result of the operation using gb_operation_result() if
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 716 * desired.
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 717 *
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 718 * Return: 0 if the request was successfully queued in the host-driver queues,
613c15e86b7ac3 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 719 * or a negative errno.
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 720 */
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 721 int gb_operation_request_send(struct gb_operation *operation,
a52c4352aef855 drivers/staging/greybus/operation.c Johan Hovold 2015-07-01 722 gb_operation_callback callback,
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 723 unsigned int timeout,
a52c4352aef855 drivers/staging/greybus/operation.c Johan Hovold 2015-07-01 724 gfp_t gfp)
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 725 {
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 726 struct gb_connection *connection = operation->connection;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 727 struct gb_operation_msg_hdr *header;
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 728 unsigned int cycle;
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 729 int ret;
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 730
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 731 if (gb_connection_is_offloaded(connection))
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 732 return -EBUSY;
ca1f8f809024db drivers/staging/greybus/operation.c Johan Hovold 2016-05-11 733
37754030b0b9f7 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 734 if (!callback)
37754030b0b9f7 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 735 return -EINVAL;
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 736
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 737 /*
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 738 * Record the callback function, which is executed in
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 739 * non-atomic (workqueue) context when the final result
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 740 * of an operation has been set.
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 741 */
d90c25b0a279b0 drivers/staging/greybus/operation.c Alex Elder 2014-10-16 742 operation->callback = callback;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 743
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 744 /*
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 745 * Assign the operation's id, and store it in the request header.
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 746 * Zero is a reserved operation id for unidirectional operations.
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 747 */
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 748 if (gb_operation_is_unidirectional(operation)) {
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 749 operation->id = 0;
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 750 } else {
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 751 cycle = (unsigned int)atomic_inc_return(&connection->op_cycle);
4afb7fd0154753 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 752 operation->id = (u16)(cycle % U16_MAX + 1);
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 753 }
3e2ee2c1e50541 drivers/staging/greybus/operation.c Johan Hovold 2016-04-29 754
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 755 header = operation->request->header;
afb2e1342e75b5 drivers/staging/greybus/operation.c Alex Elder 2014-12-03 756 header->operation_id = cpu_to_le16(operation->id);
e8b48d1586abd6 drivers/staging/greybus/operation.c Alex Elder 2014-11-20 757
3deb37d4ad04c6 drivers/staging/greybus/operation.c Alex Elder 2014-11-25 758 gb_operation_result_set(operation, -EINPROGRESS);
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 759
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 760 /*
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 761 * Get an extra reference on the operation. It'll be dropped when the
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 762 * operation completes.
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 763 */
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 764 gb_operation_get(operation);
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 765 ret = gb_operation_get_active(operation);
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 766 if (ret)
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 767 goto err_put;
3325a4ad7122ac drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 768
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 769 /* Arm before sending, as the response may complete the operation at once. */
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 770 if (timeout) {
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 771 operation->timer.expires = jiffies + msecs_to_jiffies(timeout);
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 772 add_timer(&operation->timer);
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 773 }
dbec27298b0df8 drivers/staging/greybus/operation.c Johan Hovold 2017-01-23 774
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 775 ret = gb_message_send(operation->request, gfp);
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 776 if (ret)
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 777 goto err_del_timer;
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 778
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 779 return 0;
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 780
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 781 err_del_timer:
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 782 /* A timer that already fired has queued work which drops our references. */
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 783 if (timeout && !timer_delete_sync(&operation->timer))
7a8e53d4f57e9c drivers/greybus/operation.c Nguyen Ngoc Thang 2026-10-18 784 return ret;
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 @785 err_put_active:
3eeac7e37ce985 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 786 gb_operation_put_active(operation);
008974cb528d30 drivers/staging/greybus/operation.c Johan Hovold 2015-07-14 787 err_put:
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 788 gb_operation_put(operation);
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 789
ea2c2ee8057138 drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 790 return ret;
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 791 }
1dad6b3515b2ca drivers/staging/greybus/operation.c Johan Hovold 2015-03-27 792 EXPORT_SYMBOL_GPL(gb_operation_request_send);
c25572ca943a1f drivers/staging/greybus/operation.c Alex Elder 2014-12-03 793
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-10-18 9:29 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-17 17:17 [PATCH] greybus: operation: arm the timeout timer before sending the request Nguyen Ngoc Thang
2026-10-18 6:47 ` Greg Kroah-Hartman
2026-10-18 6:52 ` kernel test robot
2026-10-18 9:27 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®