From nobody Sun Jun 21 05:19:46 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 87AB32D7BF for ; Mon, 6 Apr 2026 21:04:34 +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=1775509476; cv=none; b=HuM1ouqbxGgy9Qmt1xBH1gAJFPMdt8BDYkSoLSNN1LVpZ/o3eplX/RgmNRpDrNnmqbndjtjGcwCHK8Awf8LwjieqfGFNOmVPpZBU7PdYiMULwh441i2MQqMHxMLO0VzFIX4g1L/JLGnPIES9nbrmu3BknxwN6bh8x395PDiAxB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509476; c=relaxed/simple; bh=CN+f9nnQSlsHeRk0u6PHzywzg9g89uEfY0G6u6E2W9s=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=D/EAbzfn+EC8sPiasS6rwEeEwDXHVlBoH3N5xFNLpb1GeUJLSEMAAIjWnf9NFHDsF2i53hLsTRygH7dz/lZP/e/uI1A85bPic/k4BPRFlVPpHrFIUIUnBGorra2iK7TA2R2wHmy9FoHsIvIuGh8X+qQtY483Tbif9E0v3SfrxZk= 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=NE44GuU4; 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="NE44GuU4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1775509467; x=1776114267; i=by@by-online.de; bh=NA3qmH7rDzNvCtTDmWtwTkShFHI4YTisPcqNaEvLfeA=; 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=NE44GuU4Hr1UG6IDaTLX97GRhXgywdArQj4P8Tg5/U5cS0MhUkrKScWcr0d9Gc// kGzO8ZAXZqXlbdnCOL75Ykgh/DF4cXs/mk/wJiI+yKUr+MH8Z3utcL9Dyfl9hKKRf I5/JMiPnsz3zS5SAxOlJwZy4bYTMUg2nJDLGIY2vLbAhrkTQf8qWie4LT59b5BDyw JR6Do9jZfsmt6Z+Jgzrmjh3RH8C8DzslvNkqZSKCYWFU+/iCuItlykDOlbaJdLXsx Gg3N5pNdKYPniwyhh3Q2NbgQEejVc2A8unFICXagwatnpL44SKu9s/pqMTU4BZBe6 KphhX9+hAYvgiSuRqQ== 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 1Mnq4Q-1vhx5w2PxS-00nfse; Mon, 06 Apr 2026 22:51:26 +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 v2 1/3] pps: pps-gpio: split IRQ handler into hardirq and threaded parts From: Michael Byczkowski In-Reply-To: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> Date: Mon, 6 Apr 2026 22:51:15 +0200 Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Content-Transfer-Encoding: quoted-printable Message-Id: <9D2C27F7-C2C0-46F4-9AFE-B9C1A0BC0073@by-online.de> References: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> To: giometti@enneenne.com X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:5aSGfGH8/n2dvp+k2NCtbjz2TnWMbP7o50S2zXh2oZPmm6mMccB eAuH1vvfVVhEyO7OIUn7paliCZjOEZV4WtfR1BNCP8fKcmD1tIwj4+3V5J5KLbc47pHfPcf ZalLWoAH/OqCmRPeBk5+KEk34THB7mh0Dfq1W3xM+MGUu+VLZvlpHjIUkDewOC/5f6/nJCV FGIirhkFai7q5V13Gamiw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:vpOfWTDd+DU=;lnjh+qF6bZdOvNbUYCAqZX0vPfO 6TlaG3XyS6MjKkOKVVxzkAewvUR9W5tDTBFxbMAO9kKKeEWB34DTC4pg79Vl1nRab9WNKV6IN vn7vpzq3os1pII7eAhCAg+TKLQf+lzX6vfr6UH+5eGf46m3ILXfIN2LivJztY3NkcOJtu+KFF B5R9K4YFbzyl2HTP64I8Dt8QyEm4eFcmRPrkEDMOjI6oDy5I6gjPvDhqJrNhWF8nbQrFKG0B7 64Nc8w/2ry/61Fs1abBaL626UcaYLlZ3Qx9p/js/tdIBjt7ZlqffU1zXkheHgTqe95xs4OI8a kh5Ag+Pj061FTeluC0WuRhAVePtxC7196O2dUTZWqF1jLYW3lgN1ayHaBsVnG6RbTq3NPTrLK 1VKulVCzA/nPi7pAbIxI6uU294+kUSM9CTjiQxeFn8TJNZsGsQW64GxR277ZMRpBsnuznHmXL MdU68CveihdR224Zl4vcJ5+X+MdQ3ECuw8WPAC6/1PveCL7lVRb7ouF6c8c0QKS7/Y+iFBo9d iMJ34RC9D3jx8WHmzUBSuZoKL/0J2ijv0A86Q0BeK8dLkU0Va06gsYAFt9kRX2A6h2dydWYN4 DArg/qO7UtAXjVUHv3CpvKEozCW/fkRCWUssZQREWfvReT5CJ3Lq++4jOMs2I+qjclmY7BLly pSbh1KsIuKw0LCCk6pSDGr6eUT0kjXTOOZ/PzKJpcTXo6uoPGrB68LgUwI/tTGPspEljoEoVh zH/MZrrVl7H195Rm5u4wq3P2prIMqCdJot1VURK8+M5Y9N1bU8S2ZxkD6AFdCCe9pCBIU36sD zuy4cY+W+hrQncksuEq97mJfF1z57YXEdpTw9j13+slmBjDDhSsCDZjtGmyTj81yXawiS/D9B aLKFiYlSsddcS8QWbMfnnEAa5lrMr7CDghJehBiU/iqsU540c26oO8gnaMyhhsp55oGPYWSZL cmcio8qNp77ABDtXNMhWfsNUkYiyQvA6dSI47YmpjCdoBSbUjSb7a8fQ3Ftqqxi4XobTc63hi cBetwxldy/SMJ4ONuhz0XYhp2i69id/THLd4I7keX1YvrbEApMu8z74fPz/BN8GAxQsuWCsQj ykI/d7aV3YwYeH+d3L3dDLfMb0k7o0DDg51yzkcjoRu6gWM2ANP8jAC/ulh4eIv9NtPmHt3jv dUryNX1T9/qZB/xbXGktqHf9ytW0XhnaFxMSiQqkoptMFWlbOxtzHqY6kPAEOeRNtWTZqonRN QjnoHGRxnRy8Ylw5LapD383ihtJhyGwGyhaNt05kjey+sn5ROisy190Iy/HaToKQUXWsCYBGc mwUs0UHxuk77B0MhUpjXT0R3fxJVPl1g4MnSdlv6ZJ59B2zfd9itsqNkK3OPJH8lksTjHkFrP JYgexH2y/Mpb9/z+g6jYDEdas5DVRaDThYBgNjco3waDD7siKAuki1HfyNqCbovsTJLgLBSP3 nqbVSc5x7vP8dZqYQex3rP/x3PGX6fl2S5DVwTMSS0A9TGH4lYIXg1sEVmWtuPUOKfTTMZiZr 8ezPw7/ycCh6voEY0oUqG20jav2ureVrmAbQH/o35GFXLWB8c5KrC3OKsiKWL03IZ5pMSl4ju zqd5E1lYtx8xo97/+/dACfvdioo+mAqJo5zJc0YGjbY4KG+ISBEmjWfDTGs9CxlughxmyDYk0 Eql55ZL+nGqJZnB6ozVt3bCu/QE5IJeAJY2cW9t0F5/sKszZpPg9m36GiP3N+xDc+1qGRbrFx hrmn1xy17aZMf97SRW1g6T3lO1UVj5q5rNFd9kH+S3v4Y83AtR5dmpFiktst9EWzhE71J4Fwx TWaui8JAsrEf+tWu69DuyprKtpVvK+CslS0hvnjxGok9BEU= 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 --- 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 */ }; =20 /* * Report the PPS event */ =20 -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); =20 - /* Get the time stamp first */ - pps_get_ts(&ts); + return IRQ_WAKE_THREAD; +} =20 - 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; =20 - /* 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"); =20 @@ -210,8 +221,10 @@ static int pps_gpio_probe(struct platform_device *pdev) } =20 /* 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 Sun Jun 21 05:19:46 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 1CAF72BE65B for ; Mon, 6 Apr 2026 20:53:00 +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=1775508782; cv=none; b=Pdn/I2jZdc3g+57JiIcJbk+OpxDZIUOjnG6rddxLq9/P1ShYmgpCGekK4uAj7k3l6SRHjTLKN8f2DZx/op0RLCZnoGU/XWWwdEZZdIA2e/cOMJjvdL6t/yOQD9ZBwNzPIQeX3gj+8PRWM2lKbQhj22Ldn3R7K0GphmUki3FPhIc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775508782; c=relaxed/simple; bh=UbrKVMFkffpkpwXtXqRY44yUEyf0PqFpd51Nmaw3fSU=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=WhmJSGKphGdoIT1GP0MM6xrHlh24NoWME9NwfzkRKix7cvmdZmuKMWnBpdqxEFZVq+AjnfrEnfbUJZ1t5wqcM5teOPZ2ZrrXX67763d2KZYPVBrgRrJCa2PV3UWquE+uDd3MM0QgD8/cCBgIxqkcDgaQuCEOqgiMGKCsPYbChM4= 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=t/4cZQ8r; 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="t/4cZQ8r" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1775508779; x=1776113579; i=by@by-online.de; bh=cFl1TISoPguKumBNpAofdTQ1nN1U2PdIL8ToUVOEF1g=; 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=t/4cZQ8rodtw1f0891PVqv/WVw4g47jXUkVKS9BSay+J3VUxxIon3vmmTJaDvDpc Ii4Q5cGNQWsaLePbhqoY7iuu+bf+R2lrM709dzjmhiToMwoVAl+FsqImyl5Ya75D6 2mPxBdauN4HzvawljBh02xdBZZc1Hs1edZVtDviZZ9WPH5nE9fSNKRqT8xh3Nn1ex MxBhXdvyzg4DKgHrHUmmvErZIfCT5mMYO5oTlk7qF5KphVY0y2AoFQXQflLF0PYUT 0DLx8dc671CE3P/XnyxVjKrY9zjJ1iJXU6iTjFERd4fdwFqNwB0KBXD4fF4tHwyho 80O7aMbJfu0cl6Olag== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MBltK-1wJm1W3VeO-00Cxal; Mon, 06 Apr 2026 22:52:58 +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 v2 1/3] pps: pps-gpio: split IRQ handler into hardirq and threaded parts From: Michael Byczkowski In-Reply-To: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> Date: Mon, 6 Apr 2026 22:52:48 +0200 Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Content-Transfer-Encoding: quoted-printable Message-Id: <896D78D4-5710-49DA-B8B3-74F57DD6347C@by-online.de> References: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> To: giometti@enneenne.com X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:KN/djUEaq339uE2AeL0czEKLtxGANvvMZAslCAZBsZwut+0LGma KbRAkrLTT4rkD0PgV3H3Rk8Ahk0XGfq3cWtqHq816bMX7G2g21j5uJXKFBcLJrOm0tVwWha LBOTdRTXXDiQeqE1nrDDSeGUeJ8hTInZzv+/OhH4P9gink+UwXuJq+lpHJBAW3wKrv3KkUn /TwYZ8eN4kWwnpsjbBEKw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:8A9GseksKm0=;1w4kcYm0S370rReRywY9Z+8j1/Q boe5gpDLgnp5RejEwnZRUpCQVl/lL2g1zUYgIyprO9jLgcUAOVPbmFAmHLW/VYdlXikQk7pEH hMDC1S3Lf4TDhjTKXeOuI6+tVG1Uj8g3GXkU7YAtb6B+D7fspraYvzLirT+e9nPEWLNc2xvtV 8iPETpnPV9lcJAS6naw8Xhoa8rGUfOL4BYp8c+ss+vpRyKntz6Ku7dHMFt/GOhxLjARapWezv kqQFb0Mt+RttGQw5JV0xh7vi265Rt74reZmwgbUP2OTfPnMxZCqYmnoqDMiDzUUOC4oosP/a6 hL9D1ODuPrCVJ/dk4FQqf0BijhO7uy08tVLzzkfY8nHzM4xn2mpo/UMzUmd/o4Z86hy251Tf/ fkXLEXW1JecjTTqKnxme+oJO/plfAE0bcI+dewx7KJbaQYrxrQ5gvegbKl97v3XZax3eljh4O s8wRIxzHD2cPN9P6y701rN6USNTEgPk4U6Kk1qrTqQ7YJP/qd8eY2DNw7028pFcyTmyicWG8x vgku6WzSfQ1IKUagKafETsre5cQzWi2c03YNRYQZiBjqsfHnUjus23XKZEpbeI8cyKluHG6ra rDwP7AMhN0hRqTXHY+/XdZdgqTqRSnQ/jpPl+L6TVMKWd5xc1/j6WqF0zDsGlAgfp3VhQ856q wT7p7hFtFYPlov1TsooysA5ZOe++WFjrcrXEoDsGLimjP8zkEjh5kpqIsVC79tCRnjbz92tNl s5jT1sncseurUdfR8ADpp9tkPgKfVXFyZWnci3o4BFMMuDlmaY1/BFeON3EqZuYYXEnY1PULP Fpzt3AJp3frCvGJw1hZutVg82vM3AZFvfGMbN76vDkJ1d86dBuh+eEPrnxi7qwL4ek1IWq5VS LkyKK5HzfSZ0NN91AIPbDiw3ezygQB/GrVPtDRhSpHZMElFo4Bg5NN9s2t/BzW11YRqo9qdE9 ojFge3AM9PM6D2rTIYwyXumYo565DDfleT2PWV5xMIkM0SVSVkR4L0hIF0JOcOHYxcPAm7m6u QLacK3kjBwBUEfxh2YuEoa3Tzz2w3KkcHOJnb26goHY1/zYU/x2vMEOWzLJkDrxTYNW6IL/7v Rm/xoH8LtnerhY6oKQF5cylzgOVp1qeuSQuIIIjtrWjOsJ6jZMBdE/kvjWjxMb7tekXahjooh p/Ne2nhBGMqW6n/0NlEqhVus//6/9eGlfr8DmOrq91MhWcjaq+bQSgnF5tkfq2coNgnRHwVEZ k+lTzJ4jwz0p5oRDC3YDsNlrj0jO7HW5fhdrRvNEGCvylBC5qKdnq5LVHPZ1YPg5GspMuwp9u LRjl7n/O92akL8eF1r2WZpQo2JHF3ZSM0WICfIORVu8GzqNAGYK4dGL3BL35Jeyhc5imTYfuk mLFMPxh8B+yyYhdz+oqEvnyDTCXg1xp84yK87IToGKsZ1HvBHoDB4QjdclHpPkewPCgjsTYJk I7+ir/F+FkvCvipg4jiYE8JfxmNQ7d+L6rbiLv3c2fZvlxfeU1YbUXmoxxvXNXt+TanYyJKwX rvDUejJmEHy0mUgo8H157cyRA4GbETNDwAOb1Z6A/soiM58LGkE9xgEAkvM1hPcL7wUTEXFzc E/+B9SdE0tQwvvHNgTc4O/GVEF/QGVELHUVOYMpV3ZfzcjnZ6+Wi2BiyGcyrqvoaCnMgDzImd smX1ZzA3xk8xKCE9zXp9gnEo9gQvrpPK6M9Z/srR3SZT9log2yIcec/FdbnzSViogFKaLNir0 gY4sadBoe2IQnD6ypVciSL7Z/FDfg+LTsDNpAap6CuL+cM5dBVRR7ACTwM5ipfOhyXis86RCp QDxFl2zOfNaJ9h9KgCZxSc/rZV6TKnruPckzRJvp0YxLShKG4Tr+IF+hAWPlz2Elfrv0dYZa8 2bMt+6W79PBQjOJxpsrvs+2CBNiBa6Gefwhoj0= 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 --- 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 Sun Jun 21 05:19:46 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.13]) (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 E954C1FECCD for ; Mon, 6 Apr 2026 20:58:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509105; cv=none; b=pRhrlhMHKo4N3S+f9A/Nd6DAiL4GkQ5h9BsCFPZBjSgIsQs8dSU8ONm+M67R17pcwLgXqTDoNvn2j6Sq7As7flEk/yyZA0isjabXZdkTVpHPxQBN77qQbiv/0B8TYCAY1E5GYfQ56UsASrPO74RcoQjCoHBn+3RwsIr0UYZa5Xg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509105; c=relaxed/simple; bh=bwAgp84VKj1Xji6+UDBGymxWy8nHeanDjW2QjcAgzFs=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=HoNgyaf2XIMi9o/LAmsNi/2k8kbHWUNqolK14V0qzXw8MEbNvKejXU9sXKBfx3aCY/CzsCoeETTd+By8XU4NXsOPMhveQYX17old45s8J2gFYhzDdoEHhairFNQmM+rudqqwAhDDhWTtTMm/rmhnXsAdCmWwVrkfU1M1NuZH+pM= 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=c69ujdtx; arc=none smtp.client-ip=212.227.17.13 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="c69ujdtx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1775509102; x=1776113902; i=by@by-online.de; bh=JRHaH7TI2LQal3Yy4s23j7INozog0FnR3Kl/hAdwiQw=; 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=c69ujdtxspE/Q1YIzb++H7lff/zLRo4XPU5wTbNe8uvg+dz2Ol2v2/Al00jfto1A kSuxfpNdRCVFkyNGB1A3TzbYixh56+S5MLzO3JbwjiRk3txM6u6b9TwM1AADPwdmt FiFVYNEzRkBwqd/aoo2eQL/x3No+M6WR/l4WT4QecF6kc3vKVd2L3jWSyZHijZh55 MGmorNrvlOdjkDCZHbNl8HvRS8WyRSWzhkDsvGNgLQUzz4gioCGoSzd2ZhTVrCXga gVvnTqjHVTAZfQr0YB6mL7Jb9uUGY0RfQdPAhVzomx4SjpeYL3GWhXUdzItRXY0GQ +/xQJxy/vyy0mAOVDA== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MoNyA-1vhOw91tzU-00pcKF; Mon, 06 Apr 2026 22:53:09 +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 v2 2/3] pps: convert pps_device lock to raw_spinlock for PREEMPT_RT From: Michael Byczkowski In-Reply-To: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> Date: Mon, 6 Apr 2026 22:52:59 +0200 Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Content-Transfer-Encoding: quoted-printable Message-Id: <9F77A769-3F79-4C9E-B93B-B41990CF822F@by-online.de> References: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> To: giometti@enneenne.com X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:oHDsTh1krCu9j+oya++K7/azztSyHMu4njOkMsYeQAUe92wuOog B0CFDGxnzIz2/Lao/Lhu2GlLsFULiBRKAsc1FGkEuxnfXueL75UJ7vdsqT8KtUrtzbejFhD odgR/8wqJ+SskgGGLvuGP0kHnkgpyjsifyCUDb9AEKcoKMzUTilab8nd4HOn3xmK1/WrcW9 hUlmedf1AdFZEeqt/6Bnw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:oXgOOdJgnYM=;lXnokUkAHA51BF74iqSaGBkembR DxRYpa2EOhvN1xARurUu2M1iveD0BJNCvOheymp5TNxYHGHZ1kt2yqJWee/HkMdmOC1aCitoO 8hysSh6L3lOmYv60xGtXc7Ro8D0x2Pc/zRo5W9CzjY4MaoyvnEbJW1ydzV+nN09aCYE8QSefb GEVI37A31fi3d5m3u72ZQqRuZXuqi3+rsy90y1Ug3SPCqB3Chm7Fx4GZf1uPkbWfb8KeJ9hLN hFfBV4cgYQcCqFuldOW0kKJ0sN8eV3MDVuee7Rh9Fpw1+/It1PMxH7juZugUz+rSuEgJcR+W8 Y2t4u8Giq9sdtzhuG/KC2l8aYM9vnY+Z/FyZcjMr8n/84zg9N2eqcspFopbcF/V6UDYxriGGH KV/LosJHMxYqHiCFyh6e3Mox2HU90YaK3UDAaJ4NyrFqFnkI5SU6ZuHjSoCVM1NthomoGJbG+ QP1xU7soU2DjDeO1KrzRoAAMrX5OsjqbcbuOEVfGqy130X2G5wo+S9NHzwoLjV8GllP5hZhtc q+zcxo16NeQNioGMNV487zmD3+sUDQpoFfcPm4Skf08yrPK5euJpf4VlnZ23N1/qDEtt0t1uB 9xhVxFkxB4jHTSFZTMxzoR1+yCYdXGIKOR4vf0HeWJMlLPGAkxVoWPxxeOxu0CQnfhmWkdAU5 lPQjvQU6o5Ma0ilcFFeY8mHDfYyA0n5b4TCSJyBi4Xcr75cSHBKOf9ZVoqnuxbHf6NeqWQaGS 27Gt21sZ5N3NUfea3yyFY/4mCJGaW+NDjxH+5VkpUMULxI7dO+NIl03WF9JmhpTGekAPIskYn L50a/FGU0ixF8VMocj70clgim4IpyzOqnF0WFkV8N9FAOGV/BMpR3MB0Y6WFgiij3e6ufcWw4 SKl61en4RrEP69+bXEy0q6JDAT/pCUQ1xxcgxADekTwaVdxrHjhrvSrm6ZIzcFqhy+EpC1pGG Fkj5qoVFlFSHdl4JejoKKLtHgiFvE6SxTC3tlHoJTY3MvsF+F88O2uOOinXy3Z8c4InplnAxQ NUsxHqfMCOFR3c3Xo759xOSCbhVEwbL78PU88PBqU4zVaLQDtKP96MFTE77xQLWdY5DH/pcP4 1jUjr4nY/4tVAmUNR+hI7+lIm0r96iFeJ4NRXS+Qt21Oqy6q+sK8UROg59D6D3yEQDtfQ5BRS 0qTYgmmyCXpmuTiFkrzkix7F1cEtLo1cyoe7W297ehtdElXzD6jW+xK26c/fy/hgbMwm2AhU5 FpSWAKWLuBqR+UfMnhq8ivlcNk9O0la+WgF/OtfAFioYcFRAULD+M2VUnPXsbgpTDfYndXbsN x/et0WhXCKpRLuff28muWBHl06mbqys286uTnUhLLRQz1YFTpUHHmxXq4a/jlZ9RSnEVUcl0t vD54oF2tP0X+yIXW/c7xSzfUrLyszRrIX2mMdHAyuDz1+fOtSsvzFZfGUU57WNAgYrUykKmgv 27uvLUd6Al0oj5EEK9Fqt1m+KSYSzW+ah+++XjlBaT+33F/yXBvBhp+v+6tGJLpHCNu7x4QjX A+XuwH0pzOvV6Y3fIopq25ZM5IKauT2fEjMpBviR8tE5XgvZMLf9aiLhceQRxk71yfXHYquYp FPx1WkVc24NlW/uPTgPxgs9+mQ5KZBn+DHMScJLnwRmuEk13eNuwv0XyfnUIdMSQGEj1Y5P7L lQTr1hZcarlXEvbSpboj7XxvulYRpXKEr6vA/8ctuPmK0xLIFwoNIYoudYjHsGHlWigDBGu/6 3Gk9CgPptjQ9iM9E/dPwQut/bLX8zqL0xYSnJBE1+uaBVfJ35tGKMs77A0gZPyZPRC22SxhRO +YpFy7joH4PsSd4jLfXhNeXk3Q== 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. 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 --- drivers/pps/kapi.c | 6 +++--- drivers/pps/pps.c | 16 ++++++++-------- include/linux/pps_kernel.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index 1bf0335a1b41..dc7fac75ec27 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; =20 init_waitqueue_head(&pps->queue); - spin_lock_init(&pps->lock); + raw_spin_lock_init(&pps->lock); =20 /* 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, =20 timespec_to_pps_ktime(&ts_real, ts->ts_real); =20 - spin_lock_irqsave(&pps->lock, flags); + raw_spin_lock_irqsave(&pps->lock, flags); =20 /* Must call the echo function? */ if ((pps->params.mode & (PPS_ECHOASSERT | PPS_ECHOCLEAR))) @@ -214,6 +214,6 @@ void pps_event(struct pps_device *pps, struct pps_event= _time *ts, int event, kill_fasync(&pps->async_queue, SIGIO, POLL_IN); } =20 - spin_unlock_irqrestore(&pps->lock, flags); + raw_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"); =20 - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); =20 /* Get the current parameters */ params =3D pps->params; =20 - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); =20 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; } =20 - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); =20 /* 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; =20 - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); =20 break; =20 @@ -190,7 +190,7 @@ static long pps_cdev_ioctl(struct file *file, return err; =20 /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); =20 pps->last_fetched_ev =3D pps->last_ev; =20 @@ -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; =20 - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); =20 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; =20 /* Return the fetched timestamp and save last fetched event */ - spin_lock_irq(&pps->lock); + raw_spin_lock_irq(&pps->lock); =20 pps->last_fetched_ev =3D pps->last_ev; =20 @@ -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)); =20 - spin_unlock_irq(&pps->lock); + raw_spin_unlock_irq(&pps->lock); =20 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 /* --=20 2.47.3 From nobody Sun Jun 21 05:19:46 2026 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.13]) (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 264AF2F690F for ; Mon, 6 Apr 2026 21:18:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775510318; cv=none; b=d5pGRTktfukOyAzEO6+f7h6YtAluR7iCohevLXcWRPmnG7MrEtOnUi2Q3hDp2A0S/L/pRP379ABZMKEtIkoAPOxmswtOCWO6gGfPIk/6n6dfMdSq6k0v56wo7Lhw8TLx0zzxnPU3f27U4N78AWJuekf+S0STGBdn81V1EILH6/k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775510318; c=relaxed/simple; bh=rZ363rozUdS5rXT3WMaWBbyV88UpkFb/Y0+MKBWR5W0=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=PvKDOUgf1oudn0wmx07goCM7LaY6NZj8kBVbyugoyKfg1AeAIJYbXl5SZPhksmFGIkJEK++p6/UF1S8cuvqVum9l7tKS7p41U0R2ZaSkEe/nH9sLJEXMeCfFPTdYiYPMZXewbzAZaP1lMGhfsDVX0RR6jAOXR4eAjB6tGufHQMg= 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=SWOo+tB+; arc=none smtp.client-ip=212.227.17.13 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="SWOo+tB+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=by-online.de; s=s1-ionos; t=1775510314; x=1776115114; i=by@by-online.de; bh=8A1xe5ASE6pW0NkoT6VjJv7Yo1QrDlHHJcM/MS1zZBo=; 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=SWOo+tB+d17Y1ccaLCqES2n55Az1MgfbEuhhggS/Y+t6Zl7eclfuHiOZQ8cZ1gmV yluESJjSBLjjm4O+JroEtpEfOFVx0DeDmQ4LIi4t725de694229X4ZyqoW0Gu2hli WTUVHb5RZ6D0oFQzM752XGGVV3+3lMBtYcXpY5cjB/iaSUuGRicRaGe3OQ3eyHUnS MFS2prlGgyLnFSTu3o8zYZH4EkJKoYRAzzAhYT7VZpgx/jgDIDdO8CfwlMeWmsYgO G/iR3z/H+m4rBGCru9qkQTWss4kTcu2s/B9dbTzwxWXA6y3V18Alz0hDY8Mn852SG +Foq8ZuY9YAUY+AGpw== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MF39S-1wGSeu3Sem-00GHVX; Mon, 06 Apr 2026 22:53: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 v2 3/3] pps: convert pps_kc_hardpps_lock to raw_spinlock for PREEMPT_RT From: Michael Byczkowski In-Reply-To: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> Date: Mon, 6 Apr 2026 22:53:42 +0200 Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org Content-Transfer-Encoding: quoted-printable Message-Id: <9ADC9FAE-D3F3-489E-90BA-826C0002DD3D@by-online.de> References: <1BB87C0C-33C1-45C3-B50E-C5F349DA3FDC@by-online.de> To: giometti@enneenne.com X-Mailer: Apple Mail (2.3826.700.81.1.6) X-Provags-ID: V03:K1:K/nanOeJwafWG7gCQUL9rideLiPEchrixrnBbHnQ8wQqSql/4XE IufTqrkSqfo4KIPN7cYiY6wQaK96jnoEEo5uwIulCy+3vbhxV99sNgsahpPGiWib0UmswV+ 6VhKbZomOlYLpQHPybsTFKkKLnQU2X8YoOxmw6/dHEOvClVVYPbfAzbRynfLpQTYf/GKvH3 FTx4FUMJ6VOjj+C4rA1YQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:MzCt1b+g62U=;NkMsXWyMJoBvYLMBKHzkyjsAa5d 7V0OfdWr7DgzT72BQJMrjfctA3RtSOlJl7CAnW0gBic0GNlvYSA4D4d4pHjaG6EjoPZLjNjj9 NjU3SMsmO/EwDatEivjDofYAfkqv6yrMBU6dkSoHKd6JMxr/414ME+xbQC6fZz0miOk8kxTZG oammvk6kuM8FiVdGSaq7hgvF7l6+wqY8lMOGAevHQXUNkychobygrMZrZkuFaMmzilrDHsh2F CbGeQZFkKBUMSd4pI/vqQJcPk1ePZO2KEFMa1aQnVpMOjkLVfuLVEOEQRIE8OBDjbjmXr0kZV 1XTL+YdxMh3awEEkutrJY4QImYoG+6UOLdG1GFGZcBDVUfdmdaf0kXcNYh2fLMkoJeV8jg7Nk AtkyZjwqlTqfdyptWkIL6Jvb9RuBxYNpyZPgt9820EOvXQHAugiSoAwK9f3/0FpygfSvSxGcX lvSOyDuhrkH5zXRaiNC+xVY/28VIXXfl9g8YBH22+nQlwnwF1Df7hMkxyNxlrys+x0+E8WmqU chrWV+sKDowNuJWAWgB7bxP0I8+x7pK2WuX8bukhFDGC+f88I7pyZAfcyAmfMEe96PMmf6V9t kRhtd/ewwUmXlezDGXhD0zLbxl3/Ao6fFyCdhcnXp0Z5FeZ2BtT4X+QcLapVdm9KznFNKWwnK iEPRXC5giO0+fJHruYpnw/5ULuPWTc7ZnjaKMrucI1pSPIv1EdkBd3JTF38dyvxC/n066Wtin 4Q/c9qpK6ODqQIJtFo1xDataRae4yyPbnnRo7KPJkfOU6qf67JVIQxVtFJSafhF6vOkBTcjAv wqIsLbOgis4GfCTcI+kKDt3kkLT99y3rS73s2D00plT6/pFH5FurZTomO3MPqiGD7GJQivxgb vjh57SCcXQdDOzah/OXQbkI1/MD6T/bJm8gay3cYdnXhr91BJKtxgIodJTOUGUFDArTvHm1m3 NCwGVNgFdjFIORG95oPLZ0wIPMh8A3njbiUZgrjZPJh/iJ9AgCEDxFEWf40pUFLwdzPG/nP5R SaLYkFLejBx00F8CReD3Cmejk04hF6H+OukSk8I31+z3XLTNresHOiGER71MgMrGdISJN7Uhu x6Pbfc4DVrQATYrpsLRYB7ZwTMKo2cvHxkL64a3hFt/7BVF6N8IAa3dbF3Hp9IF+sXugu6xuN Zi6HJXAnsjQ3k+1OlVN4SRerpp/sMHPtf5BJ0LgbpTYkJOhVzU8kaBDFxVMmxKkBJlibS/sgc fAAIfL/SJ+Gs3RxitLo2Mhvhb6YTVfrF82gMEnB9zl1g5oS3fJ7lcTtIAP1U4Tpu4/6PfkB44 0kTbskNx0MtEC530YLrc8tyMyO7B7TIB4KtvtpOOna+nELA5sc3GQhClhoD/tXbjVO+nWzZH5 hixLQkr1y3wxJzHHIGNqoGhPzbDHs2gps7kVlV+pPMYGqxdMsk8CLhh3GwBAe4rz38z7LJGVS Iu715Tt/hD755tc2DJ30mLK/lmz1vKizC504vT5ejkfjZwTv7zR/58euS7ORLNEBdxD2jLjw/ Wj8yvfqD1iMdj0SKsyWWZ6tnaSsGO/Befog8Uheq9Sh2LN1j31FyYhB99Xcuj1+odWSIlNUjg ekJ0+ujf/p3hX3WMP46ksJzq+5uQ7VYD4QE3J/xm0vrXzHDKyQYB9jKVnaUW+BYkNOAcA9Th6 jTSvG+QI/LNwU4Tr2xORJtCOOImYPBMLe2eEQR3wfxI+FK5NFBUEOtz+KA+gHGVA9pwn2VogK tT1XUNug4e8eI2FE1/XJYrnAztaal589Qf0XKcusq2z2jqz63c+eK3yJ9m1Cf8zwok1AT1bYt Ju4zIMj7XhqLJGQz9NEIOLs78w== 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 --- 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 @@ */ =20 /* 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 kerne= l 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); =20 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); } =20 /* 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; =20 /* 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