From b48b0daf2bcc89904730edc7614f7f4b62dfbd22 Mon Sep 17 00:00:00 2001 From: dillon Date: Sun, 3 Jun 2007 04:48:29 +0000 Subject: [PATCH] M_NOWAIT can only be used in a driver where a failed memory allocation is recoverable, such as in a network driver. FreeBSD seems to have a looser definition but in DragonFly M_NOWAIT really means M_NOWAIT ... any blocking at all, including waiting on the BGL or getting the kernel_map lock, will result in a failure NULL. Change all M_NOWAIT's to either M_WAITOK or M_INTWAIT. --- sys/dev/disk/nata/ata-chipset.c | 14 +++++++------- sys/dev/disk/nata/ata-disk.c | 9 ++------- sys/dev/disk/nata/ata-dma.c | 25 ++++++++++++------------- sys/dev/disk/nata/atapi-cam.c | 29 +++++++++-------------------- sys/dev/disk/nata/atapi-cd.c | 40 ++++++++++------------------------------ sys/dev/disk/nata/atapi-fd.c | 9 ++------- sys/dev/disk/nata/atapi-tape.c | 9 ++------- 7 files changed, 44 insertions(+), 91 deletions(-) diff --git a/sys/dev/disk/nata/ata-chipset.c b/sys/dev/disk/nata/ata-chipset.c index 4da20aba45..e32510d836 100644 --- a/sys/dev/disk/nata/ata-chipset.c +++ b/sys/dev/disk/nata/ata-chipset.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.166 2006/07/24 10:44:50 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/ata-chipset.c,v 1.5 2007/06/03 04:27:56 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/ata-chipset.c,v 1.6 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -261,7 +261,7 @@ ata_sata_phy_check_events(device_t dev) if ((error & ATA_SE_PHY_CHANGED) && (tp = (struct ata_connect_task *) kmalloc(sizeof(struct ata_connect_task), - M_ATA, M_NOWAIT | M_ZERO))) { + M_ATA, M_INTWAIT | M_ZERO))) { if (((status & ATA_SS_CONWELL_MASK) == ATA_SS_CONWELL_GEN1) || ((status & ATA_SS_CONWELL_MASK) == ATA_SS_CONWELL_GEN2)) { @@ -3355,7 +3355,7 @@ ata_promise_chipinit(device_t dev) /* setup host packet controls */ hpkt = kmalloc(sizeof(struct ata_promise_sx4), - M_TEMP, M_NOWAIT | M_ZERO); + M_TEMP, M_INTWAIT | M_ZERO); spin_init(&hpkt->mtx); TAILQ_INIT(&hpkt->queue); hpkt->busy = 0; @@ -3731,7 +3731,7 @@ ata_promise_mio_status(device_t dev) if ((status & (0x00000001 << ch->unit)) && (tp = (struct ata_connect_task *) kmalloc(sizeof(struct ata_connect_task), - M_ATA, M_NOWAIT | M_ZERO))) { + M_ATA, M_INTWAIT | M_ZERO))) { if (bootverbose) device_printf(ch->dev, "DISCONNECT requested\n"); @@ -3745,7 +3745,7 @@ ata_promise_mio_status(device_t dev) if ((status & (0x00000010 << ch->unit)) && (tp = (struct ata_connect_task *) kmalloc(sizeof(struct ata_connect_task), - M_ATA, M_NOWAIT | M_ZERO))) { + M_ATA, M_INTWAIT | M_ZERO))) { if (bootverbose) device_printf(ch->dev, "CONNECT requested\n"); @@ -4112,7 +4112,7 @@ ata_promise_queue_hpkt(struct ata_pci_controller *ctlr, u_int32_t hpkt) spin_lock_wr(&hpktp->mtx); if (hpktp->busy) { struct host_packet *hp = - kmalloc(sizeof(struct host_packet), M_TEMP, M_NOWAIT | M_ZERO); + kmalloc(sizeof(struct host_packet), M_TEMP, M_INTWAIT | M_ZERO); hp->addr = hpkt; TAILQ_INSERT_TAIL(&hpktp->queue, hp, chain); } @@ -5597,7 +5597,7 @@ ata_serialize(device_t dev, int flags) if (!inited) { serial = kmalloc(sizeof(struct ata_serialize), - M_TEMP, M_NOWAIT | M_ZERO); + M_TEMP, M_INTWAIT | M_ZERO); spin_init(&serial->locked_mtx); serial->locked_ch = -1; serial->restart_ch = -1; diff --git a/sys/dev/disk/nata/ata-disk.c b/sys/dev/disk/nata/ata-disk.c index 45520dab32..23cfc70bdb 100644 --- a/sys/dev/disk/nata/ata-disk.c +++ b/sys/dev/disk/nata/ata-disk.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.197 2006/03/31 08:09:04 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/ata-disk.c,v 1.4 2007/06/01 00:31:14 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/ata-disk.c,v 1.5 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -104,12 +104,7 @@ ad_attach(device_t dev) if (device_get_ivars(dev)) return EEXIST; - /* XXX TGEN We're not in interrupt context, so we can M_WAITOK and remove - the OOM check. */ - if (!(adp = kmalloc(sizeof(struct ad_softc), M_AD, M_NOWAIT | M_ZERO))) { - device_printf(dev, "out of memory\n"); - return ENOMEM; - } + adp = kmalloc(sizeof(struct ad_softc), M_AD, M_INTWAIT | M_ZERO); device_set_ivars(dev, adp); if ((atadev->param.atavalid & ATA_FLAG_54_58) && diff --git a/sys/dev/disk/nata/ata-dma.c b/sys/dev/disk/nata/ata-dma.c index 0f234ef6ea..f56d74de04 100644 --- a/sys/dev/disk/nata/ata-dma.c +++ b/sys/dev/disk/nata/ata-dma.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-dma.c,v 1.141 2006/01/05 21:27:19 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/ata-dma.c,v 1.2 2007/06/01 00:31:15 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/ata-dma.c,v 1.3 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -66,18 +66,17 @@ ata_dmainit(device_t dev) { struct ata_channel *ch = device_get_softc(dev); - if ((ch->dma = kmalloc(sizeof(struct ata_dma), M_ATADMA, M_NOWAIT|M_ZERO))) { - ch->dma->alloc = ata_dmaalloc; - ch->dma->free = ata_dmafree; - ch->dma->setprd = ata_dmasetprd; - ch->dma->load = ata_dmaload; - ch->dma->unload = ata_dmaunload; - ch->dma->alignment = 2; - ch->dma->boundary = 128 * DEV_BSIZE; - ch->dma->segsize = 128 * DEV_BSIZE; - ch->dma->max_iosize = 128 * DEV_BSIZE; - ch->dma->max_address = BUS_SPACE_MAXADDR_32BIT; - } + ch->dma = kmalloc(sizeof(struct ata_dma), M_ATADMA, M_INTWAIT|M_ZERO); + ch->dma->alloc = ata_dmaalloc; + ch->dma->free = ata_dmafree; + ch->dma->setprd = ata_dmasetprd; + ch->dma->load = ata_dmaload; + ch->dma->unload = ata_dmaunload; + ch->dma->alignment = 2; + ch->dma->boundary = 128 * DEV_BSIZE; + ch->dma->segsize = 128 * DEV_BSIZE; + ch->dma->max_iosize = 128 * DEV_BSIZE; + ch->dma->max_address = BUS_SPACE_MAXADDR_32BIT; } static void diff --git a/sys/dev/disk/nata/atapi-cam.c b/sys/dev/disk/nata/atapi-cam.c index f46e2ed7a0..bc8d102f0d 100644 --- a/sys/dev/disk/nata/atapi-cam.c +++ b/sys/dev/disk/nata/atapi-cam.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-cam.c,v 1.44 2006/03/31 08:09:05 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/atapi-cam.c,v 1.5 2007/05/01 00:05:17 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/atapi-cam.c,v 1.6 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -148,15 +148,9 @@ static void atapi_cam_identify(device_t *dev, device_t parent) { struct atapi_xpt_softc *scp = - kmalloc(sizeof(struct atapi_xpt_softc), M_ATACAM, M_NOWAIT|M_ZERO); + kmalloc(sizeof(struct atapi_xpt_softc), M_ATACAM, M_INTWAIT|M_ZERO); device_t child; - if (scp == NULL) { - /* XXX TGEN Use device_printf()? */ - kprintf("atapi_cam_identify: out of memory"); - return; - } - /* Assume one atapicam instance per parent channel instance. */ child = device_add_child(parent, "atapicam", -1); if (child == NULL) { @@ -587,11 +581,8 @@ atapi_action(struct cam_sim *sim, union ccb *ccb) if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_IN && (len & 1)) { /* ATA always transfers an even number of bytes */ - if ((buf = hcb->dxfer_alloc - = kmalloc(++len, M_ATACAM, M_NOWAIT | M_ZERO)) == NULL) { - kprintf("cannot allocate ATAPI/CAM buffer\n"); - goto action_oom; - } + buf = hcb->dxfer_alloc = + kmalloc(++len, M_ATACAM, M_INTWAIT | M_ZERO); } request->dev = softc->atadev[tid]->dev; request->driver = hcb; @@ -822,14 +813,12 @@ static struct atapi_hcb * allocate_hcb(struct atapi_xpt_softc *softc, int unit, int bus, union ccb *ccb) { struct atapi_hcb *hcb = (struct atapi_hcb *) - kmalloc(sizeof(struct atapi_hcb), M_ATACAM, M_NOWAIT | M_ZERO); + kmalloc(sizeof(struct atapi_hcb), M_ATACAM, M_INTWAIT | M_ZERO); - if (hcb != NULL) { - hcb->softc = softc; - hcb->unit = unit; - hcb->bus = bus; - hcb->ccb = ccb; - } + hcb->softc = softc; + hcb->unit = unit; + hcb->bus = bus; + hcb->ccb = ccb; return hcb; } diff --git a/sys/dev/disk/nata/atapi-cd.c b/sys/dev/disk/nata/atapi-cd.c index 3642e81ac7..d4025fed9c 100644 --- a/sys/dev/disk/nata/atapi-cd.c +++ b/sys/dev/disk/nata/atapi-cd.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.189 2006/06/28 15:04:10 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/atapi-cd.c,v 1.6 2007/06/03 03:44:14 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/atapi-cd.c,v 1.7 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -129,10 +129,7 @@ acd_attach(device_t dev) /* XXX TGEN We're not in interrupt context, so we can M_WAITOK and remove the OOM check. */ - if (!(cdp = kmalloc(sizeof(struct acd_softc), M_ACD, M_NOWAIT | M_ZERO))) { - device_printf(dev, "out of memory\n"); - return ENOMEM; - } + cdp = kmalloc(sizeof(struct acd_softc), M_ACD, M_INTWAIT | M_ZERO); cdp->block_size = 2048; device_set_ivars(dev, cdp); ATA_SETMODE(device_get_parent(dev), dev); @@ -413,10 +410,7 @@ acd_ioctl(struct dev_ioctl_args *ap) struct cd_toc_entry *entry; /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(toc = kmalloc(sizeof(struct toc), M_ACD, M_NOWAIT))) { - error = ENOMEM; - break; - } + toc = kmalloc(sizeof(struct toc), M_ACD, M_INTWAIT); bcopy(&cdp->toc, toc, sizeof(struct toc)); entry = toc->tab + (toc->hdr.ending_track + 1 - toc->hdr.starting_track) + 1; @@ -465,10 +459,7 @@ acd_ioctl(struct dev_ioctl_args *ap) struct cd_toc_entry *entry; /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(toc = kmalloc(sizeof(struct toc), M_ACD, M_NOWAIT))) { - error = ENOMEM; - break; - } + toc = kmalloc(sizeof(struct toc), M_ACD, M_INTWAIT); bcopy(&cdp->toc, toc, sizeof(struct toc)); entry = toc->tab + (track - toc->hdr.starting_track); lba2msf(ntohl(entry->addr.lba), &entry->addr.msf.minute, @@ -1376,8 +1367,7 @@ acd_send_cue(device_t dev, struct cdr_cuesheet *cuesheet) if ((error = acd_mode_select(dev, (caddr_t)¶m, param.page_length + 10))) return error; - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(buffer = kmalloc(cuesheet->len, M_ACD, M_NOWAIT))) + if (!(buffer = kmalloc(cuesheet->len, M_ACD, M_WAITOK | M_NULLOK))) return ENOMEM; if (!(error = copyin(cuesheet->entries, buffer, cuesheet->len))) @@ -1429,9 +1419,7 @@ acd_report_key(device_t dev, struct dvd_authinfo *ai) ccb[10] = (ai->agid << 6) | ai->format; if (length) { - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(d = kmalloc(length, M_ACD, M_NOWAIT | M_ZERO))) - return ENOMEM; + d = kmalloc(length, M_ACD, M_WAITOK | M_ZERO); d->length = htons(length - 2); } @@ -1497,25 +1485,19 @@ acd_send_key(device_t dev, struct dvd_authinfo *ai) switch (ai->format) { case DVD_SEND_CHALLENGE: length = 16; - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(d = kmalloc(length, M_ACD, M_NOWAIT | M_ZERO))) - return ENOMEM; + d = kmalloc(length, M_ACD, M_WAITOK | M_ZERO); bcopy(ai->keychal, &d->data[0], 10); break; case DVD_SEND_KEY2: length = 12; - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(d = kmalloc(length, M_ACD, M_NOWAIT | M_ZERO))) - return ENOMEM; + d = kmalloc(length, M_ACD, M_WAITOK | M_ZERO); bcopy(&ai->keychal[0], &d->data[0], 5); break; case DVD_SEND_RPC: length = 8; - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(d = kmalloc(length, M_ACD, M_NOWAIT | M_ZERO))) - return ENOMEM; + d = kmalloc(length, M_ACD, M_WAITOK | M_ZERO); d->data[0] = ai->region; break; @@ -1577,9 +1559,7 @@ acd_read_structure(device_t dev, struct dvd_struct *s) return EINVAL; } - /* XXX TGEN Use M_WAITOK, not in intr ctx. */ - if (!(d = kmalloc(length, M_ACD, M_NOWAIT | M_ZERO))) - return ENOMEM; + d = kmalloc(length, M_ACD, M_WAITOK | M_ZERO); d->length = htons(length - 2); bzero(ccb, sizeof(ccb)); diff --git a/sys/dev/disk/nata/atapi-fd.c b/sys/dev/disk/nata/atapi-fd.c index fd845c36b6..254c290366 100644 --- a/sys/dev/disk/nata/atapi-fd.c +++ b/sys/dev/disk/nata/atapi-fd.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-fd.c,v 1.109 2006/03/30 05:29:57 marcel Exp $ - * $DragonFly: src/sys/dev/disk/nata/atapi-fd.c,v 1.3 2007/05/15 00:01:03 dillon Exp $ + * $DragonFly: src/sys/dev/disk/nata/atapi-fd.c,v 1.4 2007/06/03 04:48:29 dillon Exp $ */ #include @@ -91,12 +91,7 @@ afd_attach(device_t dev) struct afd_softc *fdp; cdev_t cdev; - /* XXX TGEN We're not in interrupt context, so we can M_WAITOK and remove - the OOM check. */ - if (!(fdp = kmalloc(sizeof(struct afd_softc), M_AFD, M_NOWAIT | M_ZERO))) { - device_printf(dev, "out of memory\n"); - return ENOMEM; - } + fdp = kmalloc(sizeof(struct afd_softc), M_AFD, M_WAITOK | M_ZERO); device_set_ivars(dev, fdp); ATA_SETMODE(device_get_parent(dev), dev); diff --git a/sys/dev/disk/nata/atapi-tape.c b/sys/dev/disk/nata/atapi-tape.c index dbb61f465d..43fc81a434 100644 --- a/sys/dev/disk/nata/atapi-tape.c +++ b/sys/dev/disk/nata/atapi-tape.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-tape.c,v 1.101 2006/01/05 21:27:19 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/atapi-tape.c,v 1.2 2006/12/22 23:26:16 swildner Exp $ + * $DragonFly: src/sys/dev/disk/nata/atapi-tape.c,v 1.3 2007/06/03 04:48:29 dillon Exp $ */ #include "opt_ata.h" @@ -106,12 +106,7 @@ ast_attach(device_t dev) struct ast_readposition position; cdev_t cdev; - /* XXX TGEN We're not in interrupt context, so we can M_WAITOK and remove - the OOM check. */ - if (!(stp = kmalloc(sizeof(struct ast_softc), M_AST, M_NOWAIT | M_ZERO))) { - device_printf(dev, "out of memory\n"); - return ENOMEM; - } + stp = kmalloc(sizeof(struct ast_softc), M_AST, M_WAITOK | M_ZERO); device_set_ivars(dev, stp); ATA_SETMODE(device_get_parent(dev), dev); -- 2.11.4.GIT