90 lines
3.8 KiB
Diff
90 lines
3.8 KiB
Diff
|
|
Delivered-To: jwboyer@gmail.com
|
|
Received: by 10.229.184.7 with SMTP id ci7csp32184qcb;
|
|
Mon, 20 Aug 2012 23:40:20 -0700 (PDT)
|
|
Received: by 10.236.195.97 with SMTP id o61mr24210886yhn.17.1345531220620;
|
|
Mon, 20 Aug 2012 23:40:20 -0700 (PDT)
|
|
Return-Path: <airlied@redhat.com>
|
|
Received: from mx1.redhat.com (mx1.redhat.com. [209.132.183.28])
|
|
by mx.google.com with ESMTP id c5si239413anp.5.2012.08.20.23.40.20;
|
|
Mon, 20 Aug 2012 23:40:20 -0700 (PDT)
|
|
Received-SPF: pass (google.com: domain of airlied@redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28;
|
|
Authentication-Results: mx.google.com; spf=pass (google.com: domain of airlied@redhat.com designates 209.132.183.28 as permitted sender) smtp.mail=airlied@redhat.com
|
|
Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
|
|
by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q7L6eJ4K014799
|
|
(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
|
|
Tue, 21 Aug 2012 02:40:19 -0400
|
|
Received: from prime.bne.redhat.com (dhcp-41-76.bne.redhat.com [10.64.41.76])
|
|
by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q7L6eFfB029177;
|
|
Tue, 21 Aug 2012 02:40:16 -0400
|
|
From: Dave Airlie <airlied@redhat.com>
|
|
To: linux-fbdev@vger.kernel.org
|
|
Cc: dri-devel@lists.sf.net, linux-kernel@vger.kernel.org,
|
|
Linus <torvalds@linux-foundation.org>,
|
|
Alan Cox <alan@lxorguk.ukuu.org.uk>,
|
|
Randy Dunlap <rdunlap@xenotime.net>, Josh Boyer <jwboyer@gmail.com>,
|
|
Dave Airlie <airlied@redhat.com>
|
|
Subject: [PATCH] fbcon: fix race condition between console lock and cursor timer
|
|
Date: Tue, 21 Aug 2012 16:40:07 +1000
|
|
Message-Id: <1345531207-24926-1-git-send-email-airlied@redhat.com>
|
|
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
|
|
|
|
So we've had a fair few reports of fbcon handover breakage between
|
|
efi/vesafb and i915 surface recently, so I dedicated a couple of
|
|
days to finding the problem.
|
|
|
|
Essentially the last thing we saw was the conflicting framebuffer
|
|
message and that was all.
|
|
|
|
So after much tracing with direct netconsole writes (printks
|
|
under console_lock not so useful), I think I found the race.
|
|
|
|
Thread A (driver load) Thread B (timer thread)
|
|
unbind_con_driver -> |
|
|
bind_con_driver -> |
|
|
vc->vc_sw->con_deinit -> |
|
|
fbcon_deinit -> |
|
|
console_lock() |
|
|
| |
|
|
| fbcon_flashcursor timer fires
|
|
| console_lock() <- blocked for A
|
|
|
|
|
|
|
|
fbcon_del_cursor_timer ->
|
|
del_timer_sync
|
|
(BOOM)
|
|
|
|
Of course because all of this is under the console lock,
|
|
we never see anything, also since we also just unbound the active
|
|
console guess what we never see anything.
|
|
|
|
Hopefully this fixes the problem for anyone seeing vesafb->kms
|
|
driver handoff.
|
|
|
|
Signed-off-by: David Airlie <airlied@redhat.com>
|
|
---
|
|
drivers/video/console/fbcon.c | 6 +++++-
|
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
|
|
index 2e471c2..f8a79fc 100644
|
|
--- a/drivers/video/console/fbcon.c
|
|
+++ b/drivers/video/console/fbcon.c
|
|
@@ -372,8 +372,12 @@ static void fb_flashcursor(struct work_struct *work)
|
|
struct vc_data *vc = NULL;
|
|
int c;
|
|
int mode;
|
|
+ int ret;
|
|
+
|
|
+ ret = console_trylock();
|
|
+ if (ret == 0)
|
|
+ return;
|
|
|
|
- console_lock();
|
|
if (ops && ops->currcon != -1)
|
|
vc = vc_cons[ops->currcon].d;
|
|
|
|
--
|
|
1.7.10.2
|
|
|