From owner-svn-src-projects@FreeBSD.ORG Thu Mar 15 22:28:19 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 312E21065670; Thu, 15 Mar 2012 22:28:19 +0000 (UTC) (envelope-from ambrisko@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C04238FC08; Thu, 15 Mar 2012 22:28:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2FMSIa7086131; Thu, 15 Mar 2012 22:28:18 GMT (envelope-from ambrisko@svn.freebsd.org) Received: (from ambrisko@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2FMSIEg086129; Thu, 15 Mar 2012 22:28:18 GMT (envelope-from ambrisko@svn.freebsd.org) Message-Id: <201203152228.q2FMSIEg086129@svn.freebsd.org> From: Doug Ambrisko Date: Thu, 15 Mar 2012 22:28:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233016 - projects/head_mfi/sys/dev/mfi X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Mar 2012 22:28:19 -0000 Author: ambrisko Date: Thu Mar 15 22:28:18 2012 New Revision: 233016 URL: http://svn.freebsd.org/changeset/base/233016 Log: Release driver lock before taking Giant when deleting children. Use TAILQ_FOREACH_SAFE when items can be deleted. Make code a little simplier to follow. Fix a couple more style issues. This fixes some panics when reconfiguring drives. Modified: projects/head_mfi/sys/dev/mfi/mfi.c Modified: projects/head_mfi/sys/dev/mfi/mfi.c ============================================================================== --- projects/head_mfi/sys/dev/mfi/mfi.c Thu Mar 15 22:15:06 2012 (r233015) +++ projects/head_mfi/sys/dev/mfi/mfi.c Thu Mar 15 22:28:18 2012 (r233016) @@ -1317,8 +1317,8 @@ mfi_syspdprobe(struct mfi_softc *sc) struct mfi_frame_header *hdr; struct mfi_command *cm = NULL; struct mfi_pd_list *pdlist = NULL; - struct mfi_system_pd *syspd; - int error, i; + struct mfi_system_pd *syspd, *tmp; + int error, i, found; sx_assert(&sc->mfi_config_lock, SA_XLOCKED); mtx_assert(&sc->mfi_io_lock, MA_OWNED); @@ -1352,24 +1352,30 @@ mfi_syspdprobe(struct mfi_softc *sc) for (i = 0; i < pdlist->count; i++) { if (pdlist->addr[i].device_id == pdlist->addr[i].encl_device_id) - goto skip_sys_pd_add; - TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) { + continue; + found = 0; + TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) { if (syspd->pd_id == pdlist->addr[i].device_id) - goto skip_sys_pd_add; + found = 1; } - mfi_add_sys_pd(sc, pdlist->addr[i].device_id); -skip_sys_pd_add:; + if (found == 0) + mfi_add_sys_pd(sc, pdlist->addr[i].device_id); } /* Delete SYSPD's whose state has been changed */ - TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) { + TAILQ_FOREACH_SAFE(syspd, &sc->mfi_syspd_tqh, pd_link, tmp) { + found = 0; for (i = 0; i < pdlist->count; i++) { if (syspd->pd_id == pdlist->addr[i].device_id) - goto skip_sys_pd_delete; + found = 1; + } + if (found == 0) { + printf("DELETE\n"); + mtx_unlock(&sc->mfi_io_lock); + mtx_lock(&Giant); + device_delete_child(sc->mfi_dev, syspd->pd_dev); + mtx_unlock(&Giant); + mtx_lock(&sc->mfi_io_lock); } - mtx_lock(&Giant); - device_delete_child(sc->mfi_dev, syspd->pd_dev); - mtx_unlock(&Giant); -skip_sys_pd_delete:; } out: if (pdlist) @@ -1541,9 +1547,9 @@ mfi_decode_evt(struct mfi_softc *sc, str device_delete_child( sc->mfi_dev, syspd->pd_dev); - mtx_unlock(&Giant); - break; - } + mtx_unlock(&Giant); + break; + } } } } @@ -2604,7 +2610,7 @@ mfi_check_command_pre(struct mfi_softc * mbox = (uint16_t *) cm->cm_frame->dcmd.mbox; syspd_id = mbox[0]; if (mbox[2] == MFI_PD_STATE_UNCONFIGURED_GOOD) { - TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh,pd_link) { + TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) { if (syspd->pd_id == syspd_id) break; }