Re: [PATCH] platform/surface: aggregator: Allow completion work-items to be executed in parallel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 5/25/23 23:01, Maximilian Luz wrote:
> Currently, event completion work-items are restricted to be run strictly
> in non-parallel fashion by the respective workqueue. However, this has
> lead to some problems:
> 
> In some instances, the event notifier function called inside this
> completion workqueue takes a non-negligible amount of time to execute.
> One such example is the battery event handling code (surface_battery.c),
> which can result in a full battery information refresh, involving
> further synchronous communication with the EC inside the event handler.
> This is made worse if the communication fails spuriously, generally
> incurring a multi-second timeout.
> 
> Since the event completions are run strictly non-parallel, this blocks
> other events from being propagated to the respective subsystems. This
> becomes especially noticeable for keyboard and touchpad input, which
> also funnel their events through this system. Here, users have reported
> occasional multi-second "freezes".
> 
> Note, however, that the event handling system was never intended to run
> purely sequentially. Instead, we have one work struct per EC/SAM
> subsystem, processing the event queue for that subsystem. These work
> structs were intended to run in parallel, allowing sequential processing
> of work items for each subsystem but parallel processing of work items
> across subsystems.
> 
> The only restriction to this is the way the workqueue is created.
> Therefore, replace create_workqueue() with alloc_workqueue() and do not
> restrict the maximum number of parallel work items to be executed on
> that queue, resolving any cross-subsystem blockage.
> 
> Fixes: c167b9c7e3d6 ("platform/surface: Add Surface Aggregator subsystem")
> Link: https://github.com/linux-surface/linux-surface/issues/1026
> Signed-off-by: Maximilian Luz <luzmaximilian@xxxxxxxxx>

Thank you for your patch, I've applied this patch to my fixes
branch:
https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=fixes

Note it will show up in my fixes branch once I've pushed my
local branch there, which might take a while.

I will include this patch in my next fixes pull-req to Linus
for the current kernel development cycle.

Regards,

Hans



> ---
>  drivers/platform/surface/aggregator/controller.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/platform/surface/aggregator/controller.c b/drivers/platform/surface/aggregator/controller.c
> index 535581c0471c5..7fc602e01487d 100644
> --- a/drivers/platform/surface/aggregator/controller.c
> +++ b/drivers/platform/surface/aggregator/controller.c
> @@ -825,7 +825,7 @@ static int ssam_cplt_init(struct ssam_cplt *cplt, struct device *dev)
>  
>  	cplt->dev = dev;
>  
> -	cplt->wq = create_workqueue(SSAM_CPLT_WQ_NAME);
> +	cplt->wq = alloc_workqueue(SSAM_CPLT_WQ_NAME, WQ_UNBOUND | WQ_MEM_RECLAIM, 0);
>  	if (!cplt->wq)
>  		return -ENOMEM;
>  




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux