Print this page
11927 Log, or optionally panic, on zero-length kmem allocations
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>


3900 {
3901         const char *logname = "kmem_transaction_log";
3902         kmalog_data_t kma;
3903 
3904         if (argc > 1)
3905                 return (DCMD_USAGE);
3906 
3907         kma.kma_newest = 0;
3908         if (flags & DCMD_ADDRSPEC)
3909                 kma.kma_addr = addr;
3910         else
3911                 kma.kma_addr = 0;
3912 
3913         if (argc > 0) {
3914                 if (argv->a_type != MDB_TYPE_STRING)
3915                         return (DCMD_USAGE);
3916                 if (strcmp(argv->a_un.a_str, "fail") == 0)
3917                         logname = "kmem_failure_log";
3918                 else if (strcmp(argv->a_un.a_str, "slab") == 0)
3919                         logname = "kmem_slab_log";


3920                 else
3921                         return (DCMD_USAGE);
3922         }
3923 
3924         if (mdb_readvar(&addr, logname) == -1) {
3925                 mdb_warn("failed to read %s log header pointer");
3926                 return (DCMD_ERR);
3927         }
3928 
3929         if (mdb_pwalk("kmem_log", (mdb_walk_cb_t)showbc, &kma, addr) == -1) {
3930                 mdb_warn("failed to walk kmem log");
3931                 return (DCMD_ERR);
3932         }
3933 
3934         return (DCMD_OK);
3935 }
3936 
3937 /*
3938  * As the final lure for die-hard crash(1M) users, we provide ::kmausers here.
3939  * The first piece is a structure which we use to accumulate kmem_cache_t




3900 {
3901         const char *logname = "kmem_transaction_log";
3902         kmalog_data_t kma;
3903 
3904         if (argc > 1)
3905                 return (DCMD_USAGE);
3906 
3907         kma.kma_newest = 0;
3908         if (flags & DCMD_ADDRSPEC)
3909                 kma.kma_addr = addr;
3910         else
3911                 kma.kma_addr = 0;
3912 
3913         if (argc > 0) {
3914                 if (argv->a_type != MDB_TYPE_STRING)
3915                         return (DCMD_USAGE);
3916                 if (strcmp(argv->a_un.a_str, "fail") == 0)
3917                         logname = "kmem_failure_log";
3918                 else if (strcmp(argv->a_un.a_str, "slab") == 0)
3919                         logname = "kmem_slab_log";
3920                 else if (strcmp(argv->a_un.a_str, "zerosized") == 0)
3921                         logname = "kmem_zerosized_log";
3922                 else
3923                         return (DCMD_USAGE);
3924         }
3925 
3926         if (mdb_readvar(&addr, logname) == -1) {
3927                 mdb_warn("failed to read %s log header pointer");
3928                 return (DCMD_ERR);
3929         }
3930 
3931         if (mdb_pwalk("kmem_log", (mdb_walk_cb_t)showbc, &kma, addr) == -1) {
3932                 mdb_warn("failed to walk kmem log");
3933                 return (DCMD_ERR);
3934         }
3935 
3936         return (DCMD_OK);
3937 }
3938 
3939 /*
3940  * As the final lure for die-hard crash(1M) users, we provide ::kmausers here.
3941  * The first piece is a structure which we use to accumulate kmem_cache_t