diff options
author | mjacob <mjacob@FreeBSD.org> | 2002-09-03 04:31:55 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2002-09-03 04:31:55 +0000 |
commit | 20072affec15c51574156e050f90e3cb9583209c (patch) | |
tree | 0758095db5c12c0566acb8a932eb6cc179f98c31 /sys/dev/isp | |
parent | 6faa305558432e71c661e8530e7f483b9ad47e70 (diff) | |
download | FreeBSD-src-20072affec15c51574156e050f90e3cb9583209c.zip FreeBSD-src-20072affec15c51574156e050f90e3cb9583209c.tar.gz |
Turn off usage of SMP style locking until we sort out CAM.
Diffstat (limited to 'sys/dev/isp')
-rw-r--r-- | sys/dev/isp/isp_freebsd.c | 78 | ||||
-rw-r--r-- | sys/dev/isp/isp_freebsd.h | 15 |
2 files changed, 72 insertions, 21 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index b7069d9..fc64147 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -234,7 +234,7 @@ isp_attach(struct ispsoftc *isp) } -static __inline void +static INLINE void isp_freeze_loopdown(struct ispsoftc *isp, char *msg) { if (isp->isp_osinfo.simqfrozen == 0) { @@ -521,15 +521,15 @@ isp_intr_enable(void *arg) #ifdef ISP_TARGET_MODE -static __inline int is_lun_enabled(struct ispsoftc *, int, lun_id_t); -static __inline int are_any_luns_enabled(struct ispsoftc *, int); -static __inline tstate_t *get_lun_statep(struct ispsoftc *, int, lun_id_t); -static __inline void rls_lun_statep(struct ispsoftc *, tstate_t *); -static __inline int isp_psema_sig_rqe(struct ispsoftc *, int); -static __inline int isp_cv_wait_timed_rqe(struct ispsoftc *, int, int); -static __inline void isp_cv_signal_rqe(struct ispsoftc *, int, int); -static __inline void isp_vsema_rqe(struct ispsoftc *, int); -static __inline atio_private_data_t *isp_get_atpd(struct ispsoftc *, int); +static INLINE int is_lun_enabled(struct ispsoftc *, int, lun_id_t); +static INLINE int are_any_luns_enabled(struct ispsoftc *, int); +static INLINE tstate_t *get_lun_statep(struct ispsoftc *, int, lun_id_t); +static INLINE void rls_lun_statep(struct ispsoftc *, tstate_t *); +static INLINE int isp_psema_sig_rqe(struct ispsoftc *, int); +static INLINE int isp_cv_wait_timed_rqe(struct ispsoftc *, int, int); +static INLINE void isp_cv_signal_rqe(struct ispsoftc *, int, int); +static INLINE void isp_vsema_rqe(struct ispsoftc *, int); +static INLINE atio_private_data_t *isp_get_atpd(struct ispsoftc *, int); static cam_status create_lun_state(struct ispsoftc *, int, struct cam_path *, tstate_t **); static void destroy_lun_state(struct ispsoftc *, tstate_t *); @@ -545,7 +545,7 @@ static int isp_handle_platform_ctio(struct ispsoftc *, void *); static int isp_handle_platform_notify_scsi(struct ispsoftc *, in_entry_t *); static int isp_handle_platform_notify_fc(struct ispsoftc *, in_fcentry_t *); -static __inline int +static INLINE int is_lun_enabled(struct ispsoftc *isp, int bus, lun_id_t lun) { tstate_t *tptr; @@ -561,7 +561,7 @@ is_lun_enabled(struct ispsoftc *isp, int bus, lun_id_t lun) return (0); } -static __inline int +static INLINE int are_any_luns_enabled(struct ispsoftc *isp, int port) { int lo, hi; @@ -580,7 +580,7 @@ are_any_luns_enabled(struct ispsoftc *isp, int port) return (0); } -static __inline tstate_t * +static INLINE tstate_t * get_lun_statep(struct ispsoftc *isp, int bus, lun_id_t lun) { tstate_t *tptr = NULL; @@ -607,53 +607,73 @@ get_lun_statep(struct ispsoftc *isp, int bus, lun_id_t lun) return (tptr); } -static __inline void +static INLINE void rls_lun_statep(struct ispsoftc *isp, tstate_t *tptr) { if (tptr->hold) tptr->hold--; } -static __inline int +static INLINE int isp_psema_sig_rqe(struct ispsoftc *isp, int bus) { while (isp->isp_osinfo.tmflags[bus] & TM_BUSY) { isp->isp_osinfo.tmflags[bus] |= TM_WANTED; +#ifdef ISP_SMPLOCK if (cv_wait_sig(&isp->isp_osinfo.tgtcv0[bus], &isp->isp_lock)) { return (-1); } +#else + if (tsleep(&isp->isp_osinfo.tgtcv0[bus], PZERO, "cv_isp", 0)) { + return (-1); + } +#endif isp->isp_osinfo.tmflags[bus] |= TM_BUSY; } return (0); } -static __inline int +static INLINE int isp_cv_wait_timed_rqe(struct ispsoftc *isp, int bus, int timo) { +#ifdef ISP_SMPLOCK if (cv_timedwait(&isp->isp_osinfo.tgtcv1[bus], &isp->isp_lock, timo)) { return (-1); } +#else + if (tsleep(&isp->isp_osinfo.tgtcv1[bus], PZERO, "cv_isp1", 0)) { + return (-1); + } +#endif return (0); } -static __inline void +static INLINE void isp_cv_signal_rqe(struct ispsoftc *isp, int bus, int status) { isp->isp_osinfo.rstatus[bus] = status; +#ifdef ISP_SMPLOCK cv_signal(&isp->isp_osinfo.tgtcv1[bus]); +#else + wakeup(&isp->isp_osinfo.tgtcv1[bus]); +#endif } -static __inline void +static INLINE void isp_vsema_rqe(struct ispsoftc *isp, int bus) { if (isp->isp_osinfo.tmflags[bus] & TM_WANTED) { isp->isp_osinfo.tmflags[bus] &= ~TM_WANTED; +#ifdef ISP_SMPLOCK + cv_signal(&isp->isp_osinfo.tgtcv0[bus]); +#else cv_signal(&isp->isp_osinfo.tgtcv0[bus]); +#endif } isp->isp_osinfo.tmflags[bus] &= ~TM_BUSY; } -static __inline atio_private_data_t * +static INLINE atio_private_data_t * isp_get_atpd(struct ispsoftc *isp, int tag) { atio_private_data_t *atp; @@ -711,7 +731,7 @@ create_lun_state(struct ispsoftc *isp, int bus, return (CAM_REQ_CMP); } -static __inline void +static INLINE void destroy_lun_state(struct ispsoftc *isp, tstate_t *tptr) { int hfx; @@ -1941,7 +1961,9 @@ isp_kthread(void *arg) { struct ispsoftc *isp = arg; +#ifdef ISP_SMPLOCK mtx_lock(&isp->isp_lock); +#endif /* * The first loop is for our usage where we have yet to have * gotten good fibre channel state. @@ -1959,8 +1981,12 @@ isp_kthread(void *arg) break; } } +#ifdef ISP_SMPLOCK msleep(isp_kthread, &isp->isp_lock, PRIBIO, "isp_fcthrd", hz); +#else + (void) tsleep(isp_kthread, PRIBIO, "isp_fcthrd", hz); +#endif } /* @@ -1978,7 +2004,11 @@ isp_kthread(void *arg) CAMLOCK_2_ISPLOCK(isp); } isp_prt(isp, ISP_LOGDEBUG0, "kthread: waiting until called"); +#ifdef ISP_SMPLOCK cv_wait(&isp->isp_osinfo.kthread_cv, &isp->isp_lock); +#else + (void) tsleep(&isp->isp_osinfo.kthread_cv, PRIBIO, "fc_cv", 0); +#endif } } @@ -2077,7 +2107,11 @@ isp_action(struct cam_sim *sim, union ccb *ccb) xpt_done(ccb); break; } +#ifdef ISP_SMPLOCK cv_signal(&isp->isp_osinfo.kthread_cv); +#else + wakeup(&isp->isp_osinfo.kthread_cv); +#endif isp_freeze_loopdown(isp, "isp_action(RQLATER)"); XS_SETERR(ccb, CAM_REQUEUE_REQ); ISPLOCK_2_CAMLOCK(isp); @@ -2855,7 +2889,11 @@ isp_async(struct ispsoftc *isp, ispasync_t cmd, void *arg) isp_prt(isp, ISP_LOGINFO, "Name Server Database Changed"); } +#ifdef ISP_SMPLOCK cv_signal(&isp->isp_osinfo.kthread_cv); +#else + wakeup(&isp->isp_osinfo.kthread_cv); +#endif break; case ISPASYNC_FABRIC_DEV: { diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index 392f3d9..929504c 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -73,7 +73,8 @@ #endif #define HANDLE_LOOPSTATE_IN_OUTER_LAYERS 1 -#define ISP_SMPLOCK 1 +/* turn this off for now */ +/* #define ISP_SMPLOCK 1 */ #ifdef ISP_SMPLOCK #define ISP_IFLAGS INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE @@ -165,12 +166,19 @@ struct isposinfo { * Locking macros... */ +#ifdef ISP_SMPLOCK #define ISP_LOCK(x) mtx_lock(&(x)->isp_lock) #define ISP_UNLOCK(x) mtx_unlock(&(x)->isp_lock) #define ISPLOCK_2_CAMLOCK(isp) \ mtx_unlock(&(isp)->isp_lock); mtx_lock(&Giant) #define CAMLOCK_2_ISPLOCK(isp) \ mtx_unlock(&Giant); mtx_lock(&(isp)->isp_lock) +#else +#define ISP_LOCK(x) do { } while (0) +#define ISP_UNLOCK(x) do { } while (0) +#define ISPLOCK_2_CAMLOCK(isp) do { } while (0) +#define CAMLOCK_2_ISPLOCK(isp) do { } while (0) +#endif /* * Required Macros/Defines @@ -411,8 +419,13 @@ isp_mbox_wait_complete(struct ispsoftc *isp) if (isp->isp_osinfo.intsok) { int lim = ((isp->isp_mbxwrk0)? 120 : 20) * hz; isp->isp_osinfo.mboxwaiting = 1; +#ifdef ISP_SMPLOCK (void) msleep(&isp->isp_mbxworkp, &isp->isp_lock, PRIBIO, "isp_mboxwaiting", lim); +#else + (void) tsleep(&isp->isp_mbxworkp, + PRIBIO, "isp_mboxwaiting", lim); +#endif if (isp->isp_mboxbsy != 0) { isp_prt(isp, ISP_LOGWARN, "Interrupting Mailbox Command (0x%x) Timeout", |