В 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