Re: system hangs after logging into gdm

From: Ivan Klymenko <fidaj_at_ukr.net>
Date: Mon, 11 Oct 2010 22:18:18 +0300
В Mon, 11 Oct 2010 22:49:29 +0400
Anonymous <swell.k_at_gmail.com> пишет:

> Ivan Klymenko <fidaj_at_ukr.net> writes:
> 
> > В Sun, 10 Oct 2010 15:37:55 -0700
> > Garrett Cooper <gcooper_at_FreeBSD.org> writes:
> >
> >>On Sun, Oct 10, 2010 at 3:08 PM, Ivan Klymenko <fidaj_at_ukr.net>
> >>wrote:
> >>> My system has an svn r213507
> >>>
> >>> FreeBSD nonamehost 9.0-CURRENT FreeBSD 9.0-CURRENT #0 r213507: Sun
> >>> Oct 10 22:43:18 EEST 2010
> >>> root_at_nonamehost:/usr/obj/usr/src/sys/mk9 amd64
> >>>
> >>> after upgrading to r213666 my system hangs after logging into gdm
> >>>
> >>> had to go back to r213507
> >>
> >> What video driver are you using?
> >
> > NVIDIA Driver Version: 260.19.06
> 
> Do you have local patches to make it compile on /head? Could they be
> the cause of the hang? 260.19.04 and 260.19.06 use taskqueue_run(9)
> that was removed in /head_at_r210377.

patches exist, but the cause is not in them - as Xorg starts, the
system hangs after a few seconds after entering the password box to
login gdm
without a password - it works

--- src/nvidia_os.c.orig	2010-09-15 01:26:27.000000000 +0300
+++ src/nvidia_os.c	2010-09-15 01:27:51.000000000 +0300
_at__at_ -13,6 +13,67 _at__at_
 #include "nv.h"
 #include "nv-freebsd.h"
 
+struct taskqueue {
+        STAILQ_HEAD(, task)     tq_queue;
+        const char              *tq_name;
+        taskqueue_enqueue_fn    tq_enqueue;
+        void                    *tq_context;
+        struct task             *tq_running;
+        struct mtx              tq_mutex;
+        struct thread           **tq_threads;
+        int                     tq_tcount;
+        int                     tq_spin;
+        int                     tq_flags;
+};
+
+static void taskqueue_run(struct taskqueue *, struct task **);
+
+static __inline void
+TQ_LOCK(struct taskqueue *tq)
+{
+        if (tq->tq_spin)
+    	    mtx_lock_spin(&tq->tq_mutex);
+        else
+            mtx_lock(&tq->tq_mutex);
+}
+
+static __inline void
+TQ_UNLOCK(struct taskqueue *tq)
+{
+       if (tq->tq_spin)
+          mtx_unlock_spin(&tq->tq_mutex);
+       else
+          mtx_unlock(&tq->tq_mutex);
+}
+
+static void
+taskqueue_run(struct taskqueue *queue, struct task **tpp)
+{                       
+	struct task *task;
+	int pending;
+
+	mtx_assert(&queue->tq_mutex, MA_OWNED);
+	while (STAILQ_FIRST(&queue->tq_queue)) {
+	/*
+	* Carefully remove the first task from the queue and
+	* zero its pending count.
+	*/
+		task = STAILQ_FIRST(&queue->tq_queue);
+		STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
+		pending = task->ta_pending;
+		task->ta_pending = 0;
+		task->ta_running = tpp;
+		*tpp = task;
+		TQ_UNLOCK(queue);
+
+		task->ta_func(task->ta_context, pending);
+
+		TQ_LOCK(queue);
+		*tpp = NULL;
+		wakeup(task);
+	}
+}
+
 MALLOC_DEFINE(M_NVIDIA, "nvidia", "NVIDIA memory allocations");
 TASKQUEUE_DEFINE_THREAD(nvidia);
 
_at__at_ -332,7 +393,8 _at__at_
 
 RM_STATUS NV_API_CALL os_flush_work_queue(void)
 {
-    taskqueue_run(taskqueue_nvidia);
+//    taskqueue_run(taskqueue_nvidia);
+    taskqueue_run(taskqueue_nvidia, &taskqueue_nvidia->tq_running);
     return RM_OK;
 }
 
Received on Mon Oct 11 2010 - 17:18:20 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:08 UTC