Date: Tue, 2 Sep 2003 21:46:29 -0700 (PDT) From: "Kenneth D. Merry" <ken@FreeBSD.org> To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org Subject: cvs commit: src/share/man/man4 cd.4 da.4 src/share/man/man9 cd.9 taskqueue.9 src/sys/kern subr_taskqueue.c src/sys/sys taskqueue.h src/sys/cam/scsi scsi_cd.c scsi_da.c Message-ID: <200309030446.h834kT4B046788@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
ken 2003/09/02 21:46:29 PDT FreeBSD src repository Modified files: share/man/man4 cd.4 da.4 share/man/man9 cd.9 taskqueue.9 sys/kern subr_taskqueue.c sys/sys taskqueue.h sys/cam/scsi scsi_cd.c scsi_da.c Log: Move dynamic sysctl(8) variable creation for the cd(4) and da(4) drivers out of cdregister() and daregister(), which are run from interrupt context. The sysctl code does blocking mallocs (M_WAITOK), which causes problems if malloc(9) actually needs to sleep. The eventual fix for this issue will involve moving the CAM probe process inside a kernel thread. For now, though, I have fixed the issue by moving dynamic sysctl variable creation for these two drivers to a task queue running in a kernel thread. The existing task queues (taskqueue_swi and taskqueue_swi_giant) run in software interrupt handlers, which wouldn't fix the problem at hand. So I have created a new task queue, taskqueue_thread, that runs inside a kernel thread. (It also runs outside of Giant -- clients must explicitly acquire and release Giant in their taskqueue functions.) scsi_cd.c: Remove sysctl variable creation code from cdregister(), and move it to a new function, cdsysctlinit(). Queue cdsysctlinit() to the taskqueue_thread taskqueue once we have fully registered the cd(4) driver instance. scsi_da.c: Remove sysctl variable creation code from daregister(), and move it to move it to a new function, dasysctlinit(). Queue dasysctlinit() to the taskqueue_thread taskqueue once we have fully registered the da(4) instance. taskqueue.h: Declare the new taskqueue_thread taskqueue, update some comments. subr_taskqueue.c: Create the new kernel thread taskqueue. This taskqueue runs outside of Giant, so any functions queued to it would need to explicitly acquire/release Giant if they need it. cd.4: Update the cd(4) man page to talk about the minimum command size sysctl/loader tunable. Also note that the changer variables are available as loader tunables as well. da.4: Update the da(4) man page to cover the retry_count, default_timeout and minimum_cmd_size sysctl variables/loader tunables. Remove references to /dev/r???, they aren't used any longer. cd.9: Update the cd(9) man page to describe the CD_Q_10_BYTE_ONLY quirk. taskqueue.9: Update the taskqueue(9) man page to describe the new thread task queue, and the taskqueue_swi_giant queue. MFC after: 3 days Revision Changes Path 1.33 +34 -3 src/share/man/man4/cd.4 1.42 +54 -42 src/share/man/man4/da.4 1.18 +17 -1 src/share/man/man9/cd.9 1.7 +27 -10 src/share/man/man9/taskqueue.9 1.81 +46 -21 src/sys/cam/scsi/scsi_cd.c 1.157 +47 -22 src/sys/cam/scsi/scsi_da.c 1.17 +32 -0 src/sys/kern/subr_taskqueue.c 1.8 +9 -2 src/sys/sys/taskqueue.h
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309030446.h834kT4B046788>