Fine-grained malloc statistics - replace some M_DEVBUF with module-specific
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 1 Dec 2007 22:21:18 +0000 (22:21 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 1 Dec 2007 22:21:18 +0000 (22:21 +0000)
types.

Obtained-from: FreeBSD

sys/bus/cam/cam_periph.c
sys/bus/cam/cam_queue.c
sys/bus/cam/cam_sim.c
sys/bus/cam/cam_xpt.c
sys/bus/cam/scsi/scsi_low.c
sys/bus/cam/scsi/scsi_sa.c
sys/bus/cam/scsi/scsi_ses.c
sys/bus/cam/scsi/scsi_targ_bh.c

index c8158e1..885028c 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/cam_periph.c,v 1.24.2.3 2003/01/25 19:04:40 dillon Exp $
- * $DragonFly: src/sys/bus/cam/cam_periph.c,v 1.36 2007/11/28 21:55:59 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/cam_periph.c,v 1.37 2007/12/01 22:21:17 pavalos Exp $
  */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/types.h>
 #include <sys/malloc.h>
+#include <sys/kernel.h>
 #include <sys/buf.h>
 #include <sys/proc.h>
 #include <sys/devicestat.h>
@@ -81,6 +82,8 @@ static        int             camperiphscsisenseerror(union ccb *ccb,
 static int nperiph_drivers;
 struct periph_driver **periph_drivers;
 
+MALLOC_DEFINE(M_CAMPERIPH, "CAM periph", "CAM peripheral buffers");
+
 void
 periphdriver_register(void *data)
 {
@@ -141,7 +144,7 @@ cam_periph_alloc(periph_ctor_t *periph_ctor,
                return (CAM_REQ_INVALID);
        }
        
-       periph = kmalloc(sizeof(*periph), M_DEVBUF, M_INTWAIT | M_ZERO);
+       periph = kmalloc(sizeof(*periph), M_CAMPERIPH, M_INTWAIT | M_ZERO);
        
        init_level++;
 
@@ -210,7 +213,7 @@ failure:
        case 2:
                xpt_free_path(periph->path);
        case 1:
-               kfree(periph, M_DEVBUF);
+               kfree(periph, M_CAMPERIPH);
        case 0:
                /* No cleanup to perform. */
                break;
@@ -465,7 +468,7 @@ camperiphfree(struct cam_periph *periph)
                                          periph->path, arg);
        }
        xpt_free_path(periph->path);
-       kfree(periph, M_DEVBUF);
+       kfree(periph, M_CAMPERIPH);
 }
 
 /*
index 1023d80..03e57ae 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/cam_queue.c,v 1.5 1999/08/28 00:40:41 peter Exp $
- * $DragonFly: src/sys/bus/cam/cam_queue.c,v 1.10 2007/11/25 02:21:30 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/cam_queue.c,v 1.11 2007/12/01 22:21:17 pavalos Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/types.h>
 #include <sys/malloc.h>
+#include <sys/kernel.h>
 
 #include "cam.h"
 #include "cam_ccb.h"
 #include "cam_queue.h"
 #include "cam_debug.h"
 
+MALLOC_DEFINE(M_CAMQ, "CAM queue", "CAM queue buffers");
+MALLOC_DEFINE(M_CAMDEVQ, "CAM dev queue", "CAM dev queue buffers");
+MALLOC_DEFINE(M_CAMCCBQ, "CAM ccb queue", "CAM ccb queue buffers");
+
 static __inline int
                queue_cmp(cam_pinfo **queue_array, int i, int j);
 static __inline void
@@ -51,7 +56,7 @@ camq_alloc(int size)
 {
        struct camq *camq;
 
-       camq = kmalloc(sizeof(*camq), M_DEVBUF, M_INTWAIT);
+       camq = kmalloc(sizeof(*camq), M_CAMQ, M_INTWAIT);
        camq_init(camq, size);
        return (camq);
 }
@@ -63,7 +68,7 @@ camq_init(struct camq *camq, int size)
        camq->array_size = size;
        if (camq->array_size != 0) {
                camq->queue_array = kmalloc(size * sizeof(cam_pinfo *), 
-                                       M_DEVBUF, M_INTWAIT);
+                                       M_CAMQ, M_INTWAIT);
                /*
                 * Heap algorithms like everything numbered from 1, so
                 * offset our pointer into the heap array by one element.
@@ -86,7 +91,7 @@ camq_free(struct camq *queue)
 {
        if (queue != NULL) {
                camq_fini(queue);
-               kfree(queue, M_DEVBUF);
+               kfree(queue, M_CAMQ);
        }
 }
 
@@ -99,7 +104,7 @@ camq_fini(struct camq *queue)
                 * our pointer into the heap array is offset by one element.
                 */
                queue->queue_array++;
-               kfree(queue->queue_array, M_DEVBUF);
+               kfree(queue->queue_array, M_CAMQ);
        }
 }
 
@@ -113,7 +118,7 @@ camq_resize(struct camq *queue, int new_size)
                panic("camq_resize: New queue size can't accommodate "
                      "queued entries.");
 #endif
-       new_array = kmalloc(new_size * sizeof(cam_pinfo *), M_DEVBUF, M_INTWAIT);
+       new_array = kmalloc(new_size * sizeof(cam_pinfo *), M_CAMQ, M_INTWAIT);
 
        /*
         * Heap algorithms like everything numbered from 1, so
@@ -124,7 +129,7 @@ camq_resize(struct camq *queue, int new_size)
                queue->queue_array++;
                bcopy(queue->queue_array, new_array,
                      queue->entries * sizeof(cam_pinfo *));
-               kfree(queue->queue_array, M_DEVBUF);
+               kfree(queue->queue_array, M_CAMQ);
        }
        queue->queue_array = new_array-1;
        queue->array_size = new_size;
@@ -198,7 +203,7 @@ cam_devq_alloc(int devices, int openings)
 {
        struct cam_devq *devq;
 
-       devq = kmalloc(sizeof(*devq), M_DEVBUF, M_INTWAIT);
+       devq = kmalloc(sizeof(*devq), M_CAMDEVQ, M_INTWAIT);
        cam_devq_init(devq, devices, openings);
        return (devq);
 }
@@ -231,7 +236,7 @@ cam_devq_release(struct cam_devq *devq)
                        kprintf("cam_devq_release: WARNING active allocations %d active send %d!\n", devq->alloc_active, devq->send_active);
                camq_fini(&devq->alloc_queue);
                camq_fini(&devq->send_queue);
-               kfree(devq, M_DEVBUF);
+               kfree(devq, M_CAMDEVQ);
        }
 }
 
@@ -253,7 +258,7 @@ cam_ccbq_alloc(int openings)
 {
        struct cam_ccbq *ccbq;
 
-       ccbq = kmalloc(sizeof(*ccbq), M_DEVBUF, M_INTWAIT);
+       ccbq = kmalloc(sizeof(*ccbq), M_CAMCCBQ, M_INTWAIT);
        cam_ccbq_init(ccbq, openings);
        return (ccbq);
 }
@@ -263,7 +268,7 @@ cam_ccbq_free(struct cam_ccbq *ccbq)
 {
        if (ccbq) {
                camq_fini(&ccbq->queue);
-               kfree(ccbq, M_DEVBUF);
+               kfree(ccbq, M_CAMCCBQ);
        }
 }
 
index b887c29..febc7f4 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/cam_sim.c,v 1.3 1999/08/28 00:40:42 peter Exp $
- * $DragonFly: src/sys/bus/cam/cam_sim.c,v 1.9 2007/06/14 01:09:30 dillon Exp $
+ * $DragonFly: src/sys/bus/cam/cam_sim.c,v 1.10 2007/12/01 22:21:17 pavalos Exp $
  */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
+#include <sys/kernel.h>
 
 #include "cam.h"
 #include "cam_ccb.h"
@@ -41,6 +42,8 @@
 
 #define CAM_PATH_ANY (u_int32_t)-1
 
+MALLOC_DEFINE(M_CAMSIM, "CAM SIM", "CAM SIM buffers");
+
 struct cam_devq *
 cam_simq_alloc(u_int32_t max_sim_transactions)
 {
@@ -84,7 +87,7 @@ cam_sim_alloc(sim_action_func sim_action, sim_poll_func sim_poll,
        else
                cam_devq_reference(queue);
 
-       sim = kmalloc(sizeof(struct cam_sim), M_DEVBUF, M_INTWAIT | M_ZERO);
+       sim = kmalloc(sizeof(struct cam_sim), M_CAMSIM, M_INTWAIT | M_ZERO);
        sim->sim_action = sim_action;
        sim->sim_poll = sim_poll;
        sim->sim_name = sim_name;
@@ -129,7 +132,7 @@ cam_sim_release(struct cam_sim *sim, int flags)
                        sim->devq = NULL;
                }
                sim->refcount = 0;
-               kfree(sim, M_DEVBUF);
+               kfree(sim, M_CAMSIM);
        } else {
                --sim->refcount;
        }
index df6f64e..1452b02 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/cam_xpt.c,v 1.80.2.18 2002/12/09 17:31:55 gibbs Exp $
- * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.53 2007/11/29 03:57:25 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.54 2007/12/01 22:21:17 pavalos Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -63,6 +63,7 @@
 #include "opt_cam.h"
 
 /* Datastructures internal to the xpt layer */
+MALLOC_DEFINE(M_CAMXPT, "CAM XPT", "CAM XPT buffers");
 
 /*
  * Definition of an async handler callback block.  These are used to add
@@ -3299,13 +3300,13 @@ xpt_action(union ccb *start_ccb)
                                SLIST_REMOVE(async_head, cur_entry,
                                             async_node, links);
                                csa->ccb_h.path->device->refcount--;
-                               kfree(cur_entry, M_DEVBUF);
+                               kfree(cur_entry, M_CAMXPT);
                        } else {
                                cur_entry->event_enable = csa->event_enable;
                        }
                } else {
                        cur_entry = kmalloc(sizeof(*cur_entry), 
-                                           M_DEVBUF, M_INTWAIT);
+                                           M_CAMXPT, M_INTWAIT);
                        cur_entry->event_enable = csa->event_enable;
                        cur_entry->callback_arg = csa->callback_arg;
                        cur_entry->callback = csa->callback;
@@ -3870,10 +3871,10 @@ xpt_create_path(struct cam_path **new_path_ptr, struct cam_periph *perph,
        struct     cam_path *path;
        cam_status status;
 
-       path = kmalloc(sizeof(*path), M_DEVBUF, M_INTWAIT);
+       path = kmalloc(sizeof(*path), M_CAMXPT, M_INTWAIT);
        status = xpt_compile_path(path, perph, path_id, target_id, lun_id);
        if (status != CAM_REQ_CMP) {
-               kfree(path, M_DEVBUF);
+               kfree(path, M_CAMXPT);
                path = NULL;
        }
        *new_path_ptr = path;
@@ -3976,7 +3977,7 @@ xpt_free_path(struct cam_path *path)
 {
        CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_free_path\n"));
        xpt_release_path(path);
-       kfree(path, M_DEVBUF);
+       kfree(path, M_CAMXPT);
 }
 
 
@@ -4181,7 +4182,7 @@ xpt_bus_register(struct cam_sim *sim, u_int32_t bus)
        struct ccb_pathinq cpi;
 
        sim->bus_id = bus;
-       new_bus = kmalloc(sizeof(*new_bus), M_DEVBUF, M_INTWAIT);
+       new_bus = kmalloc(sizeof(*new_bus), M_CAMXPT, M_INTWAIT);
 
        if (strcmp(sim->sim_name, "xpt") != 0) {
                sim->path_id =
@@ -4690,14 +4691,14 @@ xpt_alloc_ccb(void)
 {
        union ccb *new_ccb;
 
-       new_ccb = kmalloc(sizeof(*new_ccb), M_DEVBUF, M_INTWAIT);
+       new_ccb = kmalloc(sizeof(*new_ccb), M_CAMXPT, M_INTWAIT);
        return (new_ccb);
 }
 
 void
 xpt_free_ccb(union ccb *free_ccb)
 {
-       kfree(free_ccb, M_DEVBUF);
+       kfree(free_ccb, M_CAMXPT);
 }
 
 
@@ -4718,7 +4719,7 @@ xpt_get_ccb(struct cam_ed *device)
 
        crit_enter();
        if ((new_ccb = (union ccb *)SLIST_FIRST(&ccb_freeq)) == NULL) {
-               new_ccb = kmalloc(sizeof(*new_ccb), M_DEVBUF, M_INTWAIT);
+               new_ccb = kmalloc(sizeof(*new_ccb), M_CAMXPT, M_INTWAIT);
                SLIST_INSERT_HEAD(&ccb_freeq, &new_ccb->ccb_h,
                                  xpt_links.sle);
                xpt_ccb_count++;
@@ -4743,7 +4744,7 @@ xpt_release_bus(struct cam_eb *bus)
                }
                bus_generation++;
                KKASSERT(bus->refcount == 1);
-               kfree(bus, M_DEVBUF);
+               kfree(bus, M_CAMXPT);
        } else {
                --bus->refcount;
        }
@@ -4756,7 +4757,7 @@ xpt_alloc_target(struct cam_eb *bus, target_id_t target_id)
        struct cam_et *target;
        struct cam_et *cur_target;
 
-       target = kmalloc(sizeof(*target), M_DEVBUF, M_INTWAIT);
+       target = kmalloc(sizeof(*target), M_CAMXPT, M_INTWAIT);
 
        TAILQ_INIT(&target->ed_entries);
        target->bus = bus;
@@ -4794,7 +4795,7 @@ xpt_release_target(struct cam_eb *bus, struct cam_et *target)
                bus->generation++;
                xpt_release_bus(bus);
                KKASSERT(target->refcount == 1);
-               kfree(target, M_DEVBUF);
+               kfree(target, M_CAMXPT);
        } else {
                --target->refcount;
        }
@@ -4820,7 +4821,7 @@ xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
        if (status != CAM_REQ_CMP) {
                device = NULL;
        } else {
-               device = kmalloc(sizeof(*device), M_DEVBUF, M_INTWAIT);
+               device = kmalloc(sizeof(*device), M_CAMXPT, M_INTWAIT);
        }
 
        if (device != NULL) {
@@ -4834,13 +4835,13 @@ xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
                device->lun_id = lun_id;
                /* Initialize our queues */
                if (camq_init(&device->drvq, 0) != 0) {
-                       kfree(device, M_DEVBUF);
+                       kfree(device, M_CAMXPT);
                        return (NULL);
                }
                if (cam_ccbq_init(&device->ccbq,
                                  bus->sim->max_dev_openings) != 0) {
                        camq_fini(&device->drvq);
-                       kfree(device, M_DEVBUF);
+                       kfree(device, M_CAMXPT);
                        return (NULL);
                }
                SLIST_INIT(&device->asyncs);
@@ -4935,7 +4936,7 @@ xpt_release_device(struct cam_eb *bus, struct cam_et *target,
                camq_fini(&device->ccbq.queue);
                xpt_release_target(bus, target);
                KKASSERT(device->refcount == 1);
-               kfree(device, M_DEVBUF);
+               kfree(device, M_CAMXPT);
        } else {
                --device->refcount;
        }
@@ -5751,7 +5752,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 
                /* Clean up from previous instance of this device */
                if (path->device->serial_num != NULL) {
-                       kfree(path->device->serial_num, M_DEVBUF);
+                       kfree(path->device->serial_num, M_CAMXPT);
                        path->device->serial_num = NULL;
                        path->device->serial_num_len = 0;
                }
@@ -5766,7 +5767,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
                        have_serialnum = 1;
                        path->device->serial_num =
                                kmalloc((serial_buf->length + 1),
-                                      M_DEVBUF, M_INTWAIT);
+                                      M_CAMXPT, M_INTWAIT);
                        bcopy(serial_buf->serial_num,
                              path->device->serial_num,
                              serial_buf->length);
index b39d6f2..f187895 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $FreeBSD: src/sys/cam/scsi/scsi_low.c,v 1.1.2.5 2003/08/09 06:18:30 non Exp $
- * $DragonFly: src/sys/bus/cam/scsi/scsi_low.c,v 1.24 2007/11/24 23:12:51 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/scsi/scsi_low.c,v 1.25 2007/12/01 22:21:17 pavalos Exp $
  * $NetBSD: scsi_low.c,v 1.24.10.8 2001/06/26 07:39:44 honda Exp $
  */
 
@@ -77,6 +77,7 @@
 #include <bus/cam/cam_sim.h>
 #include <bus/cam/cam_debug.h>
 #include <bus/cam/cam_periph.h>
+#include <bus/cam/cam_xpt_periph.h>
 
 #include <bus/cam/scsi/scsi_all.h>
 #include <bus/cam/scsi/scsi_low.h>
 #define        SCSI_LOW_DISK_LFLAGS    0x0000ffff
 #define        SCSI_LOW_DISK_TFLAGS    0xffff0000
 
+MALLOC_DEFINE(M_SCSILOW, "SCSI low", "SCSI low buffers");
+
 /**************************************************************
  * Declarations
  **************************************************************/
@@ -332,8 +335,8 @@ scsi_low_translate_error_code(struct slccb *cb, struct scsi_low_error_code *tp)
 /**************************************************************
  * SCSI INTERFACE (CAM)
  **************************************************************/
-#define        SCSI_LOW_MALLOC(size)           kmalloc((size), M_DEVBUF, M_INTWAIT)
-#define        SCSI_LOW_FREE(pt)               kfree((pt), M_DEVBUF)
+#define        SCSI_LOW_MALLOC(size)           kmalloc((size), M_SCSILOW, M_INTWAIT)
+#define        SCSI_LOW_FREE(pt)               kfree((pt), M_SCSILOW)
 #define        SCSI_LOW_ALLOC_CCB(flags)       scsi_low_get_ccb()
 
 static void scsi_low_poll_cam (struct cam_sim *);
@@ -399,14 +402,14 @@ static void
 scsi_low_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb)
 {
        xpt_free_path(ccb->ccb_h.path);
-       kfree(ccb, M_DEVBUF);
+       xpt_free_ccb(ccb);
 }
 
 static void
 scsi_low_rescan_bus_cam(struct scsi_low_softc *slp)
 {
        struct cam_path *path;
-       union ccb *ccb = kmalloc(sizeof(union ccb), M_DEVBUF, M_INTWAIT | M_ZERO);
+       union ccb *ccb = xpt_alloc_ccb();
        cam_status status;
 
        status = xpt_create_path(&path, xpt_periph,
index 5a4f831..5bcd3e9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $FreeBSD: src/sys/cam/scsi/scsi_sa.c,v 1.45.2.13 2002/12/17 17:08:50 trhodes Exp $
- * $DragonFly: src/sys/bus/cam/scsi/scsi_sa.c,v 1.31 2007/11/29 03:31:15 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/scsi/scsi_sa.c,v 1.32 2007/12/01 22:21:18 pavalos Exp $
  *
  * Implementation of SCSI Sequential Access Peripheral driver for CAM.
  *
  * Driver states
  */
 
+MALLOC_DEFINE(M_SCSISA, "SCSI sa", "SCSI sequential access buffers");
 
 typedef enum {
        SA_STATE_NORMAL, SA_STATE_ABNORMAL
@@ -1381,7 +1382,7 @@ sacleanup(struct cam_periph *periph)
        xpt_print_path(periph->path);
        kprintf("removing device entry\n");
        dev_ops_remove(&sa_ops, SA_UNITMASK, SA_UNIT(periph->unit_number));
-       kfree(softc, M_DEVBUF);
+       kfree(softc, M_SCSISA);
 }
 
 static void
@@ -1446,7 +1447,7 @@ saregister(struct cam_periph *periph, void *arg)
                return (CAM_REQ_CMP_ERR);
        }
 
-       softc = kmalloc(sizeof (*softc), M_DEVBUF, M_INTWAIT | M_ZERO);
+       softc = kmalloc(sizeof (*softc), M_SCSISA, M_INTWAIT | M_ZERO);
        softc->scsi_rev = SID_ANSI_REV(&cgd->inq_data);
        softc->state = SA_STATE_NORMAL;
        softc->fileno = (daddr_t) -1;
index f500845..15338ad 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/cam/scsi/scsi_ses.c,v 1.8.2.2 2000/08/08 23:19:21 mjacob Exp $ */
-/* $DragonFly: src/sys/bus/cam/scsi/scsi_ses.c,v 1.27 2007/11/25 01:21:42 pavalos Exp $ */
+/* $DragonFly: src/sys/bus/cam/scsi/scsi_ses.c,v 1.28 2007/12/01 22:21:18 pavalos Exp $ */
 /*
  * Copyright (c) 2000 Matthew Jacob
  * All rights reserved.
@@ -54,6 +54,8 @@
 
 #include <opt_ses.h>
 
+MALLOC_DEFINE(M_SCSISES, "SCSI SES", "SCSI SES buffers");
+
 /*
  * Platform Independent Driver Internal Definitions for SES devices.
  */
@@ -123,8 +125,8 @@ static int safte_set_objstat(ses_softc_t *, ses_objstat *, int);
 #define        SES_DLOG                if (0) ses_log
 #endif
 #define        SES_VLOG                if (bootverbose) ses_log
-#define        SES_MALLOC(amt)         kmalloc(amt, M_DEVBUF, M_INTWAIT)
-#define        SES_FREE(ptr, amt)      kfree(ptr, M_DEVBUF)
+#define        SES_MALLOC(amt)         kmalloc(amt, M_SCSISES, M_INTWAIT)
+#define        SES_FREE(ptr, amt)      kfree(ptr, M_SCSISES)
 #define        MEMZERO                 bzero
 #define        MEMCPY(dest, src, amt)  bcopy(src, dest, amt)
 
@@ -261,7 +263,7 @@ sescleanup(struct cam_periph *periph)
        xpt_print_path(periph->path);
        kprintf("removing device entry\n");
        dev_ops_remove(&ses_ops, -1, periph->unit_number);
-       kfree(softc, M_DEVBUF);
+       kfree(softc, M_SCSISES);
 }
 
 static void
@@ -335,7 +337,7 @@ sesregister(struct cam_periph *periph, void *arg)
                return (CAM_REQ_CMP_ERR);
        }
 
-       softc = kmalloc(sizeof (struct ses_softc), M_DEVBUF, M_INTWAIT | M_ZERO);
+       softc = kmalloc(sizeof (struct ses_softc), M_SCSISES, M_INTWAIT | M_ZERO);
        periph->softc = softc;
        softc->periph = periph;
 
@@ -364,7 +366,7 @@ sesregister(struct cam_periph *periph, void *arg)
                break;
        case SES_NONE:
        default:
-               kfree(softc, M_DEVBUF);
+               kfree(softc, M_SCSISES);
                return (CAM_REQ_CMP_ERR);
        }
 
index 3ce1443..5026177 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/scsi/scsi_targ_bh.c,v 1.4.2.6 2003/11/14 11:31:25 simokawa Exp $
- * $DragonFly: src/sys/bus/cam/scsi/scsi_targ_bh.c,v 1.17 2007/11/25 18:03:43 pavalos Exp $
+ * $DragonFly: src/sys/bus/cam/scsi/scsi_targ_bh.c,v 1.18 2007/12/01 22:21:18 pavalos Exp $
  */
 #include <sys/param.h>
 #include <sys/queue.h>
@@ -51,6 +51,8 @@
 #include "scsi_all.h"
 #include "scsi_message.h"
 
+MALLOC_DEFINE(M_SCSIBH, "SCSI bh", "SCSI blackhole buffers");
+
 typedef enum {
        TARGBH_STATE_NORMAL,
        TARGBH_STATE_EXCEPTION,
@@ -277,7 +279,7 @@ targbhenlun(struct cam_periph *periph)
        for (i = 0; i < MAX_ACCEPT; i++) {
                struct ccb_accept_tio *atio;
 
-               atio = kmalloc(sizeof(*atio), M_DEVBUF, M_INTWAIT);
+               atio = kmalloc(sizeof(*atio), M_SCSIBH, M_INTWAIT);
 
                atio->ccb_h.ccb_descr = targbhallocdescr();
 
@@ -288,7 +290,7 @@ targbhenlun(struct cam_periph *periph)
                status = atio->ccb_h.status;
                if (status != CAM_REQ_INPROG) {
                        targbhfreedescr(atio->ccb_h.ccb_descr);
-                       kfree(atio, M_DEVBUF);
+                       kfree(atio, M_SCSIBH);
                        break;
                }
                ((struct targbh_cmd_desc*)atio->ccb_h.ccb_descr)->atio_link =
@@ -311,7 +313,7 @@ targbhenlun(struct cam_periph *periph)
        for (i = 0; i < MAX_ACCEPT; i++) {
                struct ccb_immed_notify *inot;
 
-               inot = kmalloc(sizeof(*inot), M_DEVBUF, M_INTWAIT);
+               inot = kmalloc(sizeof(*inot), M_SCSIBH, M_INTWAIT);
 
                xpt_setup_ccb(&inot->ccb_h, periph->path, /*priority*/1);
                inot->ccb_h.func_code = XPT_IMMED_NOTIFY;
@@ -319,7 +321,7 @@ targbhenlun(struct cam_periph *periph)
                xpt_action((union ccb *)inot);
                status = inot->ccb_h.status;
                if (status != CAM_REQ_INPROG) {
-                       kfree(inot, M_DEVBUF);
+                       kfree(inot, M_SCSIBH);
                        break;
                }
                SLIST_INSERT_HEAD(&softc->immed_notify_slist, &inot->ccb_h,
@@ -392,7 +394,7 @@ targbhctor(struct cam_periph *periph, void *arg)
        struct targbh_softc *softc;
 
        /* Allocate our per-instance private storage */
-       softc = kmalloc(sizeof(*softc), M_DEVBUF, M_INTWAIT | M_ZERO);
+       softc = kmalloc(sizeof(*softc), M_SCSIBH, M_INTWAIT | M_ZERO);
        TAILQ_INIT(&softc->pending_queue);
        TAILQ_INIT(&softc->work_queue);
        softc->accept_tio_list = NULL;
@@ -423,7 +425,7 @@ targbhdtor(struct cam_periph *periph)
        default:
                /* XXX Wait for callback of targbhdislun() */
                tsleep(softc, 0, "targbh", hz/2);
-               kfree(softc, M_DEVBUF);
+               kfree(softc, M_SCSIBH);
                break;
        }
 }
@@ -552,7 +554,7 @@ targbhdone(struct cam_periph *periph, union ccb *done_ccb)
                if (softc->state == TARGBH_STATE_TEARDOWN
                 || atio->ccb_h.status == CAM_REQ_ABORTED) {
                        targbhfreedescr(descr);
-                       kfree(done_ccb, M_DEVBUF);
+                       xpt_free_ccb(done_ccb);
                        return;
                }
 
@@ -701,7 +703,7 @@ targbhdone(struct cam_periph *periph, union ccb *done_ccb)
                        break;
                } else {
                        targbhfreedescr(desc);
-                       kfree(atio, M_DEVBUF);
+                       kfree(atio, M_SCSIBH);
                }
                break;
        }
@@ -713,7 +715,7 @@ targbhdone(struct cam_periph *periph, union ccb *done_ccb)
                if (softc->state == TARGBH_STATE_TEARDOWN
                 || done_ccb->ccb_h.status == CAM_REQ_ABORTED) {
                        kprintf("Freed an immediate notify\n");
-                       kfree(done_ccb, M_DEVBUF);
+                       xpt_free_ccb(done_ccb);
                } else {
                        /* Requeue for another immediate event */
                        xpt_action(done_ccb);
@@ -746,10 +748,10 @@ targbhallocdescr(void)
        struct targbh_cmd_desc* descr;
 
        /* Allocate the targbh_descr structure */
-       descr = kmalloc(sizeof(*descr), M_DEVBUF, M_INTWAIT | M_ZERO);
+       descr = kmalloc(sizeof(*descr), M_SCSIBH, M_INTWAIT | M_ZERO);
 
        /* Allocate buffer backing store */
-       descr->backing_store = kmalloc(MAX_BUF_SIZE, M_DEVBUF, M_INTWAIT);
+       descr->backing_store = kmalloc(MAX_BUF_SIZE, M_SCSIBH, M_INTWAIT);
        descr->max_size = MAX_BUF_SIZE;
        return (descr);
 }
@@ -757,6 +759,6 @@ targbhallocdescr(void)
 static void
 targbhfreedescr(struct targbh_cmd_desc *descr)
 {
-       kfree(descr->backing_store, M_DEVBUF);
-       kfree(descr, M_DEVBUF);
+       kfree(descr->backing_store, M_SCSIBH);
+       kfree(descr, M_SCSIBH);
 }