Date: Sun, 30 Apr 2006 16:48:11 GMT From: Scott Long <scottl@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 96413 for review Message-ID: <200604301648.k3UGmBWR031817@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=96413 Change 96413 by scottl@scottl-junior on 2006/04/30 16:47:26 Revert the previous attempt at a CAM topology lock. Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/cam.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_debug.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#8 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_queue.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_queue.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_sim.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_sim.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#20 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_periph.h#7 integrate .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_sim.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_all.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_all.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#8 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_dvcfg.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_iu.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_low.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_low.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_low_pisa.c#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_low_pisa.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_message.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pass.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pass.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pt.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pt.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sa.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_sa.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_targ_bh.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_target.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_targetio.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi.h#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_cnfg.h#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_fc.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_inb.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_init.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_ioc.h#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_lan.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_log_fc.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_log_sas.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_raid.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_sas.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_targ.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_tool.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpilib/mpi_type.h#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt.h#8 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_cam.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_cam.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_debug.c#8 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_pci.c#8 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_raid.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_raid.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/mpt/mpt_reg.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/FILES#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/dsbr100io.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ehci.c#9 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ehci_pci.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ehcireg.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ehcivar.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/hid.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/hid.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_aue.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_auereg.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_axe.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_axereg.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_cdce.c#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_cdcereg.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_cue.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_cuereg.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_kue.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_kuereg.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_rue.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_ruereg.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_udav.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_udavreg.h#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_ural.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_uralreg.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/if_uralvar.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/kue_fw.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ohci.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ohci_pci.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ohcireg.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ohcivar.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/rio500_usb.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/sl811hs.c#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/sl811hsreg.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/sl811hsvar.h#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/slhci_pccard.c#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ubsa.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ubser.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ubser.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ucom.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ucomvar.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ucycom.c#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/udbp.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/udbp.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ufm.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ufoma.c#2 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uftdi.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uftdireg.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ugen.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ugraphire_rdesc.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhci.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhci_pci.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhcireg.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhcivar.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhid.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uhub.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ukbd.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ulpt.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/umass.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/umct.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/umodem.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/ums.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uplcom.c#7 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/urio.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_ethersubr.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_ethersubr.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_if.m#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_mem.c#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_mem.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_port.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_quirks.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_quirks.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usb_subr.c#8 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbcdc.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdevs#9 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdi.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdi.h#4 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdi_util.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdi_util.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdivar.h#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/usbhid.h#3 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uscanner.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uvisor.c#6 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uvscom.c#5 integrate .. //depot/projects/scottl-camlock/src/sys/dev/usb/uxb360gp_rdesc.h#2 integrate Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/cam.c#4 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#5 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_debug.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#8 (text+ko) ==== @@ -121,6 +121,7 @@ lun_id_t lun_id; cam_status status; u_int init_level; + int s; init_level = 0; /* @@ -185,7 +186,7 @@ if (status != CAM_REQ_CMP) goto failure; - mtx_lock(&cam_topo_lock); + s = splsoftcam(); cur_periph = TAILQ_FIRST(&(*p_drv)->units); while (cur_periph != NULL && cur_periph->unit_number < periph->unit_number) @@ -197,7 +198,8 @@ TAILQ_INSERT_TAIL(&(*p_drv)->units, periph, unit_links); (*p_drv)->generation++; } - mtx_unlock(&cam_topo_lock); + + splx(s); init_level++; @@ -212,9 +214,9 @@ /* Initialized successfully */ break; case 3: - mtx_lock(&cam_topo_lock); + s = splsoftcam(); TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); - mtx_unlock(&cam_topo_lock); + splx(s); xpt_remove_periph(periph); /* FALLTHROUGH */ case 2: @@ -242,20 +244,21 @@ { struct periph_driver **p_drv; struct cam_periph *periph; + int s; for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { if (name != NULL && (strcmp((*p_drv)->driver_name, name) != 0)) continue; - mtx_lock(&cam_topo_lock); + s = splsoftcam(); TAILQ_FOREACH(periph, &(*p_drv)->units, unit_links) { if (xpt_path_comp(periph->path, path) == 0) { - mtx_unlock(&cam_topo_lock); + splx(s); return(periph); } } - mtx_unlock(&cam_topo_lock); + splx(s); if (name != NULL) return(NULL); } @@ -265,14 +268,14 @@ cam_status cam_periph_acquire(struct cam_periph *periph) { + int s; if (periph == NULL) return(CAM_REQ_CMP_ERR); - /* XXX atomic increment instead? */ - mtx_lock(&cam_topo_lock); + s = splsoftcam(); periph->refcount++; - mtx_unlock(&cam_topo_lock); + splx(s); return(CAM_REQ_CMP); } @@ -280,17 +283,17 @@ void cam_periph_release(struct cam_periph *periph) { + int s; if (periph == NULL) return; - /* camperiphfree() will release the mutex. */ - mtx_lock(&cam_topo_lock); + s = splsoftcam(); if ((--periph->refcount == 0) && (periph->flags & CAM_PERIPH_INVALID)) { camperiphfree(periph); - } else - mtx_unlock(&cam_topo_lock); + } + splx(s); } @@ -308,10 +311,11 @@ { struct cam_periph *periph; char *periph_name; + int s; int i, val, dunit, r; const char *dname, *strval; - mtx_lock(&cam_topo_lock); + s = splsoftcam(); periph_name = p_drv->driver_name; for (;;newunit++) { @@ -357,7 +361,7 @@ if (r != 0) break; } - mtx_unlock(&cam_topo_lock); + splx(s); return (newunit); } @@ -412,7 +416,9 @@ void cam_periph_invalidate(struct cam_periph *periph) { + int s; + s = splsoftcam(); /* * We only call this routine the first time a peripheral is * invalidated. The oninvalidate() routine is always called at @@ -425,43 +431,36 @@ periph->flags |= CAM_PERIPH_INVALID; periph->flags &= ~CAM_PERIPH_NEW_DEV_FOUND; - /* camperiphfree() will release the mutex. */ - mtx_lock(&cam_topo_lock); if (periph->refcount == 0) camperiphfree(periph); - else if (periph->refcount < 0) { - mtx_unlock(&cam_topo_lock); + else if (periph->refcount < 0) printf("cam_invalidate_periph: refcount < 0!!\n"); - } + splx(s); } -/* - * The topology lock must be held on entry and will be released before return. - */ static void camperiphfree(struct cam_periph *periph) { + int s; struct periph_driver **p_drv; - mtx_assert(&cam_topo_lock, MA_OWNED); - for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { - if (strcmp((*p_drv)->driver_name, periph->periph_name) == 0) { - TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); - (*p_drv)->generation++; + if (strcmp((*p_drv)->driver_name, periph->periph_name) == 0) break; - } } - mtx_unlock(&cam_topo_lock); - if (*p_drv == NULL) { printf("camperiphfree: attempt to free non-existant periph\n"); return; } - + if (periph->periph_dtor != NULL) periph->periph_dtor(periph); + s = splsoftcam(); + TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); + (*p_drv)->generation++; + splx(s); + xpt_remove_periph(periph); if (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) { ==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#5 (text+ko) ==== @@ -129,21 +129,6 @@ struct buf *bp[CAM_PERIPH_MAXMAPS]; }; -typedef enum { - WORK_EXECUTE_CCB, - WORK_XPT_SCHED, - WORK_PERIPH_SCHED -} cam_periph_workflags; - -struct cam_periph_workitem { - TAILQ_ENTRY(cam_periph_workitem) work_link; - cam_periph_workflags command; - void *data1; - void *data2; - void (*cbfcnp)(void *); - void *cbdata; -}; - cam_status cam_periph_alloc(periph_ctor_t *periph_ctor, periph_oninv_t *periph_oninvalidate, periph_dtor_t *periph_dtor, ==== //depot/projects/scottl-camlock/src/sys/cam/cam_queue.c#4 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_queue.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_sim.c#4 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_sim.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#20 (text+ko) ==== @@ -635,7 +635,6 @@ typedef TAILQ_HEAD(cam_isrq, ccb_hdr) cam_isrq_t; static cam_isrq_t cam_bioq; static struct mtx cam_bioq_lock; -struct mtx cam_topo_lock; /* "Pool" of inactive ccbs managed by xpt_alloc_ccb and xpt_free_ccb */ static SLIST_HEAD(,ccb_hdr) ccb_freeq; @@ -1419,7 +1418,6 @@ STAILQ_INIT(&highpowerq); mtx_init(&cam_bioq_lock, "CAM BIOQ lock", NULL, MTX_DEF); - mtx_init(&cam_topo_lock, "XPT Topology lock", NULL, MTX_DEF); /* * The xpt layer is, itself, the equivelent of a SIM. @@ -1555,7 +1553,7 @@ s = splsoftcam(); camq_resize(&device->drvq, device->drvq.array_size - 1); - atomic_add_int(&device->generation, 1); + device->generation++; SLIST_REMOVE(periph_head, periph, cam_periph, periph_links); @@ -3348,6 +3346,7 @@ } case XPT_DEV_MATCH: { + int s; dev_pos_type position_type; struct ccb_dev_match *cdm; @@ -3356,7 +3355,7 @@ /* * Prevent EDT changes while we traverse it. */ - mtx_lock(&cam_topo_lock); + s = splcam(); /* * There are two ways of getting at information in the EDT. * The first way is via the primary EDT tree. It starts @@ -3404,7 +3403,7 @@ break; } - mtx_unlock(&cam_topo_lock); + splx(s); if (cdm->status == CAM_DEV_MATCH_ERROR) start_ccb->ccb_h.status = CAM_REQ_CMP_ERR; @@ -3467,7 +3466,6 @@ csa->ccb_h.path->device->refcount++; } - mtx_lock(&cam_topo_lock); if ((added & AC_FOUND_DEVICE) != 0) { /* * Get this peripheral up to date with all @@ -3482,7 +3480,6 @@ */ xpt_for_all_busses(xptsetasyncbusfunc, cur_entry); } - mtx_unlock(&cam_topo_lock); splx(s); start_ccb->ccb_h.status = CAM_REQ_CMP; break; @@ -4028,6 +4025,7 @@ void xpt_merge_ccb(union ccb *master_ccb, union ccb *slave_ccb) { + GIANT_REQUIRED; /* * Pull fields that are valid for peripheral drivers to set @@ -4044,6 +4042,7 @@ void xpt_setup_ccb(struct ccb_hdr *ccb_h, struct cam_path *path, u_int32_t priority) { + GIANT_REQUIRED; CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_setup_ccb\n")); ccb_h->pinfo.priority = priority; @@ -4055,7 +4054,7 @@ ccb_h->target_id = CAM_TARGET_WILDCARD; if (path->device) { ccb_h->target_lun = path->device->lun_id; - atomic_add_int(&ccb_h->pinfo.generation, 1); + ccb_h->pinfo.generation = ++path->device->ccbq.queue.generation; } else { ccb_h->target_lun = CAM_TARGET_WILDCARD; } @@ -4071,6 +4070,8 @@ struct cam_path *path; cam_status status; + GIANT_REQUIRED; + path = (struct cam_path *)malloc(sizeof(*path), M_CAMXPT, M_NOWAIT); if (path == NULL) { @@ -4087,33 +4088,6 @@ } static cam_status -xpt_clone_path(struct cam_path *old_path_ptr, struct cam_path **new_path_ptr) -{ - struct cam_path *path; - - path = (struct cam_path *)malloc(sizeof(*path), M_CAMXPT, M_NOWAIT); - - if (path == NULL) - return (CAM_RESRC_UNAVAIL); - - mtx_lock(&cam_topo_lock); - path->periph = old_path_ptr->periph; - path->bus = old_path_ptr->bus; - path->target = old_path_ptr->target; - path->device = old_path_ptr->device; - if (path->bus != NULL) - path->bus->refcount++; - if (path->target != NULL) - path->target->refcount++; - if (path->device != NULL) - path->device->refcount++; - mtx_unlock(&cam_topo_lock); - - *new_path_ptr = path; - return (CAM_REQ_CMP); -} - -static cam_status xpt_compile_path(struct cam_path *new_path, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id) { @@ -4121,6 +4095,7 @@ struct cam_et *target; struct cam_ed *device; cam_status status; + int s; status = CAM_REQ_CMP; /* Completed without error */ target = NULL; /* Wildcarded */ @@ -4130,7 +4105,7 @@ * We will potentially modify the EDT, so block interrupts * that may attempt to create cam paths. */ - mtx_lock(&cam_topo_lock); + s = splcam(); bus = xpt_find_bus(path_id); if (bus == NULL) { status = CAM_PATH_INVALID; @@ -4164,7 +4139,7 @@ } } } - mtx_unlock(&cam_topo_lock); + splx(s); /* * Only touch the user's data if we are successful. @@ -4176,14 +4151,12 @@ new_path->device = device; CAM_DEBUG(new_path, CAM_DEBUG_TRACE, ("xpt_compile_path\n")); } else { - mtx_lock(&cam_topo_lock); if (device != NULL) xpt_release_device(bus, target, device); if (target != NULL) xpt_release_target(bus, target); if (bus != NULL) xpt_release_bus(bus); - mtx_unlock(&cam_topo_lock); } return (status); } @@ -4192,8 +4165,6 @@ xpt_release_path(struct cam_path *path) { CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_release_path\n")); - - mtx_lock(&cam_topo_lock); if (path->device != NULL) { xpt_release_device(path->bus, path->target, path->device); path->device = NULL; @@ -4206,12 +4177,12 @@ xpt_release_bus(path->bus); path->bus = NULL; } - mtx_unlock(&cam_topo_lock); } void xpt_free_path(struct cam_path *path) { + GIANT_REQUIRED; CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_free_path\n")); xpt_release_path(path); @@ -4226,6 +4197,7 @@ int xpt_path_comp(struct cam_path *path1, struct cam_path *path2) { + GIANT_REQUIRED; int retval = 0; @@ -4261,6 +4233,7 @@ void xpt_print_path(struct cam_path *path) { + GIANT_REQUIRED; if (path == NULL) printf("(nopath): "); @@ -4295,6 +4268,8 @@ { struct sbuf sb; + GIANT_REQUIRED; + sbuf_new(&sb, str, str_len, 0); if (path == NULL) @@ -4331,6 +4306,7 @@ path_id_t xpt_path_path_id(struct cam_path *path) { + GIANT_REQUIRED; return(path->bus->path_id); } @@ -4338,6 +4314,7 @@ target_id_t xpt_path_target_id(struct cam_path *path) { + GIANT_REQUIRED; if (path->target != NULL) return (path->target->target_id); @@ -4348,6 +4325,7 @@ lun_id_t xpt_path_lun_id(struct cam_path *path) { + GIANT_REQUIRED; if (path->device != NULL) return (path->device->lun_id); @@ -4358,6 +4336,7 @@ struct cam_sim * xpt_path_sim(struct cam_path *path) { + GIANT_REQUIRED; return (path->bus->sim); } @@ -4365,6 +4344,7 @@ struct cam_periph* xpt_path_periph(struct cam_path *path) { + GIANT_REQUIRED; return (path->periph); } @@ -4541,9 +4521,7 @@ } /* Release the reference count held while registered. */ - mtx_lock(&cam_topo_lock); xpt_release_bus(bus_path.bus); - mtx_unlock(&cam_topo_lock); xpt_release_path(&bus_path); /* Recheck for more completed CCBs. */ @@ -4627,9 +4605,8 @@ } void -xpt_async(u_int32_t async_code, struct cam_path *opath, void *async_arg) +xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg) { - struct cam_path *path; struct cam_eb *bus; struct cam_et *target, *next_target; struct cam_ed *device, *next_device; @@ -4640,13 +4617,6 @@ CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_async\n")); /* - * The caller owns the path object that was passed in. Clone - * it so that we don't risk having it disappear on us. - */ - if (xpt_clone_path(opath, &path) != CAM_REQ_CMP) - return; - - /* * Most async events come from a CAM interrupt context. In * a few cases, the error recovery code at the peripheral layer, * which may run from our SWI or a process context, may signal @@ -4713,7 +4683,6 @@ xpt_async_bcast(&xpt_periph->path->device->asyncs, async_code, path, async_arg); splx(s); - xpt_free_path(path); } static void @@ -4945,7 +4914,6 @@ sim->c_handle); sim->flags &= ~CAM_SIM_REL_TIMEOUT_PENDING; } - mtx_lock(&cam_topo_lock); bus = xpt_find_bus(sim->path_id); splx(s); @@ -4953,12 +4921,9 @@ /* * Now that we are unfrozen run the send queue. */ - mtx_unlock(&cam_topo_lock); xpt_run_dev_sendq(bus); - mtx_lock(&cam_topo_lock); } xpt_release_bus(bus); - mtx_unlock(&cam_topo_lock); } else splx(s); } else @@ -5009,6 +4974,8 @@ { union ccb *new_ccb; + GIANT_REQUIRED; + new_ccb = malloc(sizeof(*new_ccb), M_CAMXPT, M_WAITOK); return (new_ccb); } @@ -5018,6 +4985,8 @@ { union ccb *new_ccb; + GIANT_REQUIRED; + new_ccb = malloc(sizeof(*new_ccb), M_CAMXPT, M_NOWAIT); return (new_ccb); } @@ -5066,14 +5035,17 @@ static void xpt_release_bus(struct cam_eb *bus) { + int s; - mtx_assert(&cam_topo_lock, MA_OWNED); + s = splcam(); if ((--bus->refcount == 0) && (TAILQ_FIRST(&bus->et_entries) == NULL)) { TAILQ_REMOVE(&xpt_busses, bus, links); bus_generation++; + splx(s); free(bus, M_CAMXPT); - } + } else + splx(s); } static struct cam_et * @@ -5081,7 +5053,6 @@ { struct cam_et *target; - mtx_assert(&cam_topo_lock, MA_OWNED); target = (struct cam_et *)malloc(sizeof(*target), M_CAMXPT, M_NOWAIT); if (target != NULL) { struct cam_et *cur_target; @@ -5116,15 +5087,18 @@ static void xpt_release_target(struct cam_eb *bus, struct cam_et *target) { + int s; - mtx_assert(&cam_topo_lock, MA_OWNED); + s = splcam(); if ((--target->refcount == 0) && (TAILQ_FIRST(&target->ed_entries) == NULL)) { TAILQ_REMOVE(&bus->et_entries, target, links); bus->generation++; + splx(s); free(target, M_CAMXPT); xpt_release_bus(bus); - } + } else + splx(s); } static struct cam_ed * @@ -5137,7 +5111,6 @@ struct cam_devq *devq; cam_status status; - mtx_assert(&cam_topo_lock, MA_OWNED); if (SIM_DEAD(bus->sim)) return (NULL); @@ -5233,8 +5206,9 @@ xpt_release_device(struct cam_eb *bus, struct cam_et *target, struct cam_ed *device) { + int s; - mtx_assert(&cam_topo_lock, MA_OWNED); + s = splcam(); if ((--device->refcount == 0) && ((device->flags & CAM_DEV_UNCONFIGURED) != 0)) { struct cam_devq *devq; @@ -5255,11 +5229,13 @@ devq = bus->sim->devq; cam_devq_resize(devq, devq->alloc_queue.array_size - 1); } + splx(s); camq_fini(&device->drvq); camq_fini(&device->ccbq.queue); free(device, M_CAMXPT); xpt_release_target(bus, target); - } + } else + splx(s); } static u_int32_t @@ -5292,7 +5268,6 @@ { struct cam_eb *bus; - mtx_assert(&cam_topo_lock, MA_OWNED); for (bus = TAILQ_FIRST(&xpt_busses); bus != NULL; bus = TAILQ_NEXT(bus, links)) { @@ -5309,7 +5284,6 @@ { struct cam_et *target; - mtx_assert(&cam_topo_lock, MA_OWNED); for (target = TAILQ_FIRST(&bus->et_entries); target != NULL; target = TAILQ_NEXT(target, links)) { @@ -5326,7 +5300,6 @@ { struct cam_ed *device; - mtx_assert(&cam_topo_lock, MA_OWNED); for (device = TAILQ_FIRST(&target->ed_entries); device != NULL; device = TAILQ_NEXT(device, links)) { @@ -7016,12 +6989,10 @@ /* * Scan all installed busses. */ - mtx_lock(&cam_topo_lock); xpt_for_all_busses(xptconfigbuscountfunc, NULL); if (busses_to_config == 0) { /* Call manually because we don't have any busses */ - mtx_unlock(&cam_topo_lock); xpt_finishconfig(xpt_periph, NULL); } else { if (busses_to_reset > 0 && scsi_delay >= 2000) { @@ -7029,7 +7000,6 @@ "devices to settle\n", scsi_delay/1000); } xpt_for_all_busses(xptconfigfunc, NULL); - mtx_unlock(&cam_topo_lock); } } @@ -7095,9 +7065,7 @@ * attached. For any devices like that, announce the * passthrough driver so the user will see something. */ - mtx_lock(&cam_topo_lock); xpt_for_all_devices(xptpassannouncefunc, NULL); - mtx_unlock(&cam_topo_lock); /* Release our hook so that the boot can continue. */ config_intrhook_disestablish(xpt_config_hook); ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_periph.h#7 (text+ko) ==== @@ -37,9 +37,6 @@ /* Functions accessed by the peripheral drivers */ #ifdef _KERNEL - -extern struct mtx cam_topo_lock; - void xpt_polled_action(union ccb *ccb); union ccb *xpt_alloc_ccb(void); union ccb *xpt_alloc_ccb_nowait(void); ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt_sim.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_all.c#4 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_all.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.c#6 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_cd.h#2 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.c#5 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ch.h#3 (text+ko) ==== ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#8 (text+ko) ==== @@ -44,9 +44,6 @@ #include <sys/eventhandler.h> #include <sys/malloc.h> #include <sys/cons.h> -#include <sys/lock.h> -#include <sys/mutex.h> -#include <sys/kthread.h> #include <machine/md_var.h> @@ -516,13 +513,6 @@ static SLIST_HEAD(,da_softc) softc_list; -static struct proc *da_proc; -static struct mtx da_workmtx; -static int da_workflags; -static TAILQ_HEAD(, cam_periph_workitem) da_worklist; - -#define DA_FLAG_EXIT 0x1 - static int daopen(struct disk *dp) { @@ -815,64 +805,13 @@ } static void -dawork(void *dummy) -{ - struct cam_periph_workitem *work; - - mtx_lock(&da_workmtx); - while ((da_workflags & DA_FLAG_EXIT) == 0) { - if ((work = TAILQ_FIRST(&da_worklist)) == NULL) { - msleep(&da_worklist, &da_workmtx, PRIBIO, "dawork", 0); - continue; - } - TAILQ_REMOVE(&da_worklist, work, work_link); - mtx_unlock(&da_workmtx); - - switch(work->command) { - case WORK_EXECUTE_CCB: - mtx_lock(&Giant); - xpt_action((union ccb *)work->data1); - mtx_unlock(&Giant); - break; - case WORK_XPT_SCHED: - mtx_lock(&Giant); - xpt_schedule((struct cam_periph *)work->data1, - (uint32_t)(uintptr_t)(work->data2)); - mtx_unlock(&Giant); - break; -#if 0 - case WORK_PERIPH_SCHED: - mtx_lock(&Giant); - daschedule((struct cam_periph *)work-data1); - mtx_unlock(&Giant); - break; -#endif - default: - panic("Unknown CAM work item %d\n", work->command); - } - - if (work->cbfcnp != NULL) - work->cbfcnp(work->cbdata); - mtx_unlock(&da_workmtx); - } - mtx_unlock(&da_workmtx); - - kthread_exit(0); -} - -static void >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604301648.k3UGmBWR031817>