@@ -380,7 +380,7 @@ typedef struct mdb_dmu_buf_impl {
380
380
struct {
381
381
uint64_t db_object ;
382
382
} db ;
383
- void * db_objset ;
383
+ uintptr_t db_objset ;
384
384
uint64_t db_level ;
385
385
uint64_t db_blkid ;
386
386
struct {
@@ -416,7 +416,7 @@ dbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
416
416
(void ) mdb_snprintf (blkidname , sizeof (blkidname ), "%llx" ,
417
417
(u_longlong_t )db .db_blkid );
418
418
419
- if (objset_name (( uintptr_t ) db .db_objset , path )) {
419
+ if (objset_name (db .db_objset , path )) {
420
420
return (DCMD_ERR );
421
421
}
422
422
@@ -1078,7 +1078,7 @@ spa_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1078
1078
}
1079
1079
1080
1080
typedef struct mdb_spa_config_spa {
1081
- nvlist_t * spa_config ;
1081
+ uintptr_t spa_config ;
1082
1082
} mdb_spa_config_spa_t ;
1083
1083
1084
1084
/*
@@ -1101,12 +1101,12 @@ spa_print_config(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1101
1101
addr , 0 ) == -1 )
1102
1102
return (DCMD_ERR );
1103
1103
1104
- if (spa .spa_config == NULL ) {
1104
+ if (spa .spa_config == 0 ) {
1105
1105
mdb_printf ("(none)\n" );
1106
1106
return (DCMD_OK );
1107
1107
}
1108
1108
1109
- return (mdb_call_dcmd ("nvlist" , ( uintptr_t ) spa .spa_config , flags ,
1109
+ return (mdb_call_dcmd ("nvlist" , spa .spa_config , flags ,
1110
1110
0 , NULL ));
1111
1111
}
1112
1112
@@ -1736,11 +1736,11 @@ typedef struct zio_print_args {
1736
1736
typedef struct mdb_zio {
1737
1737
enum zio_type io_type ;
1738
1738
enum zio_stage io_stage ;
1739
- void * io_waiter ;
1740
- void * io_spa ;
1739
+ uintptr_t io_waiter ;
1740
+ uintptr_t io_spa ;
1741
1741
struct {
1742
1742
struct {
1743
- void * list_next ;
1743
+ uintptr_t list_next ;
1744
1744
} list_head ;
1745
1745
} io_parent_list ;
1746
1746
int io_error ;
@@ -1797,8 +1797,8 @@ zio_print_cb(uintptr_t addr, zio_print_args_t *zpa)
1797
1797
} else {
1798
1798
mdb_printf ("%*s%-*p %-5s %-16s " , indent , "" ,
1799
1799
ZIO_MAXWIDTH - indent , addr , type , stage );
1800
- if (zio .io_waiter )
1801
- mdb_printf ("%-16p " , zio .io_waiter );
1800
+ if (zio .io_waiter != 0 )
1801
+ mdb_printf ("%-16lx " , zio .io_waiter );
1802
1802
else
1803
1803
mdb_printf ("%-16s " , "-" );
1804
1804
#ifdef _KERNEL
@@ -2065,7 +2065,7 @@ spa_walk_step(mdb_walk_state_t *wsp)
2065
2065
static int
2066
2066
zio_walk_init (mdb_walk_state_t * wsp )
2067
2067
{
2068
- wsp -> walk_data = ( void * ) wsp -> walk_addr ;
2068
+ wsp -> walk_data = & wsp -> walk_addr ;
2069
2069
2070
2070
if (mdb_layered_walk ("zio_cache" , wsp ) == -1 ) {
2071
2071
mdb_warn ("failed to walk 'zio_cache'\n" );
@@ -2079,12 +2079,13 @@ static int
2079
2079
zio_walk_step (mdb_walk_state_t * wsp )
2080
2080
{
2081
2081
mdb_zio_t zio ;
2082
+ uintptr_t * spap = wsp -> walk_data ;
2082
2083
2083
2084
if (mdb_ctf_vread (& zio , ZFS_STRUCT "zio" , "mdb_zio_t" ,
2084
2085
wsp -> walk_addr , 0 ) == -1 )
2085
2086
return (WALK_ERR );
2086
2087
2087
- if (wsp -> walk_data != NULL && wsp -> walk_data != zio .io_spa )
2088
+ if (* spap != 0 && * spap != zio .io_spa )
2088
2089
return (WALK_NEXT );
2089
2090
2090
2091
return (wsp -> walk_callback (wsp -> walk_addr , & zio , wsp -> walk_cbdata ));
@@ -2099,16 +2100,17 @@ static int
2099
2100
zio_walk_root_step (mdb_walk_state_t * wsp )
2100
2101
{
2101
2102
mdb_zio_t zio ;
2103
+ uintptr_t * spap = wsp -> walk_data ;
2102
2104
2103
2105
if (mdb_ctf_vread (& zio , ZFS_STRUCT "zio" , "mdb_zio_t" ,
2104
2106
wsp -> walk_addr , 0 ) == -1 )
2105
2107
return (WALK_ERR );
2106
2108
2107
- if (wsp -> walk_data != NULL && wsp -> walk_data != zio .io_spa )
2109
+ if (* spap != 0 && * spap != zio .io_spa )
2108
2110
return (WALK_NEXT );
2109
2111
2110
2112
/* If the parent list is not empty, ignore */
2111
- if (( uintptr_t ) zio .io_parent_list .list_head .list_next !=
2113
+ if (zio .io_parent_list .list_head .list_next !=
2112
2114
wsp -> walk_addr +
2113
2115
mdb_ctf_offsetof_by_name (ZFS_STRUCT "zio" , "io_parent_list" ) +
2114
2116
mdb_ctf_offsetof_by_name ("struct list" , "list_head" ))
@@ -2288,41 +2290,35 @@ zfs_blkstats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2288
2290
return (DCMD_OK );
2289
2291
}
2290
2292
2293
+ typedef struct mdb_reference {
2294
+ uintptr_t ref_holder ;
2295
+ uintptr_t ref_removed ;
2296
+ uint64_t ref_number ;
2297
+ } mdb_reference_t ;
2298
+
2291
2299
/* ARGSUSED */
2292
2300
static int
2293
2301
reference_cb (uintptr_t addr , const void * ignored , void * arg )
2294
2302
{
2295
- static int gotid ;
2296
- static mdb_ctf_id_t ref_id ;
2297
- uintptr_t ref_holder ;
2298
- uintptr_t ref_removed ;
2299
- uint64_t ref_number ;
2303
+ mdb_reference_t ref ;
2300
2304
boolean_t holder_is_str = B_FALSE ;
2301
2305
char holder_str [128 ];
2302
2306
boolean_t removed = (boolean_t )arg ;
2303
2307
2304
- if (!gotid ) {
2305
- if (mdb_ctf_lookup_by_name ("struct reference" , & ref_id ) == -1 ) {
2306
- mdb_warn ("couldn't find struct reference" );
2307
- return (WALK_ERR );
2308
- }
2309
- gotid = TRUE;
2310
- }
2311
-
2312
- if (GETMEMBID (addr , & ref_id , ref_holder , ref_holder ) ||
2313
- GETMEMBID (addr , & ref_id , ref_removed , ref_removed ) ||
2314
- GETMEMBID (addr , & ref_id , ref_number , ref_number ))
2315
- return (WALK_ERR );
2308
+ if (mdb_ctf_vread (& ref , "reference_t" , "mdb_reference_t" , addr ,
2309
+ 0 ) == -1 )
2310
+ return (DCMD_ERR );
2316
2311
2317
- if (mdb_readstr (holder_str , sizeof (holder_str ), ref_holder ) != -1 )
2312
+ if (mdb_readstr (holder_str , sizeof (holder_str ),
2313
+ ref .ref_holder ) != -1 )
2318
2314
holder_is_str = strisprint (holder_str );
2319
2315
2320
2316
if (removed )
2321
2317
mdb_printf ("removed " );
2322
2318
mdb_printf ("reference " );
2323
- if (ref_number != 1 )
2324
- mdb_printf ("with count=%llu " , ref_number );
2325
- mdb_printf ("with tag %p " , ( void * ) ref_holder );
2319
+ if (ref . ref_number != 1 )
2320
+ mdb_printf ("with count=%llu " , ref . ref_number );
2321
+ mdb_printf ("with tag %lx " , ref . ref_holder );
2326
2322
if (holder_is_str )
2327
2323
mdb_printf (" \"%s\"" , holder_str );
2328
2324
mdb_printf (", held at:\n" );
@@ -2331,7 +2327,7 @@ reference_cb(uintptr_t addr, const void *ignored, void *arg)
2331
2327
2332
2328
if (removed ) {
2333
2329
mdb_printf ("removed at:\n" );
2334
- (void ) mdb_call_dcmd ("whatis" , ref_removed ,
2330
+ (void ) mdb_call_dcmd ("whatis" , ref . ref_removed ,
2335
2331
DCMD_ADDRSPEC , 0 , NULL );
2336
2332
}
2337
2333
@@ -2340,15 +2336,26 @@ reference_cb(uintptr_t addr, const void *ignored, void *arg)
2340
2336
return (WALK_NEXT );
2341
2337
}
2342
2338
2339
+ typedef struct mdb_refcount {
2340
+ uint64_t rc_count ;
2341
+ } mdb_refcount_t ;
2342
+
2343
+ typedef struct mdb_refcount_removed {
2344
+ uint64_t rc_removed_count ;
2345
+ } mdb_refcount_removed_t ;
2346
+
2347
+ typedef struct mdb_refcount_tracked {
2348
+ boolean_t rc_tracked ;
2349
+ } mdb_refcount_tracked_t ;
2350
+
2343
2351
/* ARGSUSED */
2344
2352
static int
2345
2353
refcount (uintptr_t addr , uint_t flags , int argc , const mdb_arg_t * argv )
2346
2354
{
2347
- uint64_t rc_count , rc_removed_count ;
2348
- uintptr_t rc_list , rc_removed ;
2349
- static int gotid ;
2350
- static mdb_ctf_id_t rc_id ;
2351
- ulong_t off ;
2355
+ mdb_refcount_t rc ;
2356
+ mdb_refcount_removed_t rcr ;
2357
+ mdb_refcount_tracked_t rct ;
2358
+ int off ;
2352
2359
boolean_t released = B_FALSE ;
2353
2360
2354
2361
if (!(flags & DCMD_ADDRSPEC ))
@@ -2359,48 +2366,41 @@ refcount(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2359
2366
NULL ) != argc )
2360
2367
return (DCMD_USAGE );
2361
2368
2362
- if (!gotid ) {
2363
- /*
2364
- * The refcount structure is different when compiled debug
2365
- * vs nondebug. Therefore, we want to make sure we get the
2366
- * refcount definition from the ZFS module, in case it has
2367
- * been compiled debug but genunix is nondebug.
2368
- */
2369
- if (mdb_ctf_lookup_by_name (ZFS_STRUCT "refcount" ,
2370
- & rc_id ) == -1 ) {
2371
- mdb_warn ("couldn't find struct refcount" );
2372
- return (DCMD_ERR );
2373
- }
2374
- gotid = TRUE;
2375
- }
2376
-
2377
- if (GETMEMBID (addr , & rc_id , rc_count , rc_count ))
2369
+ if (mdb_ctf_vread (& rc , "refcount_t" , "mdb_refcount_t" , addr ,
2370
+ 0 ) == -1 )
2378
2371
return (DCMD_ERR );
2379
2372
2380
- if (GETMEMBID (addr , & rc_id , rc_removed_count , rc_removed_count )) {
2381
- mdb_printf ("refcount_t at %p has %llu current holds\n" ,
2382
- addr , (longlong_t )rc_count );
2373
+ if (mdb_ctf_vread (& rcr , "refcount_t" , "mdb_refcount_removed_t" , addr ,
2374
+ MDB_CTF_VREAD_QUIET ) == -1 ) {
2375
+ mdb_printf ("refcount_t at %p has %llu holds (untracked)\n" ,
2376
+ addr , (longlong_t )rc .rc_count );
2383
2377
return (DCMD_OK );
2384
2378
}
2385
2379
2380
+ if (mdb_ctf_vread (& rct , "refcount_t" , "mdb_refcount_tracked_t" , addr ,
2381
+ MDB_CTF_VREAD_QUIET ) == -1 ) {
2382
+ /* If this is an old target, it might be tracked. */
2383
+ rct .rc_tracked = B_TRUE ;
2384
+ }
2385
+
2386
2386
mdb_printf ("refcount_t at %p has %llu current holds, "
2387
2387
"%llu recently released holds\n" ,
2388
- addr , (longlong_t )rc_count , (longlong_t )rc_removed_count );
2388
+ addr , (longlong_t )rc . rc_count , (longlong_t )rcr . rc_removed_count );
2389
2389
2390
- if (rc_count > 0 )
2390
+ if (rct . rc_tracked && rc . rc_count > 0 )
2391
2391
mdb_printf ("current holds:\n" );
2392
- if (mdb_ctf_offsetof (rc_id , "rc_list" , & off ) == -1 )
2392
+ off = mdb_ctf_offsetof_by_name ("refcount_t" , "rc_list" );
2393
+ if (off == -1 )
2393
2394
return (DCMD_ERR );
2394
- rc_list = addr + off /NBBY ;
2395
- mdb_pwalk ("list" , reference_cb , (void * )B_FALSE , rc_list );
2395
+ mdb_pwalk ("list" , reference_cb , (void * )B_FALSE , addr + off );
2396
+
2397
+ if (released && rcr .rc_removed_count > 0 ) {
2398
+ mdb_printf ("released holds:\n" );
2396
2399
2397
- if (released ) {
2398
- if (rc_removed_count > 0 )
2399
- mdb_printf ("released holds:\n" );
2400
- if (mdb_ctf_offsetof (rc_id , "rc_removed" , & off ) == -1 )
2400
+ off = mdb_ctf_offsetof_by_name ("refcount_t" , "rc_removed" );
2401
+ if (off == -1 )
2401
2402
return (DCMD_ERR );
2402
- rc_removed = addr + off /NBBY ;
2403
- mdb_pwalk ("list" , reference_cb , (void * )B_TRUE , rc_removed );
2403
+ mdb_pwalk ("list" , reference_cb , (void * )B_FALSE , addr + off );
2404
2404
}
2405
2405
2406
2406
return (DCMD_OK );
@@ -3004,7 +3004,7 @@ zfs_aces_walk_step(mdb_walk_state_t *wsp)
3004
3004
}
3005
3005
3006
3006
typedef struct mdb_zfs_rrwlock {
3007
- kthread_t * rr_writer ;
3007
+ uintptr_t rr_writer ;
3008
3008
boolean_t rr_writer_wanted ;
3009
3009
} mdb_zfs_rrwlock_t ;
3010
3010
@@ -3025,8 +3025,8 @@ rrwlock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3025
3025
0 ) == -1 )
3026
3026
return (DCMD_ERR );
3027
3027
3028
- if (rrw .rr_writer != NULL ) {
3029
- mdb_printf ("write lock held by thread %p \n" , rrw .rr_writer );
3028
+ if (rrw .rr_writer != 0 ) {
3029
+ mdb_printf ("write lock held by thread %lx \n" , rrw .rr_writer );
3030
3030
return (DCMD_OK );
3031
3031
}
3032
3032
0 commit comments