Skip site navigation (1)Skip section navigation (2)
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>