Date: Mon, 12 Jun 2006 13:58:41 GMT From: Scott Long <scottl@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 99050 for review Message-ID: <200606121358.k5CDwfDW070148@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=99050 Change 99050 by scottl@scottl-x64 on 2006/06/12 13:58:16 Checkpoint sim lock handling in the da periph and camisr. Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#10 edit .. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#7 edit .. //depot/projects/scottl-camlock/src/sys/cam/cam_sim.h#7 edit .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#35 edit .. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#10 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.c#10 (text+ko) ==== @@ -114,6 +114,7 @@ ac_callback_t *ac_callback, ac_code code, void *arg) { struct periph_driver **p_drv; + struct cam_sim *sim; struct cam_periph *periph; struct cam_periph *cur_periph; path_id_t path_id; @@ -159,7 +160,8 @@ if (strcmp((*p_drv)->driver_name, name) == 0) break; } - + + sim = xpt_path_sim(path); path_id = xpt_path_path_id(path); target_id = xpt_path_target_id(path); lun_id = xpt_path_lun_id(path); @@ -173,6 +175,7 @@ periph->unit_number = camperiphunit(*p_drv, path_id, target_id, lun_id); periph->immediate_priority = CAM_PRIORITY_NONE; periph->refcount = 0; + periph->sim = sim; SLIST_INIT(&periph->ccb_list); status = xpt_create_path(&path, periph, path_id, target_id, lun_id); if (status != CAM_REQ_CMP) ==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#7 (text+ko) ==== @@ -104,6 +104,7 @@ char *periph_name; struct cam_path *path; /* Compiled path to device */ void *softc; + struct cam_sim *sim; u_int32_t unit_number; cam_periph_type type; u_int32_t flags; ==== //depot/projects/scottl-camlock/src/sys/cam/cam_sim.h#7 (text+ko) ==== @@ -116,6 +116,9 @@ }; +#define CAM_SIM_LOCK(sim) mtx_lock((sim)->mtx); +#define CAM_SIM_UNLOCK(sim) mtx_unlock((sim)->mtx); + static __inline u_int32_t cam_sim_path(struct cam_sim *sim) { ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#35 (text+ko) ==== @@ -83,9 +83,6 @@ SLIST_HEAD(async_list, async_node); SLIST_HEAD(periph_list, cam_periph); -#define CAM_SIM_LOCK(sim) mtx_lock((sim)->mtx); -#define CAM_SIM_UNLOCK(sim) mtx_unlock((sim)->mtx); - /* * This is the maximum number of high powered commands (e.g. start unit) * that can be outstanding at a particular time. @@ -1460,7 +1457,7 @@ } /* Install our software interrupt handlers */ - swi_add(NULL, "cambio", camisr, &cam_bioq, SWI_CAMBIO, 0, &cambio_ih); + swi_add(NULL, "cambio", camisr, &cam_bioq, SWI_CAMBIO, INTR_MPSAFE, &cambio_ih); } static cam_status @@ -7201,6 +7198,7 @@ int runq; TAILQ_REMOVE(&queue, ccb_h, sim_links.tqe); + mtx_lock(ccb_h->path->bus->sim->mtx); ccb_h->pinfo.index = CAM_UNQUEUED_INDEX; splx(s); @@ -7290,6 +7288,7 @@ (*ccb_h->cbfcnp)(ccb_h->path->periph, (union ccb *)ccb_h); /* Raise IPL for while test */ + mtx_unlock(ccb_h->path->bus->sim->mtx); s = splcam(); } splx(s); ==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#10 (text+ko) ==== @@ -37,6 +37,8 @@ #include <sys/bio.h> #include <sys/sysctl.h> #include <sys/taskqueue.h> +#include <sys/lock.h> +#include <sys/mutex.h> #endif /* _KERNEL */ #include <sys/devicestat.h> @@ -61,6 +63,7 @@ #include <cam/cam_ccb.h> #include <cam/cam_periph.h> #include <cam/cam_xpt_periph.h> +#include <cam/cam_sim.h> #include <cam/scsi/scsi_message.h> @@ -528,6 +531,8 @@ splx(s); return (ENXIO); } + mtx_lock(periph->sim->mtx); + unit = periph->unit_number; softc = (struct da_softc *)periph->softc; @@ -539,8 +544,10 @@ if ((error = cam_periph_lock(periph, PRIBIO|PCATCH)) != 0) return (error); /* error code from tsleep */ - if (cam_periph_acquire(periph) != CAM_REQ_CMP) + if (cam_periph_acquire(periph) != CAM_REQ_CMP) { + mtx_unlock(periph->sim->mtx); return(ENXIO); + } softc->flags |= DA_FLAG_OPEN; if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) { @@ -571,6 +578,7 @@ cam_periph_release(periph); } cam_periph_unlock(periph); + mtx_unlock(periph->sim->mtx); return (error); } @@ -585,9 +593,11 @@ if (periph == NULL) return (ENXIO); + mtx_lock(periph->sim->mtx); softc = (struct da_softc *)periph->softc; if ((error = cam_periph_lock(periph, PRIBIO)) != 0) { + mtx_unlock(periph->sim->mtx); return (error); /* error code from tsleep */ } @@ -655,6 +665,7 @@ softc->flags &= ~DA_FLAG_OPEN; cam_periph_unlock(periph); cam_periph_release(periph); + mtx_unlock(periph->sim->mtx); return (0); } @@ -676,6 +687,9 @@ return; } softc = (struct da_softc *)periph->softc; + + mtx_lock(periph->sim->mtx); + #if 0 /* * check it's not too big a transfer for our adapter @@ -695,6 +709,7 @@ */ if ((softc->flags & DA_FLAG_PACK_INVALID)) { splx(s); + mtx_unlock(periph->sim->mtx); biofinish(bp, NULL, ENXIO); return; } @@ -710,6 +725,7 @@ * Schedule ourselves for performing the work. */ xpt_schedule(periph, /* XXX priority */1); + mtx_unlock(periph->sim->mtx); return; } @@ -1164,7 +1180,7 @@ softc->disk->d_drv1 = periph; softc->disk->d_maxsize = DFLTPHYS; /* XXX: probably not arbitrary */ softc->disk->d_unit = periph->unit_number; - softc->disk->d_flags = DISKFLAG_NEEDSGIANT; + softc->disk->d_flags = 0; disk_create(softc->disk, DISK_VERSION); /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606121358.k5CDwfDW070148>