From nobody Fri Jun 19 09:10:54 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A7133D6CA9 for ; Fri, 24 Apr 2026 13:44:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.24 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038246; cv=none; b=sR6y/YZg4+iKcOS07AQILpE3KkK+z+ZTNglBoBXUFPN9SjdiFkgMA4ClafufuXmsk5XdSR/z0M8uWS1R/ZOxJUO7sdCzt86kzZxK6GXKR+YCdC38474nlqInN0KStNlVT9npV7Sso4lb+71TfEDFDNwKD98gKU4+ikObp02bCT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038246; c=relaxed/simple; bh=ZDH8Gk70fioBOSv0fKTJoqEUhFZO9rzqYiGBdesbwLU=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=V8eyooeXEyMrwbc62zlOd8qAqVaiKMfy2JtrNR9cxguHI3adMGkxIhz0qyAAk4k2GmCVXgcNowwYUk67UcvzNrWsFsWpSrQ92jZe468yj9w5xhMJ6+5T5DWPxLf/eYO2Igpm1RcqgMt6DdoJV9Q2uSVT8vrcA7P97tRrjaAtc/4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de; spf=pass smtp.mailfrom=by-online.de; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b=YTwjqQGk; arc=none smtp.client-ip=212.227.17.24 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=by-online.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b="YTwjqQGk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1777038242; x=1777643042; i=by@by-online.de; bh=HHP7JKn9Ae0y9z7vXIlv5ccxGNiv+DaQKGdiuWQotPM=; h=X-UI-Sender-Class:Content-Type:Mime-Version:Subject:From: In-Reply-To:Date:Cc:Content-Transfer-Encoding:Message-Id: References:To:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=YTwjqQGkf7XL2Z8bGNfuGy+FzAkDvFCgch61oUNGAMkcyBRwYhAp4LcHdUq/Ch1M v3zDGi4NDS0Zacy/zu6eS0nzdpmYkO4t6GffQPjdSm3l6bAJXVyQgktIUB0OiY5k3 7kEdLPUTyD/W0bMyJubdyrVe+GuhJJ4XdVRr3CH/2NADz99W9d8f05ezSbvDCX3JT nZlsF5Vz9vkoyj1Sf8zl0zRXFZi4SU4kzosmh8t7r3RQRN/ffdCo2FcXGfbUjSlCC vme5KFMb0Qs347GQkWPPjVWehrQWgNhYSW6XDimxbJ2MRPAs4hir5K7uy1izbQdS+ JMjSAJIrnOl9FOxyXA== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1Mlf8e-1vXp6Z1lSc-00mq72; Fri, 24 Apr 2026 15:38:49 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81.1.6\)) Subject: [PATCH v4b 1/3] pps: pps-gpio: split IRQ handler into hardirq and threaded parts From: Michael Byczkowski In-Reply-To: Date: Fri, 24 Apr 2026 15:38:38 +0200 Cc: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: <6944F146-8125-42DC-8A2B-C27F4A628005@by-online.de> References: To: Rodolfo Giometti , Andrew Morton X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:HyD2TJhGzFd4T39Dbi5V6f72fYCdkliyIiGW6EC8pDizxEikinV fi+OEs8jYxTcrCUeIB/jTWKR4aJ6CpQBOgOPTEowscGXzajgc9eCg7C3h4idwK5c7ajKkM3 D18Dwz0X/KXl+QAJiphZdIyCslYUb2KCfovnURdgVBuzMA92ViChsKthtuAWWGMCq7/3ZhG 6W2n7T2PwMKFaosJqzJMw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:8jRTXZQpopM=;4HlhLLsZveCBCIp0yF4K2tfd8Qb lzMJtaGCELbJKgCQT2LQuyHv1RS1XeiPdPFli5sgVqfIWcEJ5MPaZi050y+wG7Dy7YhZ2mhTQ 4ZSwA8qDm6ecfAxyXYgK7Tn873hkJgchq16DbBTaPlyfOhzzWSGZroNBGVvV8KBVlu+oKWfW3 k+1wMiUCtvAmCw3PftsXSpOaSQy8FUueRBck3eQVcokjCrRyRlvMpUdCo9SER3qropF53t5iB y+dER4GyaJ+QC6/1cWr4Juazx1mrvgFimYDhdUt3Fn6ehoId9QQWzWvhrpuIiUjhXoV/8knBh EToBgSlQCPR9Ri15i+eirJMRYkG/DumeSSOvlFJCbhf9hLPCl47OtTmQ/sfl6+YNI4F183tYx bo1FZBvcq9mQl9PVDrJADd1eIWiYlsJ+t1VoQ+VfOaaFsZoTaX2OzHUzLjwJ0wipKyJYJfLpG tXrpcMiYVMFBtnPch0OLYmeUC1ip8IH+rkGigGP+9lop3A5w5c1whkrGrektegmqiwgP82GJE KXwlrosSMmeMT8jvl6W5sEDJyRiObU81FNi2kFshLivV+ehw7Wgo9inYHX+TpL4KETrCvLUAT eqn/7fiOMIZBNKdQh/q6rOHPxkt+NNyEdB8vF3VGgzc5P5HQm1bSjUnczaK41rGIYDDRLNw+c 9F3xkH1/JqhXKJuhj0Jzau3h3j1XiCksHAKjGAOjTuRvGKeTipCWY/8Wi4fM9xHASLKLrk+tG iePTFcs17XS1XvyNdCSHQilZ7u8vdBJKE7txbqojQIAJ7lmq+8ytblv4778RKjrhziDTKtjCX qsd9/tqtOZpYjhad9F7FDOCDrXXOLrEyGrAHSdKJry1W3G55RYFYsYug9oUt8A4KaF7kznDlv Udi8IYCEHdD/wdrFWmjwqx2yOf6RoM8yOqj7ci2boeptrD1NWd5Jxg9YCDGkk0u6nEs9arRcs WavskGl5GE8ebQkZmpr6dMfTMPedu9/izzM6NX69t3o+ssWhH6eCshQC9Mw8q5NId01NtjTki nQNV12pTnviu3CrM/BnJ4RFzGduRQUmL+0nfVmzc7CDInjkvFmH+Pcx+WHM/1S8ZgNgjnUEjM Scgl7jYlsa5of1juqJz5HD31nMtczSeYDSj4YnC6rk50/40hyRNiZxUfcyyc1T33Yafk86paa 4JHMWcGbmTDjcE4eZKEPP4/4xyOgjBABJiQwBkh3IzqwHm4lrEhMKeWS1crRlQbbFwVp/uXKb ru1+5gs/Wo3/B3eRwqeCiXWFC19b5VBhRyrkJcDwf1Txf7tqamJe4EhVqil1s1S06ixRTQ2hU WDl0qYbPcC5YzNw6i0EAocJwlSKufbzy2qNyicZy7aWJxg1ie4HfwvFVcv35isNjXtRyIG13x NfiMd956poiza4EKnJShbv1YCDV7Tu0qQdwz37B2EkgIKnLiqwnx77ciQMTiBOQTi/98puhef AWCukuGIBBrCHMNAzj/chvdaSs7FNmjEgtz0gGHmqFTEzSgqgm+ca2bDl5kKuJCIIBMJ3Jrdn 1iN9bXMmye36+AtOdmepb+clreDJ4M1TYLanQlg6r/Xnb3fpa+jG275qQhEjuFAfoyeNr/AFH q17xohBjY2m4Ircmk/YMrxD9rIr1XyQgJh8LDxqvTQcMGMA5jmsw+kvxHA8WOwKBaPpvx1qx1 5dvsIB+ONjbbgeKka2U3uJ+rrILVspWOSKn0+U4HKIn8yNBvBlvYUdxJ5qreu2EGUqmeQ0/S0 iX3IONZAHzcujOO5n1iGQdqopYRcWRfNJH6a4v4zdx6wTYcehExMPU+k5BnEKwjoj+qdE2jpz 8q0ZLsZ/0z1zDiHRjqCBiIQ7C5Z/Hbti1ZdU6WRL0O5fj3MqyYOA+FmjvtW9P8bPpo76/RMpi d1/W8r+n+PGpoFSQPpv3etsj07xcHqt+zV/vkoZgNbeaLPTUKFF4C+SYt/Z Content-Type: text/plain; charset="utf-8" On PREEMPT_RT, all IRQ handlers are force-threaded. The current pps_gpio_irq_handler captures the PPS timestamp via pps_get_ts() inside the handler, but on RT this runs in thread context =E2=80=94 after a scheduling delay that adds variable latency (jitter) to the timestamp. Split the handler into a hardirq primary (pps_gpio_irq_hardirq) that only captures the timestamp, and a threaded handler (pps_gpio_irq_thread) that processes the event. With request_threaded_irq(), the primary handler runs in hardirq context even on PREEMPT_RT, preserving nanosecond timestamp precision. On non-RT kernels, request_threaded_irq with an explicit primary handler behaves identically to the previous request_irq call. Signed-off-by: Michael Byczkowski Acked-by: Rodolfo Giometti Tested-by: Michael Byczkowski Tested-by: Calvin Owens Acked-by for the the fixe of the sleeping-in-atomic issue in --- drivers/pps/clients/pps-gpio.c | 37 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/drivers/pps/clients/pps-gpio.c b/drivers/pps/clients/pps-gpio.c index 935da68610c7..f37398fd6b10 100644 --- a/drivers/pps/clients/pps-gpio.c +++ b/drivers/pps/clients/pps-gpio.c @@ -35,33 +35,44 @@ struct pps_gpio_device_data { bool capture_clear; unsigned int echo_active_ms; /* PPS echo active duration */ unsigned long echo_timeout; /* timer timeout value in jiffies */ + struct pps_event_time ts; /* timestamp captured in hardirq */ }; /* * Report the PPS event */ -static irqreturn_t pps_gpio_irq_handler(int irq, void *data) +/* + * Primary hardirq handler =E2=80=94 runs in hardirq context even on PREEM= PT_RT. + * Only captures the timestamp; all other work is deferred to the thread. + */ +static irqreturn_t pps_gpio_irq_hardirq(int irq, void *data) { - const struct pps_gpio_device_data *info; - struct pps_event_time ts; - int rising_edge; + struct pps_gpio_device_data *info =3D data; + + pps_get_ts(&info->ts); - /* Get the time stamp first */ - pps_get_ts(&ts); + return IRQ_WAKE_THREAD; +} - info =3D data; +/* + * Threaded handler =E2=80=94 processes the PPS event using the timestamp + * captured in hardirq context above. + */ +static irqreturn_t pps_gpio_irq_thread(int irq, void *data) +{ + struct pps_gpio_device_data *info =3D data; + int rising_edge; - /* Small trick to bypass the check on edge's direction when capture_clear= is unset */ rising_edge =3D info->capture_clear ? gpiod_get_value(info->gpio_pin) : !info->assert_falling_edge; if ((rising_edge && !info->assert_falling_edge) || (!rising_edge && info->assert_falling_edge)) - pps_event(info->pps, &ts, PPS_CAPTUREASSERT, data); + pps_event(info->pps, &info->ts, PPS_CAPTUREASSERT, data); else if (info->capture_clear && ((rising_edge && info->assert_falling_edge) || (!rising_edge && !info->assert_falling_edge))) - pps_event(info->pps, &ts, PPS_CAPTURECLEAR, data); + pps_event(info->pps, &info->ts, PPS_CAPTURECLEAR, data); else dev_warn_ratelimited(&info->pps->dev, "IRQ did not trigger any PPS event\n"= ); @@ -210,8 +221,10 @@ static int pps_gpio_probe(struct platform_device *pdev) } /* register IRQ interrupt handler */ - ret =3D request_irq(data->irq, pps_gpio_irq_handler, - get_irqf_trigger_flags(data), data->info.name, data); + ret =3D request_threaded_irq(data->irq, + pps_gpio_irq_hardirq, pps_gpio_irq_thread, + get_irqf_trigger_flags(data) | IRQF_ONESHOT, + data->info.name, data); if (ret) { pps_unregister_source(data->pps); dev_err(dev, "failed to acquire IRQ %d\n", data->irq); --=20 2.47.3 From nobody Fri Jun 19 09:10:54 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBA3436C9E5 for ; Fri, 24 Apr 2026 14:04:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.126.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777039498; cv=none; b=hUJdP53BMh67BRfwDp/jcS8AnLNpJmzsCp1XVrarXdqDJTcdWBGgm5geKsu2jc/KF6mbYt/cuRFtpZGa53VgcqGIsn47YHCGCbNSj2rk29UCEKYsZaZVspyvxy0iIcQLxQ/gpImgXTu5wus29S14lA4GfQrH9I1zra+hWOrYGRs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777039498; c=relaxed/simple; bh=XbpnL4lout21ncs7QNLs+tPFhR6Udo5dQ0POIjNzuds=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=D3MptSnQiO32xtE6jf4oVLYSrPtaTraUDSKaNsPjtuCn7Zq5kIPE9ebhj/nQBDTxFU+nblQ6C7nlaiQQeKUsCR7ZIwiFIBI3w7TaR9pAYpAsBN6Gk3AS3xVY9fb+KorvLQNHqzlBikRP/GP7fiuuYdpMV9Ygk8XMYnDqzvkpSFE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de; spf=pass smtp.mailfrom=by-online.de; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b=XV1DbLHA; arc=none smtp.client-ip=212.227.126.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=by-online.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b="XV1DbLHA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1777039494; x=1777644294; i=by@by-online.de; bh=xdmHOyx/i/LlS8P1Oqz5IprHml0HtmnctjEWXuAva2g=; h=X-UI-Sender-Class:Content-Type:Mime-Version:Subject:From: In-Reply-To:Date:Cc:Content-Transfer-Encoding:Message-Id: References:To:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=XV1DbLHAfNZU503kHbRtt9TDLw/PxwF2Gt9avimda+HopnyQISBzLjUS213cVe1c JSRmorAp07xKIOklUnUcjnxvG6G8TMeWTX9Mgyp4fjHJNLSW7Wi/dpXxikRitKoqY NE+ggVZf1c4xi1yygqPezNemNJV0mzpgpc3dn5Jvp4vwMrNnXzJd+Ik6c1++A13H7 o0+L32SVLF1yoCgGawFBoOMTtlf3BYWHbFk2/08V/wBi8iHBz7J9UH2JyE1L7rRKr K2EY0KAywyirsH01Qh6odz9du2ZRxS6GGrpN9ur64uenKFUcQD3zi6qQdXw+sozax IVolbYQEdFrPPsrUvg== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1Mwfn8-1vRBEv05iU-00sArO; Fri, 24 Apr 2026 15:40:11 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81.1.6\)) Subject: [PATCH v4 2/3] pps: convert pps_device lock to raw_spinlock for PREEMPT_RT From: Michael Byczkowski In-Reply-To: Date: Fri, 24 Apr 2026 15:40:00 +0200 Cc: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: <9D1BB313-E630-48B1-A473-0E0E3DFFF967@by-online.de> References: To: Rodolfo Giometti , Andrew Morton X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:okFTDz7iue7RbMZNae5YF1XAFdR00aZ0epS87s8wwVB029wHANk wQ6vJCARLg+0rT1ciFVwU4GniubkftYlEXV/8dljBhxJABptToEr7K+dGo5dKSUqD0AquFn kwuUPHy7kpfnQUcdmhcsbi/FvKuWc5fAHh9cFps4kpxHalSPz0hZCEFr1Ityy/QVX10cj8A Ks0EDG6KX42MrTfxvxAPA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:1JwvQO3SDyQ=;JFmwq3SArh12VF3lJ3pTbvnFEsJ lgcp/ZIrhCUra31WsXrTKVU5AUMPtJIjU5zhFkkCkHsoZnDypUcKtLmQ+17MHAkkISNXYiN2B yxv4rV+EfDmb1G0byZG1k2PvV/VCXWOAkqRsQ2YJjOTuogzolUBFYH7nmUlUDPlfytryAM8EI 2E2VsxOZsQvfccmYeOPo44GSQ6E36vA/NiDtgw7C/YmOizMfUT5nt3lHRES4ZmxTIjXGE5MKf uZFkgyfaCYecpqNUkibwZWJZlNWMoeE3uhWAdx48fjalv2ne+1XAIZFg0S5PI7+rkZUQpuxGy 2M+VzQdUESrduXH8jJr3y4SotL2Btdg5VL7E32vcNRMsKWrFsq3tRQCuVRdGClQ8ZPYfqrjBd 0Az88hpGnBeYOkGwGhIy5i+UMVn33Q+cufYy3G5z3WzLt5M0BW1lYXfWP+KtQqaIB+izFqZnu pcb9qipRWJZxTTbznDxaihAlF54iSlOksngyQ8e5Wwsa85zJgqf4jkIFxRf0ssA0Z/JcG1w5u 0sprtsENqRE/g7JEvGU3svm7lL1sNuQlsDmosE78Hk78F2g+zGpsiF5qj2H2vg/uJVF1Hh7bi oTgdIutqf0rhYIaueUI0x+petmjcq/xF40UNGfnw+mBBASpCw5wiHab44R46q1tzkElEGMIEq 7Mic1798FF9EGNLWAy24/EB81ZJiSkxQZFmJAfR/Ybjc8qak7m4+70BWf2jkZTksSaaJV5cWq bnFh2gbuwFIonrwvZIBXwmHUwVxmumGq59xpTflXOY4fmShqZwxN9tymvdPRI/ESisqf8jWhW HPGMDDt7TyOS7eMnYE9X2C6j/USlyb5oP6yZT128opsiSZZpHFxdV3eJURiOgY4dg35eY8Lf9 Zm4/GTcyd4lD2mMpCS30MG0FMzp9FSuH5HAewPQKd7d6QP5gAf4JicjlAvsZjyFq7Ig/lFaO7 a6+VFGmGWuzxs0uBbJQJ4hldmSNZpiNclbAhhJbdhGGjYD1xj3ZV+8lR66hp/EzE2nh6/fxOF jzd+2c5jHOazl6weR2NseWtstWd2bOwkvaE2NK/TchLOELlPQMj0ZLQXiAUdWzAsPqy4NWaf0 q9x7Neqf9GgRiC9OEawm6la9wbMHDw16SxQsn02MpL1p18Wp02CUMv6362E7e+jmrBlqakDaL OxSApMjfCT27hbV6cuSNiEP2TFbcpGn6mACrX6fi2n/Q92dJqXvwqmqTxZ+4JSgv27PbeIkZr mKbx9WFt6B9579vTzbM/fKHwarR35MvIPtq2WVCRZxxX0phUrN97mwmu+2AMlO/09uYWt+hoD W8BKb3/AIc5uJS1CsovBFVKqxWnRPu9vFS/7NK6alWEy+lyMO/hrieYOLKS0tzij6d2xomnyg 7dNUrjkmloZ69rCuEktYjpJK7q/ia6EOtrDLn84E/mRVTN7+IXt1RK1xpnbz1S69RqcpvisZk mwLxX1CJFcd7IpVNfB/MhhqnLv1mqEqrRObm5FVe5M7Io3A+jLWMmZez0Pu/Se7CZYkbUWmHO tuk5axqKSuth/ilRdhMZaxAF7zUXfTH5mV+k/k74wdW7qnxy4onPgMNFvbcaP8SzKw239IHo/ 7oQjv5Q6rDjJ9b6GydyilNhkVe6fPlQaRYwa9edPiGqgBFdCR+SubuoC9iTK632mmm2lnbMri PcyRjeI6S/VYRsifnRrVB0qJsFodjQBJ7XBfdc2YvhToyn5Fpc2DOfpoRiI1Lj0uiK9Uomscu 8EJ7CrkYjMYbwAmyaC5j2/ZozQvyn6OEHJL1A1NtBgiJsq7Y8eZBOp7aUUpxzWXX+H33Pt8Wc rU7yJR+U5m0ns33FxlEIvimDW/4jHmJE03sj9BnVlBok9r9RSHOYB3r9bIkAzmoJRwdv02vqU ByUoMDKMnnpOeNIQ8gmOBEmxgQB+bXy+afdO7E= Content-Type: text/plain; charset="utf-8" On PREEMPT_RT, spinlock_t becomes a sleeping mutex, which allows pps_event() to be preempted mid-update by other RT threads. This introduces jitter in the PPS event recording path. Convert pps_device.lock to raw_spinlock_t so the timestamp and sequence number updates remain non-preemptible on RT. Move wake_up_interruptible_all() and kill_fasync() outside the raw_spinlock critical section, as these acquire sleeping locks on PREEMPT_RT. The lock now protects only the timestamp, sequence number, and last_ev updates. This is safe because PPS_FETCH waiters use wait_event_interruptible_timeout() and will re-check after waking, and kill_fasync() does not require PPS data to be locked (thanks to Nikolaus Buchwitz for reporting). On non-RT kernels, raw_spinlock_t compiles to identical code as spinlock_t =E2=80=94 no behavioral change. Signed-off-by: Michael Byczkowski Acked-by: Rodolfo Giometti Tested-by: Michael Byczkowski Acked-by for the the fixe of the sleeping-in-atomic issue in --- drivers/pps/kapi.c | 18 +++++++++++------- drivers/pps/pps.c | 16 ++++++++-------- include/linux/pps_kernel.h | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 1bf0335a1b41..46d9fe8b8ce9 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -102,7 +102,7 @@ struct pps_device *pps_register_source(struct pps_sourc= e_info *info, pps->info.echo =3D pps_echo_client_default; init_waitqueue_head(&pps->queue); - spin_lock_init(&pps->lock); + raw_spin_lock_init(&pps->lock); /* Create the char device */ err =3D pps_register_cdev(pps); @@ -167,7 +167,7 @@ void pps_event(struct pps_device *pps, struct pps_event= _time *ts, int event, timespec_to_pps_ktime(&ts_real, ts->ts_real); - spin_lock_irqsave(&pps->lock, flags); + raw_spin_lock_irqsave(&pps->lock, flags); /* Must call the echo function? */ if ((pps->params.mode & (PPS_ECHOASSERT | PPS_ECHOCLEAR))) @@ -206,14 +206,18 @@ void pps_event(struct pps_device *pps, struct pps_eve= nt_time *ts, int event, pps_kc_event(pps, ts, event); - /* Wake up if captured something */ - if (captured) { + if (captured) pps->last_ev++; - wake_up_interruptible_all(&pps->queue); + raw_spin_unlock_irqrestore(&pps->lock, flags); + + /* + * Wake up after releasing the lock: wake_up_interruptible_all() + * and kill_fasync() acquire sleeping locks on PREEMPT_RT. + */ + if (captured) { + wake_up_interruptible_all(&pps->queue); kill_fasync(&pps->async_queue, SIGIO, POLL_IN); } - - spin_unlock_irqrestore(&pps->lock, flags); } EXPORT_SYMBOL(pps_event); diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index c6b8b6478276..ad96425208a1 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c @@ -103,12 +103,12 @@ static long pps_cdev_ioctl(struct file *file, case PPS_GETPARAMS: dev_dbg(&pps->dev, "PPS_GETPARAMS\n"); - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); /* Get the current parameters */ params =3D pps->params; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); err =3D copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); if (err) @@ -139,7 +139,7 @@ static long pps_cdev_ioctl(struct file *file, return -EINVAL; } - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); /* Save the new parameters */ pps->params =3D params; @@ -163,7 +163,7 @@ static long pps_cdev_ioctl(struct file *file, pps->params.assert_off_tu.flags =3D 0; pps->params.clear_off_tu.flags =3D 0; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); break; @@ -190,7 +190,7 @@ static long pps_cdev_ioctl(struct file *file, return err; /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); pps->last_fetched_ev =3D pps->last_ev; @@ -200,7 +200,7 @@ static long pps_cdev_ioctl(struct file *file, fdata.info.clear_tu =3D pps->clear_tu; fdata.info.current_mode =3D pps->current_mode; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); err =3D copy_to_user(uarg, &fdata, sizeof(struct pps_fdata)); if (err) @@ -278,7 +278,7 @@ static long pps_cdev_compat_ioctl(struct file *file, return err; /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); pps->last_fetched_ev =3D pps->last_ev; @@ -291,7 +291,7 @@ static long pps_cdev_compat_ioctl(struct file *file, memcpy(&compat.info.clear_tu, &pps->clear_tu, sizeof(struct pps_ktime_compat)); - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); return copy_to_user(uarg, &compat, sizeof(struct pps_fdata_compat)) ? -EFAULT : 0; diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h index aab0aebb529e..f2fe504071ed 100644 --- a/include/linux/pps_kernel.h +++ b/include/linux/pps_kernel.h @@ -59,7 +59,7 @@ struct pps_device { void const *lookup_cookie; /* For pps_lookup_dev() only */ struct device dev; struct fasync_struct *async_queue; /* fasync method */ - spinlock_t lock; + raw_spinlock_t lock; }; /* --=20 2.47.3 From nobody Fri Jun 19 09:10:54 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 03D633537DF for ; Fri, 24 Apr 2026 13:41:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.126.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038088; cv=none; b=sDkzBtTw1IpXWa7juUgzz6ZAGNfRUGRkQIZgY0EeuMPH7xbeSU9mrVCXFjd7CVCkmIHADjs9uo9VjI4qFMGZ/g4sd4d1ur5ypvOkVUKIhackgXEgp/ouSHU6dzKc3sBODLiJ/EXJI3qsqV236q5Z94Vso175uXU60b47REk/Tfk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038088; c=relaxed/simple; bh=XbpnL4lout21ncs7QNLs+tPFhR6Udo5dQ0POIjNzuds=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=DTF+F57aYt4203ODISY43h3p23iSKu8pj7MfGyqwHE9t4+zxuw3mup+S3biCdf7tPLopU9NFRETUoe+YOORqzM4dCa5nAj8dcbX24iQQuxX1qcREdmG2++pWXoMl/GGOspcY/wUgxIXVat7ntw6ubrFkkd441fFSvMIvlBk2ujs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de; spf=pass smtp.mailfrom=by-online.de; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b=B5Tm5APV; arc=none smtp.client-ip=212.227.126.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=by-online.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b="B5Tm5APV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1777038084; x=1777642884; i=by@by-online.de; bh=xdmHOyx/i/LlS8P1Oqz5IprHml0HtmnctjEWXuAva2g=; h=X-UI-Sender-Class:Content-Type:Mime-Version:Subject:From: In-Reply-To:Date:Cc:Content-Transfer-Encoding:Message-Id: References:To:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=B5Tm5APVHhF/q4gB3M5+D2nqgsHMJTuWtrliygFijtpYjXfKxLrwa+EL9qs5EQH4 MWwKIvoqi1kFPEthHNyAybuBkPVoE4tktVg90x/DO7yiX400LVN4us/r1S1rxhF0r cwLXpEhLHv+F9e1XK6FZ85zChLsuyxjaar2Z0ryVzN9qzwoHXUqgkFCQxCR6dlDb3 ms0Znq5+kM3DXLpgiNRjYfVEbhN3FQ4FqkOlqIAh6bI2QVBm4Z5bpZF/yaLWqr9+m Ec6c5wt0w4QOlXf84/piyLZLe09MZ1uvthDQf5RM6CsARk+t6haWUhHiskFDuDqIs CogHWD7dfK5cvjKlOQ== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1Mj8a5-1vmQ9B0U4b-00c1ov; Fri, 24 Apr 2026 15:41:24 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81.1.6\)) Subject: [PATCH v4b 2/3] pps: convert pps_device lock to raw_spinlock for PREEMPT_RT From: Michael Byczkowski In-Reply-To: Date: Fri, 24 Apr 2026 15:41:13 +0200 Cc: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: References: To: Rodolfo Giometti , Andrew Morton X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:Nf/4WQA7vbS8Om4TcGZPQQJiE4Q7ZJz9ZYyMCxflFhbyuhNkp+e 0KnFkzxs67vQogfQ0yn1LlydnVHsqvdeeMIl5+DdKQ4buNLnzPEJ3PlsbZg9zydcUwW7BHP mj+xEYIloIADOICXZYoCQoXsfM5Os3TZo0YNk9KTOsJCKEjTs2GCph/I8XBq4KtBMhND8oO OZ0sKpDvmfeK2Ld+pVcsw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:QJKtBJrFtgA=;E+cU+J1UVD50dSKz4Vqzw+Uy1o6 y2hsV+de5c3UlHH0wdcGz475nTp/FQjM50ZTi5A7o4NEa9WeVAtq/P5D66yt9dQJqbWkBH1oI JYfxzn+VTd5+Yq7M0Pi06xDH7j8vFxMXO9bewrnEpU77dl12jD0lxbbL1bcG7TuQXZON2q1/4 YE4Y6EoY5nLkitUBOkLA/x+WErW/H13pPigN1ZXfZK8vGwVNOXSfEQwMGibxQRwMiNVDSozSi hCWjLe/JiijbscQoUjWU2ko91BNL+/xvIwgpxUvaWcmI6zfI8zBv6WPMkzpNAjPXWHMjkQ8Cu ZLOaQCcsvD8lovpcpkQPKJiE5SV4khcp9dsy+gJARBrRCNiVsljgkU5xrGFILZkoQfhwYGTDC qlL+SNnIqG6ez/cuBdmAi6tuacr412jrEhGZ9jlaMvK78cSnz838vPTmAJU4nvblCGh9u/cai GG1LVoWu3MOdZY8emwId1Ea1JWecpe19ewb/0ISENp3SKbPOYib1IGirI8XMDjKjDLshVu3wv u2YI8lT06JxVZwkMF5PdG9tcm+iLTSBPhIF7F4ZbZbjncLu0FxQY3xEiXO0OLXLU+p4n3GaWB RlYKLGolaJRw9qyGIpOU/ylGULaJhl6nlB/lP0oHUM6Qu1Pap4Xm4ubpouhzl3UIzOH15/rMW yo3jt+VxMACIGs4F4ebUFJIvpWgzy2Ao4f1NECu4vQWMCGZ5NeIjgUXZl7lZ92kfrooWUeuVl fLxwBCrx76tDpJ91bgEKHAyrcvgN6KRWYpxi3a3syFNhUe1CrjCqKDjZYC73w2BZ734mGQn/B TEU/DePyHuvmre6mZBAqSbzLeyo3CKVXDdb3dziiwpKdRjePTzXvXAC8HalvkGdh8nifrLyOP F85ioDY5sfxe5uYHLuRlkDBITTDN6SCCGgfBJUoFg0/7rewCHBpQnIVDMODTkTNE7ld/JQ+op 7906KcVYNEBpb5Dcio6ximRkA2lekxbc9eLUDBU/SR2jcfjs/YBalqVbtxHqED5/6obQjpXAb D3H0f4d509NdBPVmffslyS2u0IZ0MdI0PHNvKHHJp3Phtzy0S/6wYdIRAi7VZcYo4mgxqHyTK DP7Nvzx9zVWS/VfdUakwBXcPVWOtOxE0byvnqy5NZVZHiZ49v/4wXyAac5yZvUJSq/CpQkOB4 kW4rCteFVkkb59GMzjctXHa3MqowrKihTsUjRdLXELEh20qIEu9Vqtm1+oQLTjLZXpRvbZJ+W WWzZkriyjScQP6hnKuCPS7BF/5fQmK5qjvNmmwmmn8jVY5yryYaTTa4bV86Dg4tEN2KGvWPV0 z4DzAm8T9dQ7maQ37antryZXvcgbr0UlGourE8TfwO6x3wy/4XITvsdhSYe2E6yd7ErC/jK4D UcWI+LzJGe5uKKBR2Ap2FiYzxyHS7Kwxdf5ZBfqnw/DEWt3OEiwY/mJLzVCm8LiH4QP9R2eKP SV2+IokQ4RH2GdIV23BaB8kpuMKyS+n/sgOgTUpdwH0KRrv6wl53U8dT/lEslC6ds2Y6lL1lT ZCW2iTVvmxk3oePr+g/H7JMbn652WLTjBW7DS7ILDImeW8E8n6agpyQNRmLg2wRn3OH+ArCkn cOFWXEiAUBZhfCHVbU7FWSYigvTl782SODak5yoF/mDb322N8ln9+JTdjXdmepWCLinz1TuDB yYjU0hGrvzkF3AF9y77UEleVGFZS4Y2cWr9PSO1FZ3hr+BVgRuW73W8hUwoSyNqvd4ylfGd/u kyaF5mqVRKCX/QYboPv3zneEnxV2nhgFxNB9fSucpcf1/aLXUPvKm3VXiprUcBpUuGRION9xA OKPWKBAdr0v1CYXI2E9W1FVBmk3jAb1pTuKdPl4wl3xe8fcf7RmhMAgX8Zb+EtwmDSpOf37P4 BrEUCtyFbZOt2jV1+Stt10d4KMri42wSCf4OumxVbX8MIY2sY/3t/UuNL/IgF7r/j0KTaB1vu 0YlrYyge9pLTXNV1ySiTsAQV3QcLk= Content-Type: text/plain; charset="utf-8" On PREEMPT_RT, spinlock_t becomes a sleeping mutex, which allows pps_event() to be preempted mid-update by other RT threads. This introduces jitter in the PPS event recording path. Convert pps_device.lock to raw_spinlock_t so the timestamp and sequence number updates remain non-preemptible on RT. Move wake_up_interruptible_all() and kill_fasync() outside the raw_spinlock critical section, as these acquire sleeping locks on PREEMPT_RT. The lock now protects only the timestamp, sequence number, and last_ev updates. This is safe because PPS_FETCH waiters use wait_event_interruptible_timeout() and will re-check after waking, and kill_fasync() does not require PPS data to be locked (thanks to Nikolaus Buchwitz for reporting). On non-RT kernels, raw_spinlock_t compiles to identical code as spinlock_t =E2=80=94 no behavioral change. Signed-off-by: Michael Byczkowski Acked-by: Rodolfo Giometti Tested-by: Michael Byczkowski Acked-by for the the fixe of the sleeping-in-atomic issue in --- drivers/pps/kapi.c | 18 +++++++++++------- drivers/pps/pps.c | 16 ++++++++-------- include/linux/pps_kernel.h | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 1bf0335a1b41..46d9fe8b8ce9 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -102,7 +102,7 @@ struct pps_device *pps_register_source(struct pps_sourc= e_info *info, pps->info.echo =3D pps_echo_client_default; init_waitqueue_head(&pps->queue); - spin_lock_init(&pps->lock); + raw_spin_lock_init(&pps->lock); /* Create the char device */ err =3D pps_register_cdev(pps); @@ -167,7 +167,7 @@ void pps_event(struct pps_device *pps, struct pps_event= _time *ts, int event, timespec_to_pps_ktime(&ts_real, ts->ts_real); - spin_lock_irqsave(&pps->lock, flags); + raw_spin_lock_irqsave(&pps->lock, flags); /* Must call the echo function? */ if ((pps->params.mode & (PPS_ECHOASSERT | PPS_ECHOCLEAR))) @@ -206,14 +206,18 @@ void pps_event(struct pps_device *pps, struct pps_eve= nt_time *ts, int event, pps_kc_event(pps, ts, event); - /* Wake up if captured something */ - if (captured) { + if (captured) pps->last_ev++; - wake_up_interruptible_all(&pps->queue); + raw_spin_unlock_irqrestore(&pps->lock, flags); + + /* + * Wake up after releasing the lock: wake_up_interruptible_all() + * and kill_fasync() acquire sleeping locks on PREEMPT_RT. + */ + if (captured) { + wake_up_interruptible_all(&pps->queue); kill_fasync(&pps->async_queue, SIGIO, POLL_IN); } - - spin_unlock_irqrestore(&pps->lock, flags); } EXPORT_SYMBOL(pps_event); diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index c6b8b6478276..ad96425208a1 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c @@ -103,12 +103,12 @@ static long pps_cdev_ioctl(struct file *file, case PPS_GETPARAMS: dev_dbg(&pps->dev, "PPS_GETPARAMS\n"); - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); /* Get the current parameters */ params =3D pps->params; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); err =3D copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); if (err) @@ -139,7 +139,7 @@ static long pps_cdev_ioctl(struct file *file, return -EINVAL; } - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); /* Save the new parameters */ pps->params =3D params; @@ -163,7 +163,7 @@ static long pps_cdev_ioctl(struct file *file, pps->params.assert_off_tu.flags =3D 0; pps->params.clear_off_tu.flags =3D 0; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); break; @@ -190,7 +190,7 @@ static long pps_cdev_ioctl(struct file *file, return err; /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); pps->last_fetched_ev =3D pps->last_ev; @@ -200,7 +200,7 @@ static long pps_cdev_ioctl(struct file *file, fdata.info.clear_tu =3D pps->clear_tu; fdata.info.current_mode =3D pps->current_mode; - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); err =3D copy_to_user(uarg, &fdata, sizeof(struct pps_fdata)); if (err) @@ -278,7 +278,7 @@ static long pps_cdev_compat_ioctl(struct file *file, return err; /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); pps->last_fetched_ev =3D pps->last_ev; @@ -291,7 +291,7 @@ static long pps_cdev_compat_ioctl(struct file *file, memcpy(&compat.info.clear_tu, &pps->clear_tu, sizeof(struct pps_ktime_compat)); - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); return copy_to_user(uarg, &compat, sizeof(struct pps_fdata_compat)) ? -EFAULT : 0; diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h index aab0aebb529e..f2fe504071ed 100644 --- a/include/linux/pps_kernel.h +++ b/include/linux/pps_kernel.h @@ -59,7 +59,7 @@ struct pps_device { void const *lookup_cookie; /* For pps_lookup_dev() only */ struct device dev; struct fasync_struct *async_queue; /* fasync method */ - spinlock_t lock; + raw_spinlock_t lock; }; /* --=20 2.47.3 From nobody Fri Jun 19 09:10:54 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D3DC3D9DA7 for ; Fri, 24 Apr 2026 13:46:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.126.133 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038377; cv=none; b=fzcrDtT1avOE+vf6ZbWtQVL5S/LDu6lge03J60cXE+MSu5F2tiAmG+J3E2tmKZ30VIwdIrV8eC2BLbu2c+YTWp+vP+iuNgUCcbbRW/T9EptQ9EIuZnI67s65z/XsxY1MB4Y6tSYb2+WQgI/3NbM0nIh+3rIHsEZC4RU1dm7xNmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777038377; c=relaxed/simple; bh=hHw64wTUHcZWOnLPG/ofVv64O2XdHhdDNT2W0YsScvM=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=hHcvND+U0UyinZNuW4TkfsOrcpMyVx02bqH2dbro2LCjiMH6slY8y5CrrcQekUpsJf6bcTLywYAZUo37dG6zTXcrpicAQ0OQb4AQsFfJ+6hUbjAHYBgvZn7C57Hn+7rpVkfIFlMtEsY3ORiw3E4iYd3sCM6x2xdV5UYvF4O2VTk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de; spf=pass smtp.mailfrom=by-online.de; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b=bpwqnFaB; arc=none smtp.client-ip=212.227.126.133 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=by-online.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=by-online.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=by-online.de header.i=by@by-online.de header.b="bpwqnFaB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1777038365; x=1777643165; i=by@by-online.de; bh=hHw64wTUHcZWOnLPG/ofVv64O2XdHhdDNT2W0YsScvM=; h=X-UI-Sender-Class:Content-Type:Mime-Version:Subject:From: In-Reply-To:Date:Cc:Content-Transfer-Encoding:Message-Id: References:To:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=bpwqnFaB/hxdGz6+Ls+x9X9H0HwRSQ1SYR56inLJn9zL4UWh8OEH9NMndRLn10bb P8CuMEitWqTlwjRwOa5N2BIwojugs8uZEJs1b9ZSh4T4R+KEmwAUdChTEGAuSBoMe ghw8RWInn7Y7vQhdcVzfydgtfrmihb+OtfnqJLb3ZDK2SsGgmIRJEvt0rI4KKri3Z a6dURvfJM9x+58fBE0Qijd+rE9xdMwKQXmcuL0nGKH6skwi+bxKt9F05bMGv0okGs 0DZFBtynttfHyW7VdOs3bdSw7j1fnVbDKSV2odH9haVg6/PwlfoGPEZ+mxK7jLhpD iCx8MQ6612rEk6LKgw== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MAOeB-1w4Q072gdX-00EYhL; Fri, 24 Apr 2026 15:40:52 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81.1.6\)) Subject: [PATCH v4b 3/3] pps: convert pps_kc_hardpps_lock to raw_spinlock for PREEMPT_RT From: Michael Byczkowski In-Reply-To: Date: Fri, 24 Apr 2026 15:40:42 +0200 Cc: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: References: To: Rodolfo Giometti , Andrew Morton X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:cTabfkMIvVB32eb5JZjrVHVn2J2itVhq58qykcUK67/Qv9g7QYe SJaTzW+MiJNZnxV13h/Hea4B34DIZo0p/lb+QR/F2LBe9QndYqghK6Nfxiu34uLgeKcfaLs tukzS5B8lRw69xPRILdCuaZePk7ikI1RpV3M+GhmD4BeskGj7UaNllyKX0EoOnYG7kCAnCL l3hSJNLX3FMNDzK1cilDQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:N8GizP9C5nA=;DUjvWPLmVYz1Z3VLzyH1tGTcJi8 z1BbRdiQ2+azU9lTfVGTdAkRm9JVwwUM9okR8HEicbZLJUbOy/B7ssatRjI4q9NA29n/Dj0dJ VYb8k+zRraeK1eQ9PwB7PvpBFooZ8mz6p61TzZV3tFtXJ0y68C6RmShVVQQQb4sY98WA9PmwQ u80ZcAA2EZVnPR4ZccNXxaIT10h6PYBegZdd/8YKUP1kcUlKVYlaoCb6tx5ie+Tjg/uflImta O5I7jDETIhfC1Y4JW8wW8q8f2O5RMf5+jmIWqf5gLMiFZsFKlbAQI3Ds/mZArrcKadMzLYkrf UCE+P+IR9IZm+JttkXkVxQpZPy1lM7ZRWUs/BIYu/wNZCyszEb4th/GdYUXUiSvZQitrKZUyC 0Zkhbd8WVimWHNyey+jjDa7oAIt3rUDip3rYom0QkbRiJwDUuVgCjhVyRu/c5DGhhXEtt30Lt A09rOtrggrKLYEmYhzQHLual8t/h57VOTAm9oj2H9+e2pZauBj3DUype5dCWgCWBrBxuv+kA7 ODswqahzZw52CwcsMFF/hooftJEsrWk0mSnGY45eW2AHhYAyQAtPasaDsyM1Y8G61At9Uw4gp 8QnLzt2aJXLKcnyKSnE7ImbWaudO2m2k9Q+rk1FfDnN8nzjuIAlyTA6CzdpXtAjqs7sBBCO5T PqIUGtI26zobOoH39p7xRxWKTRHhpXuE+/8IqoZ6Tn7heTa7BkFKQlos3STZsayIJlKPygKhb x+SvbI3FJiXWn57gnQ2Fv/LgtLikq6lb62D4MICgXEnyPTG/Q7k0htjBH5dyKXP6JrI2zmDxo 9ch4+9ZdN7ubrTfCbLltX76EwBpuBOgiBa8im/FHBr92hdJkCSk9qEU38IxB7Ev9R8NigdOh+ KBgWri+eEWCD55nHuEQ/Z8HmaA3/5p/0602+yiCQho+Lk2hK2FKTM6nVH7J1qAKPdInLsymyr IsYqDHuh4+5aCIyn9rjIdg5+Uv2V/2expr1myWIJsqgL1ncWIeG6bLUBQScLiSpRC9WN5p+Z9 /DEm4XaicyX/R2Amw3INcBlQJ9U2uPXvse3TFRbHqeG9MlZkTmPAeB+2k6Id+kE1PIWgHOg3D CQu3MhohZIfhr4BVge6+xZ3bkLZEiOOiK5AZGVPSV9zCpPuWa5qqYjgtWYWD5YbsVB5VDh/gs Mh7STYhcnW2xJz73mcZiX7PVMF9qWFNJMIguHhVPswazkTvxC9OdQWVhZEnHBoeG/W/XEK5Wd aKDXNP7Hzfp/zI3Tzz7j+Js7AlrUEbkcjIvGviV4Rw6P9p+FZFH2Z4aTyqevh4RmKNu7efC11 GqTMnn+7DApKrNR/BTcdLB5WkqBOEXN3DWu67sXBcCGLISOd4L/uWTdKBWnkYEre0bFq18DC6 ShXMAyCMUK2CbJAT6MAdDrB2xFPhOm/B/CqNh2xEBxoK7+155taJ5vmWTCsPgZlb9s3hDgNZg Zz2a2q8Ha1+kAvZMWA/Ja/cjhGHA1DhQoKuEpuwYHYz4+piUpb8YnXfueCHQjVlIgN+HthsTC E2f6a0XTWVYO489bSrkFpuj43398SVwVHNRQ9lPr9hfDbbnvwu544r6S+Ue0mOO5zzONT6SJl JON85TccqouCVDu0baEthcIhPfh1gkfyFVr/77+EWXoCoVOsP3nt41pWnSDBmPMMMfzTnrIbh ysDRxsDA28ZS4Q/lQ/MHx1P+8ScG+5Sojz6Qsaep/XViItOok7mFFJkSzsvqpzZCrbehLaIev x3xHECINh/M4dc0Jg86NICldTEnZ4o8wf1SNV5YvkaXaFrsVcnjxJtmyLLdE7PJ9zhBny1EqS c6M+kHEWkSLU+PgnZl2gIJVBILn5UWkUOXvNT/GtToLPGRlBVu8dyNENps3Kh0uChQH7j24vO scqSqHaHGUR927+Aasoxo940zOXVp2QHxKBss8= Content-Type: text/plain; charset="utf-8" Convert pps_kc_hardpps_lock from spinlock_t to raw_spinlock_t. This lock is held in pps_kc_event() which calls hardpps(). hardpps() takes tk_core.lock which is already a raw_spinlock =E2=80=94 nesting a sleeping l= ock (PREEMPT_RT spinlock_t) over a raw_spinlock is invalid. The locked section only checks a pointer comparison and calls hardpps(), both of which are non-sleeping. On non-RT kernels, raw_spinlock_t compiles to identical code as spinlock_t =E2=80=94 no behavioral change. Signed-off-by: Michael Byczkowski Acked-by: Rodolfo Giometti Tested-by: Michael Byczkowski Tested-by: Calvin Owens Acked-by for the the fixe of the sleeping-in-atomic issue in --- drivers/pps/kc.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/pps/kc.c b/drivers/pps/kc.c index fbd23295afd7..9c6c024d5083 100644 --- a/drivers/pps/kc.c +++ b/drivers/pps/kc.c @@ -21,7 +21,7 @@ */ /* state variables to bind kernel consumer */ -static DEFINE_SPINLOCK(pps_kc_hardpps_lock); +static DEFINE_RAW_SPINLOCK(pps_kc_hardpps_lock); /* PPS API (RFC 2783): current source and mode for kernel consumer */ static struct pps_device *pps_kc_hardpps_dev; /* unique pointer to device */ static int pps_kc_hardpps_mode; /* mode bits for kernel consumer */ @@ -36,17 +36,17 @@ static int pps_kc_hardpps_mode; /* mode bits for kernel= consumer */ int pps_kc_bind(struct pps_device *pps, struct pps_bind_args *bind_args) { /* Check if another consumer is already bound */ - spin_lock_irq(&pps_kc_hardpps_lock); + raw_spin_lock_irq(&pps_kc_hardpps_lock); if (bind_args->edge =3D=3D 0) if (pps_kc_hardpps_dev =3D=3D pps) { pps_kc_hardpps_mode =3D 0; pps_kc_hardpps_dev =3D NULL; - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); dev_info(&pps->dev, "unbound kernel" " consumer\n"); } else { - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); dev_err(&pps->dev, "selected kernel consumer" " is not bound\n"); return -EINVAL; @@ -56,11 +56,11 @@ int pps_kc_bind(struct pps_device *pps, struct pps_bind= _args *bind_args) pps_kc_hardpps_dev =3D=3D pps) { pps_kc_hardpps_mode =3D bind_args->edge; pps_kc_hardpps_dev =3D pps; - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); dev_info(&pps->dev, "bound kernel consumer: " "edge=3D0x%x\n", bind_args->edge); } else { - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); dev_err(&pps->dev, "another kernel consumer" " is already bound\n"); return -EINVAL; @@ -78,15 +78,15 @@ int pps_kc_bind(struct pps_device *pps, struct pps_bind= _args *bind_args) */ void pps_kc_remove(struct pps_device *pps) { - spin_lock_irq(&pps_kc_hardpps_lock); + raw_spin_lock_irq(&pps_kc_hardpps_lock); if (pps =3D=3D pps_kc_hardpps_dev) { pps_kc_hardpps_mode =3D 0; pps_kc_hardpps_dev =3D NULL; - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); dev_info(&pps->dev, "unbound kernel consumer" " on device removal\n"); } else - spin_unlock_irq(&pps_kc_hardpps_lock); + raw_spin_unlock_irq(&pps_kc_hardpps_lock); } /* pps_kc_event - call hardpps() on PPS event @@ -102,8 +102,8 @@ void pps_kc_event(struct pps_device *pps, struct pps_ev= ent_time *ts, unsigned long flags; /* Pass some events to kernel consumer if activated */ - spin_lock_irqsave(&pps_kc_hardpps_lock, flags); + raw_spin_lock_irqsave(&pps_kc_hardpps_lock, flags); if (pps =3D=3D pps_kc_hardpps_dev && event & pps_kc_hardpps_mode) hardpps(&ts->ts_real, &ts->ts_raw); - spin_unlock_irqrestore(&pps_kc_hardpps_lock, flags); + raw_spin_unlock_irqrestore(&pps_kc_hardpps_lock, flags); } --=20 2.47.3