Module Name: src Committed By: jmcneill Date: Wed May 20 13:09:34 UTC 2015
Modified Files: src/sys/dev/sdmmc: ld_sdmmc.c sdmmc.c Log Message: need to call lddone with splbio and kernel lock held To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/dev/sdmmc/ld_sdmmc.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/sdmmc/sdmmc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/sdmmc/ld_sdmmc.c diff -u src/sys/dev/sdmmc/ld_sdmmc.c:1.15 src/sys/dev/sdmmc/ld_sdmmc.c:1.16 --- src/sys/dev/sdmmc/ld_sdmmc.c:1.15 Mon Apr 13 16:33:25 2015 +++ src/sys/dev/sdmmc/ld_sdmmc.c Wed May 20 13:09:34 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ld_sdmmc.c,v 1.15 2015/04/13 16:33:25 riastradh Exp $ */ +/* $NetBSD: ld_sdmmc.c,v 1.16 2015/05/20 13:09:34 jmcneill Exp $ */ /* * Copyright (c) 2008 KIYOHARA Takashi @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ld_sdmmc.c,v 1.15 2015/04/13 16:33:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld_sdmmc.c,v 1.16 2015/05/20 13:09:34 jmcneill Exp $"); #ifdef _KERNEL_OPT #include "opt_sdmmc.h" @@ -118,7 +118,7 @@ ld_sdmmc_attach(device_t parent, device_ sa->sf->cid.rev, sa->sf->cid.psn, sa->sf->cid.mdt); aprint_naive("\n"); - callout_init(&sc->sc_task.task_callout, CALLOUT_MPSAFE); + callout_init(&sc->sc_task.task_callout, 0); sc->sc_hwunit = 0; /* always 0? */ sc->sc_sf = sa->sf; @@ -216,7 +216,9 @@ ld_sdmmc_dobio(void *arg) bp->b_rawblkno, sc->sc_sf->csd.capacity); bp->b_error = EINVAL; bp->b_resid = bp->b_bcount; + s = splbio(); lddone(&sc->sc_ld, bp); + splx(s); return; } @@ -235,9 +237,9 @@ ld_sdmmc_dobio(void *arg) } else { bp->b_resid = 0; } - splx(s); lddone(&sc->sc_ld, bp); + splx(s); } static void @@ -256,11 +258,11 @@ ld_sdmmc_timeout(void *arg) bp->b_error = EIO; /* XXXX */ bp->b_resid = bp->b_bcount; sdmmc_del_task(&task->task); - splx(s); aprint_error_dev(sc->sc_ld.sc_dv, "task timeout"); lddone(&sc->sc_ld, bp); + splx(s); } static int Index: src/sys/dev/sdmmc/sdmmc.c diff -u src/sys/dev/sdmmc/sdmmc.c:1.24 src/sys/dev/sdmmc/sdmmc.c:1.25 --- src/sys/dev/sdmmc/sdmmc.c:1.24 Fri Feb 27 16:08:17 2015 +++ src/sys/dev/sdmmc/sdmmc.c Wed May 20 13:09:34 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc.c,v 1.24 2015/02/27 16:08:17 nonaka Exp $ */ +/* $NetBSD: sdmmc.c,v 1.25 2015/05/20 13:09:34 jmcneill Exp $ */ /* $OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $ */ /* @@ -49,7 +49,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.24 2015/02/27 16:08:17 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.25 2015/05/20 13:09:34 jmcneill Exp $"); #ifdef _KERNEL_OPT #include "opt_sdmmc.h" @@ -271,7 +271,9 @@ sdmmc_task_thread(void *arg) if (task != NULL) { sdmmc_del_task1(sc, task); mutex_exit(&sc->sc_tskq_mtx); + KERNEL_LOCK(1, curlwp); (*task->func)(task->arg); + KERNEL_UNLOCK_ONE(curlwp); mutex_enter(&sc->sc_tskq_mtx); } else { /* Check for the exit condition. */