Patch "platform/surface: aggregator: Allow completion work-items to be executed in parallel" has been added to the 6.1-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    platform/surface: aggregator: Allow completion work-items to be executed in parallel

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     platform-surface-aggregator-allow-completion-work-it.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a12eb36ca44a9f7fcd3def4a52b22d1da58c0e7a
Author: Maximilian Luz <luzmaximilian@xxxxxxxxx>
Date:   Thu May 25 23:01:10 2023 +0200

    platform/surface: aggregator: Allow completion work-items to be executed in parallel
    
    [ Upstream commit 539e0a7f9105d19c00629c3f4da00330488e8c60 ]
    
    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>
    Link: https://lore.kernel.org/r/20230525210110.2785470-1-luzmaximilian@xxxxxxxxx
    Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx>
    Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/platform/surface/aggregator/controller.c b/drivers/platform/surface/aggregator/controller.c
index c6537a1b3a2ec..30cea324ff95f 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;
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux