Date: Tue, 30 May 2006 05:47:59 GMT From: "George V. Neville-Neil" <gnn@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 98112 for review Message-ID: <200605300547.k4U5lxlu085414@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=98112 Change 98112 by gnn@fast_ipsec_integ on 2006/05/30 05:47:35 Integrate from HEAD Affected files ... .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt.c#9 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt.h#10 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_cam.c#10 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_cam.h#3 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_debug.c#5 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_pci.c#7 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_raid.c#7 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_raid.h#3 integrate .. //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_reg.h#4 integrate .. //depot/projects/fast_ipsec/src/sys/kern/kern_exit.c#8 integrate .. //depot/projects/fast_ipsec/src/sys/vm/vm_extern.h#3 integrate .. //depot/projects/fast_ipsec/src/sys/vm/vm_glue.c#3 integrate .. //depot/projects/fast_ipsec/src/sys/vm/vm_map.c#6 integrate .. //depot/projects/fast_ipsec/src/sys/vm/vm_map.h#3 integrate .. //depot/projects/fast_ipsec/src/sys/vm/vm_meter.c#2 integrate Differences ... ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt.c#9 (text+ko) ==== @@ -57,6 +57,10 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ /*- * Copyright (c) 2004, Avid Technology, Inc. and its contributors. @@ -92,7 +96,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.29 2006/05/27 17:26:57 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.30 2006/05/29 20:34:28 mjacob Exp $"); #include <dev/mpt/mpt.h> #include <dev/mpt/mpt_cam.h> /* XXX For static handler registration */ ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt.h#10 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.20 2006/05/27 17:26:57 mjacob Exp $ */ +/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.22 2006/05/29 20:34:28 mjacob Exp $ */ /*- * Generic defines for LSI '909 FC adapters. * FreeBSD Version. @@ -58,6 +58,10 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ /* * Copyright (c) 2004, Avid Technology, Inc. and its contributors. @@ -942,6 +946,7 @@ MPT_PRT_ERROR, MPT_PRT_WARN, MPT_PRT_INFO, + MPT_PRT_NEGOTIATION, MPT_PRT_DEBUG, MPT_PRT_DEBUG1, MPT_PRT_DEBUG2, ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_cam.c#10 (text+ko) ==== @@ -57,6 +57,9 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ /*- * Copyright (c) 2004, Avid Technology, Inc. and its contributors. @@ -91,7 +94,7 @@ * OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.19 2006/05/27 17:26:57 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.21 2006/05/29 20:34:28 mjacob Exp $"); #include <dev/mpt/mpt.h> #include <dev/mpt/mpt_cam.h> @@ -647,7 +650,7 @@ static int mpt_set_initial_config_spi(struct mpt_softc *mpt) { - int i, pp1val = ((1 << mpt->mpt_ini_id) << 16) | mpt->mpt_ini_id; + int i, j, pp1val = ((1 << mpt->mpt_ini_id) << 16) | mpt->mpt_ini_id; int error; mpt->mpt_disc_enable = 0xff; @@ -682,12 +685,17 @@ * The purpose of this exercise is to get * all targets back to async/narrow. * - * We skip this if the BIOS has already negotiated speeds with targets. + * We skip this step if the BIOS has already negotiated + * speeds with the targets and does not require us to + * do Domain Validation. */ i = mpt->mpt_port_page2.PortSettings & MPI_SCSIPORTPAGE2_PORT_MASK_NEGO_MASTER_SETTINGS; - if (i == MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS) { - mpt_lprt(mpt, /* MPT_PRT_INFO */ MPT_PRT_ALWAYS, + j = mpt->mpt_port_page2.PortFlags & + MPI_SCSIPORTPAGE2_PORT_FLAGS_DV_MASK; + if (i == MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS && + j == MPI_SCSIPORTPAGE2_PORT_FLAGS_OFF_DV) { + mpt_lprt(mpt, MPT_PRT_NEGOTIATION, "honoring BIOS transfer negotiations\n"); return (0); } @@ -2782,7 +2790,7 @@ uint8_t dval; u_int period; u_int offset; - int m; + int i, j; cts = &ccb->cts; if (!IS_CURRENT_SETTINGS(cts)) { @@ -2790,27 +2798,37 @@ mpt_set_ccb_status(ccb, CAM_REQ_INVALID); break; } + if (mpt->is_fc || mpt->is_sas) { mpt_set_ccb_status(ccb, CAM_REQ_CMP); break; } - if (mpt->ioc_page2 && mpt->ioc_page2->MaxPhysDisks != 0 && - raid_passthru == 0) { + /* + * Skip attempting settings on RAID volume disks. + * Other devices on the bus get the normal treatment. + */ + if (mpt->phydisk_sim && raid_passthru == 0 && + mpt_is_raid_volume(mpt, tgt) != 0) { + mpt_lprt(mpt, MPT_PRT_ALWAYS, + "skipping transfer settings for RAID volumes\n"); mpt_set_ccb_status(ccb, CAM_REQ_CMP); break; } - m = mpt->mpt_port_page2.PortSettings; - if ((m & MPI_SCSIPORTPAGE2_PORT_MASK_NEGO_MASTER_SETTINGS) == - MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS) { -mpt_prt(mpt, "master settings\n"); -if (raid_passthru == 0) { + i = mpt->mpt_port_page2.PortSettings & + MPI_SCSIPORTPAGE2_PORT_MASK_NEGO_MASTER_SETTINGS; + j = mpt->mpt_port_page2.PortFlags & + MPI_SCSIPORTPAGE2_PORT_FLAGS_DV_MASK; + if (i == MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS && + j == MPI_SCSIPORTPAGE2_PORT_FLAGS_OFF_DV) { + mpt_lprt(mpt, MPT_PRT_ALWAYS, + "honoring BIOS transfer negotiations\n"); mpt_set_ccb_status(ccb, CAM_REQ_CMP); break; -} } + dval = 0; period = 0; offset = 0; @@ -2846,24 +2864,27 @@ spi = &cts->xport_specific.spi; if ((spi->valid & CTS_SPI_VALID_DISC) != 0) { - if ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) + if ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) { dval |= DP_DISC_ENABLE; - else + } else { dval |= DP_DISC_DISABL; + } } if ((scsi->valid & CTS_SCSI_VALID_TQ) != 0) { - if ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0) + if ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0) { dval |= DP_TQING_ENABLE; - else + } else { dval |= DP_TQING_DISABL; + } } if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) { - if (spi->bus_width == MSG_EXT_WDTR_BUS_16_BIT) + if (spi->bus_width == MSG_EXT_WDTR_BUS_16_BIT) { dval |= DP_WIDE; - else + } else { dval |= DP_NARROW; + } } if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) && @@ -2874,6 +2895,9 @@ offset = spi->sync_offset; } #endif + mpt_lprt(mpt, MPT_PRT_NEGOTIATION, + "mpt_action: SET tgt %d flags %x period %x off %x\n", + tgt, dval, period, offset); CAMLOCK_2_MPTLOCK(mpt); if (dval & DP_DISC_ENABLE) { mpt->mpt_disc_enable |= (1 << tgt); @@ -2891,10 +2915,12 @@ if (dval & DP_SYNC) { mpt_setsync(mpt, tgt, period, offset); } + if (mpt_update_spi_config(mpt, tgt)) { + MPTLOCK_2_CAMLOCK(mpt); + mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR); + break; + } MPTLOCK_2_CAMLOCK(mpt); - mpt_lprt(mpt, MPT_PRT_DEBUG, - "SET tgt %d flags %x period %x off %x\n", - tgt, dval, period, offset); mpt_set_ccb_status(ccb, CAM_REQ_CMP); break; } @@ -2952,11 +2978,9 @@ sas->valid = CTS_SAS_VALID_SPEED; sas->bitrate = 300000; /* XXX: Default 3Gbps */ #endif - } else { - if (mpt_get_spi_settings(mpt, cts) != 0) { - mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR); - break; - } + } else if (mpt_get_spi_settings(mpt, cts) != 0) { + mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR); + break; } mpt_set_ccb_status(ccb, CAM_REQ_CMP); break; @@ -3005,10 +3029,17 @@ cpi->base_transfer_speed = 3300; cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16; } + + /* + * We give our fake RAID passhtru bus a width that is MaxVolumes + * wide, restrict it to one lun and have it *not* be a bus + * that can have a SCSI bus reset. + */ if (raid_passthru) { + cpi->max_target = mpt->ioc_page2->MaxPhysDisks - 1; + cpi->initiator_id = cpi->max_target+1; cpi->max_lun = 0; cpi->hba_misc = PIM_NOBUSRESET; - cpi->initiator_id = cpi->max_target+1; } if ((mpt->role & MPT_ROLE_INITIATOR) == 0) { @@ -3109,30 +3140,12 @@ uint8_t dval, pval, oval; int rv; - /* - * Check to see if this is an Integrated Raid card. - * - * If it is, and we're the RAID bus side, both current - * and goal settings are synthesized as we only look at - * or change actual settings for the physical disk side. - * - * NB: In the future we can just do this on the blacked out - * NB: portion that the RAID volume covers- there may be - * NB: other entities on this bus as well. - */ - - if (mpt->phydisk_sim) { - if (xpt_path_sim(cts->ccb_h.path) != mpt->phydisk_sim) { - dval = DP_WIDE|DP_DISC|DP_TQING; - oval = (mpt->mpt_port_page0.Capabilities >> 16); - pval = (mpt->mpt_port_page0.Capabilities >> 8); - tgt = cts->ccb_h.target_id; - goto skip; + if (xpt_path_sim(cts->ccb_h.path) == mpt->phydisk_sim) { + if (mpt_map_physdisk(mpt, (union ccb *)cts, &tgt)) { + return (-1); } - } - - if (mpt_map_physdisk(mpt, (union ccb *)cts, &tgt) != 0) { - return (-1); + } else { + tgt = cts->ccb_h.target_id; } /* @@ -3156,10 +3169,6 @@ return (rv); } MPTLOCK_2_CAMLOCK(mpt); - - mpt_lprt(mpt, MPT_PRT_DEBUG, - "mpt_get_spi: SPI Tgt %d Page 0: NParms %x Info %x\n", - tgt, tmp.NegotiatedParameters, tmp.Information); if (tmp.NegotiatedParameters & MPI_SCSIDEVPAGE0_NP_WIDE) { dval |= DP_WIDE; } @@ -3181,7 +3190,6 @@ oval = (mpt->mpt_port_page0.Capabilities >> 16); pval = (mpt->mpt_port_page0.Capabilities >> 8); } - skip: #ifndef CAM_NEW_TRAN_CODE cts->flags &= ~(CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB); if (dval & DP_DISC_ENABLE) { @@ -3236,9 +3244,9 @@ scsi->valid = 0; } #endif - mpt_lprt(mpt, MPT_PRT_DEBUG, - "mpt_get_spi: tgt %d %s settings flags %x period %x offset %x\n", - tgt, IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM", + mpt_lprt(mpt, MPT_PRT_NEGOTIATION, + "mpt_get_spi_settings: tgt %d %s settings flags 0x%x period 0x%x " + "offset %x\n", tgt, IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", dval, pval, oval); return (0); } @@ -3246,27 +3254,27 @@ static void mpt_setwidth(struct mpt_softc *mpt, int tgt, int onoff) { - PTR_CONFIG_PAGE_SCSI_DEVICE_1 tmp; + PTR_CONFIG_PAGE_SCSI_DEVICE_1 ptr; - tmp = &mpt->mpt_dev_page1[tgt]; + ptr = &mpt->mpt_dev_page1[tgt]; if (onoff) { - tmp->RequestedParameters |= MPI_SCSIDEVPAGE1_RP_WIDE; + ptr->RequestedParameters |= MPI_SCSIDEVPAGE1_RP_WIDE; } else { - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_WIDE; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_WIDE; } } static void mpt_setsync(struct mpt_softc *mpt, int tgt, int period, int offset) { - PTR_CONFIG_PAGE_SCSI_DEVICE_1 tmp; + PTR_CONFIG_PAGE_SCSI_DEVICE_1 ptr; - tmp = &mpt->mpt_dev_page1[tgt]; - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK; - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK; - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_DT; - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_QAS; - tmp->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_IU; + ptr = &mpt->mpt_dev_page1[tgt]; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_DT; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_QAS; + ptr->RequestedParameters &= ~MPI_SCSIDEVPAGE1_RP_IU; /* * XXX: For now, we're ignoring specific settings @@ -3284,7 +3292,7 @@ np |= MPI_SCSIDEVPAGE1_RP_DT; } np |= (factor << 8) | (offset << 16); - tmp->RequestedParameters |= np; + ptr->RequestedParameters |= np; } } @@ -3308,9 +3316,9 @@ return (-1); } mpt->mpt_dev_page1[tgt] = tmp; - mpt_lprt(mpt, MPT_PRT_DEBUG, - "mpt_update_spi_config[%d]: Page 1: RParams %x Config %x\n", tgt, - mpt->mpt_dev_page1[tgt].RequestedParameters, + mpt_lprt(mpt, MPT_PRT_NEGOTIATION, + "mpt_update_spi_config[%d].page1: RParams 0x%x Config 0x%x\n", + tgt, mpt->mpt_dev_page1[tgt].RequestedParameters, mpt->mpt_dev_page1[tgt].Configuration); return (0); } ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_cam.h#3 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/mpt/mpt_cam.h,v 1.3 2006/02/25 07:45:54 mjacob Exp $ */ +/* $FreeBSD: src/sys/dev/mpt/mpt_cam.h,v 1.4 2006/05/29 20:34:28 mjacob Exp $ */ /*- * LSI MPT Host Adapter FreeBSD Wrapper Definitions (CAM version) * @@ -57,6 +57,9 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ /*- * Copyright (c) 2004, Avid Technology, Inc. and its contributors. ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_debug.c#5 (text+ko) ==== @@ -58,10 +58,13 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_debug.c,v 1.15 2006/05/26 05:54:21 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_debug.c,v 1.16 2006/05/29 20:34:28 mjacob Exp $"); #include <dev/mpt/mpt.h> ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_pci.c#7 (text+ko) ==== @@ -61,6 +61,9 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ /* * Copyright (c) 2004, Avid Technology, Inc. and its contributors. @@ -96,7 +99,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.30 2006/05/29 16:59:38 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.31 2006/05/29 20:34:28 mjacob Exp $"); #include <dev/mpt/mpt.h> #include <dev/mpt/mpt_cam.h> ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_raid.c#7 (text+ko) ==== @@ -31,9 +31,17 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF THE COPYRIGHT * OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*- + * Some Breakage and Bug Fixing added later. + * Copyright (c) 2006, by Matthew Jacob + * All Rights Reserved + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. + */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_raid.c,v 1.8 2006/05/27 17:26:57 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_raid.c,v 1.10 2006/05/29 20:34:28 mjacob Exp $"); #include <dev/mpt/mpt.h> #include <dev/mpt/mpt_raid.h> @@ -226,7 +234,7 @@ break; } - mpt_lprt(mpt, MPT_PRT_DEBUG, " Callback for %d\n", + mpt_lprt(mpt, MPT_PRT_DEBUG, "Callback for %d\n", cgd->ccb_h.target_id); RAID_VOL_FOREACH(mpt, mpt_vol) { @@ -779,11 +787,28 @@ *tgt = mpt_disk->config_page.PhysDiskID; return (0); } - mpt_lprt(mpt, MPT_PRT_DEBUG, "mpt_map_physdisk(%d) - Not Active\n", + mpt_lprt(mpt, MPT_PRT_DEBUG1, "mpt_map_physdisk(%d) - Not Active\n", ccb->ccb_h.target_id); return (-1); } +/* XXX Ignores that there may be multiple busses/IOCs involved. */ +int +mpt_is_raid_volume(struct mpt_softc *mpt, int tgt) +{ + CONFIG_PAGE_IOC_2_RAID_VOL *ioc_vol; + CONFIG_PAGE_IOC_2_RAID_VOL *ioc_last_vol; + + ioc_vol = mpt->ioc_page2->RaidVolume; + ioc_last_vol = ioc_vol + mpt->ioc_page2->NumActiveVolumes; + for (;ioc_vol != ioc_last_vol; ioc_vol++) { + if (ioc_vol->VolumeID == tgt) { + return (1); + } + } + return (0); +} + #if 0 static void mpt_enable_vol(struct mpt_softc *mpt, struct mpt_raid_volume *mpt_vol, ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_raid.h#3 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/mpt/mpt_raid.h,v 1.4 2006/05/27 17:26:57 mjacob Exp $ */ +/* $FreeBSD: src/sys/dev/mpt/mpt_raid.h,v 1.6 2006/05/29 20:34:28 mjacob Exp $ */ /*- * Definitions for the integrated RAID features LSI MPT Fusion adapters. * @@ -32,6 +32,14 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF THE COPYRIGHT * OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*- + * Some Breakage and Bug Fixing added later. + * Copyright (c) 2006, by Matthew Jacob + * All Rights Reserved + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. + */ #ifndef _MPT_RAID_H_ #define _MPT_RAID_H_ @@ -60,6 +68,7 @@ cam_status mpt_map_physdisk(struct mpt_softc *, union ccb *, target_id_t *); +int mpt_is_raid_volume(struct mpt_softc *, int); cam_status mpt_raid_quiesce_disk(struct mpt_softc *, struct mpt_raid_disk *, request_t *); ==== //depot/projects/fast_ipsec/src/sys/dev/mpt/mpt_reg.h#4 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/mpt/mpt_reg.h,v 1.3 2006/03/25 07:08:27 mjacob Exp $ */ +/* $FreeBSD: src/sys/dev/mpt/mpt_reg.h,v 1.4 2006/05/29 20:34:28 mjacob Exp $ */ /*- * Generic defines for LSI '909 FC adapters. * FreeBSD Version. @@ -58,6 +58,9 @@ * * Support from Chris Ellsworth in order to make SAS adapters work * is gratefully acknowledged. + * + * Support from LSI-Logic has also gone a great deal toward making this a + * workable subsystem and is gratefully acknowledged. */ #ifndef _MPT_REG_H_ #define _MPT_REG_H_ ==== //depot/projects/fast_ipsec/src/sys/kern/kern_exit.c#8 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/kern_exit.c,v 1.288 2006/04/10 14:07:28 csjp Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_exit.c,v 1.289 2006/05/29 21:28:56 tegge Exp $"); #include "opt_compat.h" #include "opt_ktrace.h" @@ -113,14 +113,13 @@ struct proc *p, *nq, *q; struct tty *tp; struct vnode *ttyvp; - struct vmspace *vm; struct vnode *vtmp; #ifdef KTRACE struct vnode *tracevp; struct ucred *tracecred; #endif struct plimit *plim; - int locked, refcnt; + int locked; /* * Drop Giant if caller has it. Eventually we should warn about @@ -300,33 +299,7 @@ } mtx_unlock(&ppeers_lock); - /* The next two chunks should probably be moved to vmspace_exit. */ - vm = p->p_vmspace; - /* - * Release user portion of address space. - * This releases references to vnodes, - * which could cause I/O if the file has been unlinked. - * Need to do this early enough that we can still sleep. - * Can't free the entire vmspace as the kernel stack - * may be mapped within that space also. - * - * Processes sharing the same vmspace may exit in one order, and - * get cleaned up by vmspace_exit() in a different order. The - * last exiting process to reach this point releases as much of - * the environment as it can, and the last process cleaned up - * by vmspace_exit() (which decrements exitingcnt) cleans up the - * remainder. - */ - atomic_add_int(&vm->vm_exitingcnt, 1); - do - refcnt = vm->vm_refcnt; - while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt - 1)); - if (refcnt == 1) { - shmexit(vm); - pmap_remove_pages(vmspace_pmap(vm)); - (void) vm_map_remove(&vm->vm_map, vm_map_min(&vm->vm_map), - vm_map_max(&vm->vm_map)); - } + vmspace_exit(td); sx_xlock(&proctree_lock); if (SESS_LEADER(p)) { ==== //depot/projects/fast_ipsec/src/sys/vm/vm_extern.h#3 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)vm_extern.h 8.2 (Berkeley) 1/12/94 - * $FreeBSD: src/sys/vm/vm_extern.h,v 1.77 2005/12/16 18:34:14 alc Exp $ + * $FreeBSD: src/sys/vm/vm_extern.h,v 1.78 2006/05/29 21:28:56 tegge Exp $ */ #ifndef _VM_EXTERN_H_ @@ -78,6 +78,8 @@ struct vmspace *vmspace_fork(struct vmspace *); void vmspace_exec(struct proc *, vm_offset_t, vm_offset_t); void vmspace_unshare(struct proc *); +void vmspace_exit(struct thread *); +struct vmspace *vmspace_acquire_ref(struct proc *); void vmspace_free(struct vmspace *); void vmspace_exitfree(struct proc *); void vnode_pager_setsize(struct vnode *, vm_ooffset_t); ==== //depot/projects/fast_ipsec/src/sys/vm/vm_glue.c#3 (text+ko) ==== @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/vm/vm_glue.c,v 1.214 2005/12/16 18:34:14 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_glue.c,v 1.215 2006/05/29 21:28:56 tegge Exp $"); #include "opt_vm.h" #include "opt_kstack_pages.h" @@ -852,12 +852,9 @@ * process may attempt to alter * the map. */ - PROC_LOCK(p); - vm = p->p_vmspace; - KASSERT(vm != NULL, - ("swapout_procs: a process has no address space")); - atomic_add_int(&vm->vm_refcnt, 1); - PROC_UNLOCK(p); + vm = vmspace_acquire_ref(p); + if (vm == NULL) + continue; if (!vm_map_trylock(&vm->vm_map)) goto nextproc1; ==== //depot/projects/fast_ipsec/src/sys/vm/vm_map.c#6 (text+ko) ==== @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.373 2006/03/08 06:31:46 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.374 2006/05/29 21:28:56 tegge Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -148,6 +148,13 @@ static void vmspace_zdtor(void *mem, int size, void *arg); #endif +/* + * PROC_VMSPACE_{UN,}LOCK() can be a noop as long as vmspaces are type + * stable. + */ +#define PROC_VMSPACE_LOCK(p) do { } while (0) +#define PROC_VMSPACE_UNLOCK(p) do { } while (0) + void vm_map_startup(void) { @@ -261,7 +268,6 @@ vm->vm_taddr = 0; vm->vm_daddr = 0; vm->vm_maxsaddr = 0; - vm->vm_exitingcnt = 0; return (vm); } @@ -313,7 +319,7 @@ do refcnt = vm->vm_refcnt; while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt - 1)); - if (refcnt == 1 && vm->vm_exitingcnt == 0) + if (refcnt == 1) vmspace_dofree(vm); } @@ -321,28 +327,93 @@ vmspace_exitfree(struct proc *p) { struct vmspace *vm; - int exitingcnt; + PROC_VMSPACE_LOCK(p); vm = p->p_vmspace; p->p_vmspace = NULL; + PROC_VMSPACE_UNLOCK(p); + KASSERT(vm == &vmspace0, ("vmspace_exitfree: wrong vmspace")); + vmspace_free(vm); +} + +void +vmspace_exit(struct thread *td) +{ + int refcnt; + struct vmspace *vm; + struct proc *p; /* - * cleanup by parent process wait()ing on exiting child. vm_refcnt - * may not be 0 (e.g. fork() and child exits without exec()ing). - * exitingcnt may increment above 0 and drop back down to zero - * several times while vm_refcnt is held non-zero. vm_refcnt - * may also increment above 0 and drop back down to zero several - * times while vm_exitingcnt is held non-zero. + * Release user portion of address space. + * This releases references to vnodes, + * which could cause I/O if the file has been unlinked. + * Need to do this early enough that we can still sleep. * - * The last wait on the exiting child's vmspace will clean up - * the remainder of the vmspace. + * The last exiting process to reach this point releases as + * much of the environment as it can. vmspace_dofree() is the + * slower fallback in case another process had a temporary + * reference to the vmspace. */ - do - exitingcnt = vm->vm_exitingcnt; - while (!atomic_cmpset_int(&vm->vm_exitingcnt, exitingcnt, - exitingcnt - 1)); - if (vm->vm_refcnt == 0 && exitingcnt == 1) + + p = td->td_proc; + vm = p->p_vmspace; + atomic_add_int(&vmspace0.vm_refcnt, 1); + do { + refcnt = vm->vm_refcnt; + if (refcnt > 1 && p->p_vmspace != &vmspace0) { + /* Switch now since other proc might free vmspace */ + PROC_VMSPACE_LOCK(p); + p->p_vmspace = &vmspace0; + PROC_VMSPACE_UNLOCK(p); + pmap_activate(td); + } + } while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt - 1)); + if (refcnt == 1) { + if (p->p_vmspace != vm) { + /* vmspace not yet freed, switch back */ + PROC_VMSPACE_LOCK(p); + p->p_vmspace = vm; + PROC_VMSPACE_UNLOCK(p); + pmap_activate(td); + } + pmap_remove_pages(vmspace_pmap(vm)); + /* Switch now since this proc will free vmspace */ + PROC_VMSPACE_LOCK(p); + p->p_vmspace = &vmspace0; + PROC_VMSPACE_UNLOCK(p); + pmap_activate(td); vmspace_dofree(vm); + } +} + +/* Acquire reference to vmspace owned by another process. */ + +struct vmspace * +vmspace_acquire_ref(struct proc *p) +{ + struct vmspace *vm; + int refcnt; + + PROC_VMSPACE_LOCK(p); + vm = p->p_vmspace; + if (vm == NULL) { + PROC_VMSPACE_UNLOCK(p); + return (NULL); + } + do { + refcnt = vm->vm_refcnt; + if (refcnt <= 0) { /* Avoid 0->1 transition */ + PROC_VMSPACE_UNLOCK(p); + return (NULL); + } + } while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt + 1)); + if (vm != p->p_vmspace) { + PROC_VMSPACE_UNLOCK(p); + vmspace_free(vm); + return (NULL); + } + PROC_VMSPACE_UNLOCK(p); + return (vm); } void @@ -2923,7 +2994,9 @@ * run it down. Even though there is little or no chance of blocking * here, it is a good idea to keep this form for future mods. */ + PROC_VMSPACE_LOCK(p); p->p_vmspace = newvmspace; + PROC_VMSPACE_UNLOCK(p); if (p == curthread->td_proc) /* XXXKSE ? */ pmap_activate(curthread); vmspace_free(oldvmspace); @@ -2942,7 +3015,9 @@ if (oldvmspace->vm_refcnt == 1) return; newvmspace = vmspace_fork(oldvmspace); + PROC_VMSPACE_LOCK(p); p->p_vmspace = newvmspace; + PROC_VMSPACE_UNLOCK(p); if (p == curthread->td_proc) /* XXXKSE ? */ pmap_activate(curthread); vmspace_free(oldvmspace); ==== //depot/projects/fast_ipsec/src/sys/vm/vm_map.h#3 (text+ko) ==== @@ -57,7 +57,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $FreeBSD: src/sys/vm/vm_map.h,v 1.118 2005/12/03 22:41:15 alc Exp $ + * $FreeBSD: src/sys/vm/vm_map.h,v 1.119 2006/05/29 21:28:56 tegge Exp $ */ /* @@ -242,7 +242,6 @@ caddr_t vm_taddr; /* (c) user virtual address of text */ caddr_t vm_daddr; /* (c) user virtual address of data */ caddr_t vm_maxsaddr; /* user VA at max stack growth */ - int vm_exitingcnt; /* several processes zombied in exit1 */ int vm_refcnt; /* number of references */ }; ==== //depot/projects/fast_ipsec/src/sys/vm/vm_meter.c#2 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/vm/vm_meter.c,v 1.85 2005/05/08 23:56:16 marcel Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_meter.c,v 1.86 2006/05/29 21:28:56 tegge Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -115,6 +115,7 @@ vm_map_t map; int paging; struct thread *td; + struct vmspace *vm; totalp = &total; bzero(totalp, sizeof *totalp); @@ -185,7 +186,10 @@ * Note active objects. */ paging = 0; - map = &p->p_vmspace->vm_map; + vm = vmspace_acquire_ref(p); + if (vm == NULL) + continue; + map = &vm->vm_map; vm_map_lock_read(map); for (entry = map->header.next; entry != &map->header; entry = entry->next) { @@ -198,6 +202,7 @@ VM_OBJECT_UNLOCK(object); } vm_map_unlock_read(map); + vmspace_free(vm); if (paging) totalp->t_pw++; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605300547.k4U5lxlu085414>