From patchwork Mon Feb 8 22:38:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 378790 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 686ADC4332E for ; Mon, 8 Feb 2021 22:39:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4E03B64EB1 for ; Mon, 8 Feb 2021 22:39:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230132AbhBHWjE (ORCPT ); Mon, 8 Feb 2021 17:39:04 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:39696 "EHLO galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229894AbhBHWjC (ORCPT ); Mon, 8 Feb 2021 17:39:02 -0500 From: Sebastian Andrzej Siewior DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BvatIb+SuoAuL1N1yaJF6Fqf9sEJaUMKCM1rr5oWM0c=; b=HQ8/+BYas8HMUkPF27kztYqrFhdPsFIp69WWxyy/EEF0Ir4mMx5TNUNl8G8wjx968H0tWA fijZ9pRp9yy5V9jXhZWQWreUCfT4VvtdxXJocSAJAfbcnTEnXMbC9JijwK3xwNArT9da0b i2UhsAjxTMq5BlTbjlWVLsDU1x9n3FZRGzADq8hV1tP/mBQz4OmBfad+vXFf9kj1rgEbE8 a8qdJntipwhJnbJEeljHzFMKkgJyINRhS4I8h5SIrUv8Qf6tIC/OEZMZn49zJVbro20krO QQNdgJn/wCKA3HDM9WtcFZWi60bIhfiG/B88mUBeQ3fJ50/YUEjVUQ8gyfmTrw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BvatIb+SuoAuL1N1yaJF6Fqf9sEJaUMKCM1rr5oWM0c=; b=3qtO6vvCZk8yVT+UG/xPNQ/5g6dZnHinwVdniGk7VN9PvM6WrZAx5BTDtKsCc/h3rdpMLb QvvC58VbkmR+NmCA== To: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Russell King , linux-omap@vger.kernel.org, Thomas Gleixner , Greg Kroah-Hartman , "Ahmed S. Darwish" , Sebastian Andrzej Siewior Subject: [PATCH 1/3] video: omap: Remove in_interrupt() usage. Date: Mon, 8 Feb 2021 23:38:08 +0100 Message-Id: <20210208223810.388502-2-bigeasy@linutronix.de> In-Reply-To: <20210208223810.388502-1-bigeasy@linutronix.de> References: <20210208223810.388502-1-bigeasy@linutronix.de> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org From: "Ahmed S. Darwish" alloc_req() uses in_interrupt() to detect if it is safe to use down(). The usage of in_interrupt() in drivers is phased out and Linus clearly requested that code which changes behaviour depending on context should either be separated or the context be conveyed in an argument passed by the caller, which usually knows the context. The semaphore is used as a counting semaphore, initialized with the number of slots in the request pool minus IRQ_REQ_POOL_SIZE - which are reserved for the in_interrupt() user to ensure that a request is always available. The preemptible user will block on the semphore waiting for a request to become available in case there are no requests available. Replace in_interrupt() with a `can_sleep' argument to indicate if it is safe to block on the sempahore. Cc: linux-omap@vger.kernel.org Signed-off-by: Ahmed S. Darwish Signed-off-by: Sebastian Andrzej Siewior --- drivers/video/fbdev/omap/hwa742.c | 42 ++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/drivers/video/fbdev/omap/hwa742.c b/drivers/video/fbdev/omap/hwa742.c index cfe63932f8255..b191bef22d984 100644 --- a/drivers/video/fbdev/omap/hwa742.c +++ b/drivers/video/fbdev/omap/hwa742.c @@ -100,6 +100,14 @@ struct { struct hwa742_request req_pool[REQ_POOL_SIZE]; struct list_head pending_req_list; struct list_head free_req_list; + + /* + * @req_lock: protect request slots pool and its tracking lists + * @req_sema: counter; slot allocators from task contexts must + * push it down before acquiring a slot. This + * guarantees that atomic contexts will always have + * a minimum of IRQ_REQ_POOL_SIZE slots available. + */ struct semaphore req_sema; spinlock_t req_lock; @@ -224,13 +232,13 @@ static void disable_tearsync(void) hwa742_write_reg(HWA742_NDP_CTRL, b); } -static inline struct hwa742_request *alloc_req(void) +static inline struct hwa742_request *alloc_req(bool can_sleep) { unsigned long flags; struct hwa742_request *req; int req_flags = 0; - if (!in_interrupt()) + if (can_sleep) down(&hwa742.req_sema); else req_flags = REQ_FROM_IRQ_POOL; @@ -399,8 +407,8 @@ static void send_frame_complete(void *data) hwa742.int_ctrl->enable_plane(OMAPFB_PLANE_GFX, 0); } -#define ADD_PREQ(_x, _y, _w, _h) do { \ - req = alloc_req(); \ +#define ADD_PREQ(_x, _y, _w, _h, can_sleep) do {\ + req = alloc_req(can_sleep); \ req->handler = send_frame_handler; \ req->complete = send_frame_complete; \ req->par.update.x = _x; \ @@ -413,7 +421,8 @@ static void send_frame_complete(void *data) } while(0) static void create_req_list(struct omapfb_update_window *win, - struct list_head *req_head) + struct list_head *req_head, + bool can_sleep) { struct hwa742_request *req; int x = win->x; @@ -427,7 +436,7 @@ static void create_req_list(struct omapfb_update_window *win, color_mode = win->format & OMAPFB_FORMAT_MASK; if (x & 1) { - ADD_PREQ(x, y, 1, height); + ADD_PREQ(x, y, 1, height, can_sleep); width--; x++; flags &= ~OMAPFB_FORMAT_FLAG_TEARSYNC; @@ -439,19 +448,19 @@ static void create_req_list(struct omapfb_update_window *win, if (xspan * height * 2 > hwa742.max_transmit_size) { yspan = hwa742.max_transmit_size / (xspan * 2); - ADD_PREQ(x, ystart, xspan, yspan); + ADD_PREQ(x, ystart, xspan, yspan, can_sleep); ystart += yspan; yspan = height - yspan; flags &= ~OMAPFB_FORMAT_FLAG_TEARSYNC; } - ADD_PREQ(x, ystart, xspan, yspan); + ADD_PREQ(x, ystart, xspan, yspan, can_sleep); x += xspan; width -= xspan; flags &= ~OMAPFB_FORMAT_FLAG_TEARSYNC; } if (width) - ADD_PREQ(x, y, 1, height); + ADD_PREQ(x, y, 1, height, can_sleep); } static void auto_update_complete(void *data) @@ -461,12 +470,12 @@ static void auto_update_complete(void *data) jiffies + HWA742_AUTO_UPDATE_TIME); } -static void hwa742_update_window_auto(struct timer_list *unused) +static void __hwa742_update_window_auto(bool can_sleep) { LIST_HEAD(req_list); struct hwa742_request *last; - create_req_list(&hwa742.auto_update_window, &req_list); + create_req_list(&hwa742.auto_update_window, &req_list, can_sleep); last = list_entry(req_list.prev, struct hwa742_request, entry); last->complete = auto_update_complete; @@ -475,6 +484,11 @@ static void hwa742_update_window_auto(struct timer_list *unused) submit_req_list(&req_list); } +static void hwa742_update_window_auto(struct timer_list *unused) +{ + __hwa742_update_window_auto(false); +} + int hwa742_update_window_async(struct fb_info *fbi, struct omapfb_update_window *win, void (*complete_callback)(void *arg), @@ -497,7 +511,7 @@ int hwa742_update_window_async(struct fb_info *fbi, goto out; } - create_req_list(win, &req_list); + create_req_list(win, &req_list, true); last = list_entry(req_list.prev, struct hwa742_request, entry); last->complete = complete_callback; @@ -544,7 +558,7 @@ static void hwa742_sync(void) struct hwa742_request *req; struct completion comp; - req = alloc_req(); + req = alloc_req(true); req->handler = sync_handler; req->complete = NULL; @@ -599,7 +613,7 @@ static int hwa742_set_update_mode(enum omapfb_update_mode mode) omapfb_notify_clients(hwa742.fbdev, OMAPFB_EVENT_READY); break; case OMAPFB_AUTO_UPDATE: - hwa742_update_window_auto(0); + __hwa742_update_window_auto(true); break; case OMAPFB_UPDATE_DISABLED: break; From patchwork Mon Feb 8 22:38:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 378791 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 25022C433E6 for ; Mon, 8 Feb 2021 22:39:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DE06864E56 for ; Mon, 8 Feb 2021 22:39:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230035AbhBHWjD (ORCPT ); Mon, 8 Feb 2021 17:39:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229927AbhBHWjB (ORCPT ); Mon, 8 Feb 2021 17:39:01 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A87B1C061786; Mon, 8 Feb 2021 14:38:21 -0800 (PST) From: Sebastian Andrzej Siewior DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Z3Vm5cN5ZRUgTJMYYFZ2xGq76D9G/sCK8skQRU1NGXs=; b=zdkkD1GHAcXiTl5Xp5WBjkMHpvlCx8N1EMZZ0J5omzWl5zGMWQHcfr2leKqZ2OuFdFoxzo LDNYCWrbNxQVyWVzbJZX40rmBncOwnx+IlIA/uWBNHfku+mwB5EF5GFyP6tSxz3SWjy06I 2vRBMefxXCJrCqlO3/xUg9aW21005IA0v8xkGMYSv1fGS7EUfolXQ0fNcBN1I2aGJLb1jM vmGB6hTk034GoKkwiQwEBfai9G6Zi7jmYQrm+4bobOJYsU629npnlIduQTlvDVb5i06C/4 Ldr8LxS4CiXN7kcPb1E6TGdMyOwP2WiiuW3G9Gg8yKwfWwZuii+KTvk/zv1ayA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Z3Vm5cN5ZRUgTJMYYFZ2xGq76D9G/sCK8skQRU1NGXs=; b=KYB6Smx+kX0Y4v7x1cybAQtIzFv1RIr5biZy0O2ij6xXZJDo1M0tA6FUs+Iwi0KZrgY8UL 8QHHojAdWC4YLZCA== To: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Russell King , linux-omap@vger.kernel.org, Thomas Gleixner , Greg Kroah-Hartman , "Ahmed S. Darwish" , Sebastian Andrzej Siewior Subject: [PATCH 2/3] video: omapfb: Remove WARN_ON(in_interrupt()). Date: Mon, 8 Feb 2021 23:38:09 +0100 Message-Id: <20210208223810.388502-3-bigeasy@linutronix.de> In-Reply-To: <20210208223810.388502-1-bigeasy@linutronix.de> References: <20210208223810.388502-1-bigeasy@linutronix.de> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org From: "Ahmed S. Darwish" dsi_sync_vc() uses in_interrupt() to create a warning if the function is used in non-preemptible context. The usage of in_interrupt() in drivers is phased out and Linus clearly requested that code which changes behaviour depending on context should either be separated or the context be conveyed in an argument passed by the caller, which usually knows the context. The wait_for_completion() function (used in dsi_sync_vc_vp() and dsi_sync_vc_l4() has already a check if it is invoked from proper context. Remove WARN_ON(in_interrupt()) from the driver. Cc: linux-omap@vger.kernel.org Signed-off-by: Ahmed S. Darwish Signed-off-by: Sebastian Andrzej Siewior --- drivers/video/fbdev/omap2/omapfb/dss/dsi.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dsi.c b/drivers/video/fbdev/omap2/omapfb/dss/dsi.c index dc34bb04b865c..df90091de75f8 100644 --- a/drivers/video/fbdev/omap2/omapfb/dss/dsi.c +++ b/drivers/video/fbdev/omap2/omapfb/dss/dsi.c @@ -2373,8 +2373,6 @@ static int dsi_sync_vc(struct platform_device *dsidev, int channel) WARN_ON_ONCE(!dsi_bus_is_locked(dsidev)); - WARN_ON(in_interrupt()); - if (!dsi_vc_is_enabled(dsidev, channel)) return 0; From patchwork Mon Feb 8 22:38:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 379612 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3ED54C433E9 for ; Mon, 8 Feb 2021 22:39:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 238C764EB1 for ; Mon, 8 Feb 2021 22:39:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230127AbhBHWjD (ORCPT ); Mon, 8 Feb 2021 17:39:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229621AbhBHWjB (ORCPT ); Mon, 8 Feb 2021 17:39:01 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AF644C061788; Mon, 8 Feb 2021 14:38:21 -0800 (PST) From: Sebastian Andrzej Siewior DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v0cq3WK986SUH+YkubdosVAvIMlSY7yYpl0TWaVW1sQ=; b=wuwra8SrIErSfUEvj46Wmh4CpVPpBAnZBmNF4wCyT1u4UhvfrSvb2NW9wYUfSXi37IkEoU oEYNHL9bgB/n1/yZoBInp+B7RDD2KizFqPICjE94ofmycg9xKsq+id3Gwb4UrmpJ+XKor1 H3gzYfc0VtkE6GEgHj8+rkWpLQ74HzbkYKjlhFUnaV+00Zhy09oB9EHnBdzPWKysFARZpA NfbbXmFxJ3C6uhUrJ6EUlpx9Wq9o0UEdmwjER8hh+yXmU2QAoHQc25caGgFns27M7PJuH7 bRUBGrl4d7LTJpiBUwuZI7wFto4EX4RYfaNxHHzf9x3nDiOlg0DxNa76bODtcg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1612823899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v0cq3WK986SUH+YkubdosVAvIMlSY7yYpl0TWaVW1sQ=; b=x8XMjFq1YWqgn/3UQwkMOZ42YQcUoy9EzkqPUkf3l/Y2t3VRpF2H5ckJPaIuOMFQxuFOgI z1/Q+GJSz87c8kCA== To: linux-fbdev@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Russell King , linux-omap@vger.kernel.org, Thomas Gleixner , Greg Kroah-Hartman , Sebastian Andrzej Siewior , Peter Collingbourne Subject: [PATCH 3/3] video: fbdev: amba-clcd: Always use msleep() for waiting Date: Mon, 8 Feb 2021 23:38:10 +0100 Message-Id: <20210208223810.388502-4-bigeasy@linutronix.de> In-Reply-To: <20210208223810.388502-1-bigeasy@linutronix.de> References: <20210208223810.388502-1-bigeasy@linutronix.de> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org The driver uses in_atomic() to distinguish between mdelay() and msleep(). The usage of in_interrupt() in drivers is phased out and Linus clearly requested that code which changes behaviour depending on context should either be separated or the context be conveyed in an argument passed by the caller, which usually knows the context. I traced the usage of in_interrupt() back to its initial merge: bfe694f833643 ("[ARM] Add ARM AMBA CLCD framebuffer driver.") https://git.kernel.org/history/history/c/bfe694f833643 The driver has been removed and added back in the meantime. I've been looking for the IRQ context as described in the comment and couldn't find it. The functions calling clcdfb_sleep() also call conditionally backlight_update_status() which acquires a mutex. If it is okay to acquire a mutex then it is okay to use msleep() since both functions must be used in preemptible context. Replace clcdfb_sleep() with msleep(). Cc: Peter Collingbourne Cc: Russell King Signed-off-by: Sebastian Andrzej Siewior --- drivers/video/fbdev/amba-clcd.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c index 33595cc4778e9..9ec969e136bfd 100644 --- a/drivers/video/fbdev/amba-clcd.c +++ b/drivers/video/fbdev/amba-clcd.c @@ -35,19 +35,6 @@ /* This is limited to 16 characters when displayed by X startup */ static const char *clcd_name = "CLCD FB"; -/* - * Unfortunately, the enable/disable functions may be called either from - * process or IRQ context, and we _need_ to delay. This is _not_ good. - */ -static inline void clcdfb_sleep(unsigned int ms) -{ - if (in_atomic()) { - mdelay(ms); - } else { - msleep(ms); - } -} - static inline void clcdfb_set_start(struct clcd_fb *fb) { unsigned long ustart = fb->fb.fix.smem_start; @@ -77,7 +64,7 @@ static void clcdfb_disable(struct clcd_fb *fb) val &= ~CNTL_LCDPWR; writel(val, fb->regs + fb->off_cntl); - clcdfb_sleep(20); + msleep(20); } if (val & CNTL_LCDEN) { val &= ~CNTL_LCDEN; @@ -109,7 +96,7 @@ static void clcdfb_enable(struct clcd_fb *fb, u32 cntl) cntl |= CNTL_LCDEN; writel(cntl, fb->regs + fb->off_cntl); - clcdfb_sleep(20); + msleep(20); /* * and now apply power.