kraxel / rpms / kernel

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