|
Description
|
To reproduce this, follow the sample configuration:
1. pooladm -e
2. Configure a pool p1, with a pset pset1, which contains two cpus.
3. Configure a zone zone1, in zonecfg, set pool=pool1
4. Boot the zone, the zone will use cpu0 and cpu1.
5. psradm -f 0
6. pooladm -d
The system will crash with:
panic[cpu2]/thread=ffffff01e75ed040:
assertion failed: t != 0L, file: ../../common/os/kstat_fr.c, line: 278
ffffff00085ab870 genunix:assfail+7e ()
ffffff00085ab8b0 unix:kstat_zone_remove+d3 ()
ffffff00085ab8f0 unix:cpu_visibility_unconfigure+79 ()
ffffff00085ab920 unix:cpu_visibility_remove+39 ()
ffffff00085ab970 genunix:pool_pset_visibility_change+b7 ()
ffffff00085ab990 genunix:pool_pset_visibility_remove+17 ()
ffffff00085ab9d0 genunix:zone_pset_set+60 ()
ffffff00085aba00 genunix:pool_pset_zone_pset_set+35 ()
ffffff00085aba50 genunix:zone_walk+5e ()
ffffff00085aba70 genunix:pool_pset_disable+a8 ()
ffffff00085aba90 genunix:pool_disable+28 ()
ffffff00085abac0 genunix:pool_status+29 ()
ffffff00085abcc0 pool:pool_ioctl+ddf ()
ffffff00085abd00 genunix:cdev_ioctl+48 ()
ffffff00085abd40 specfs:spec_ioctl+86 ()
ffffff00085abdb0 genunix:fop_ioctl+6e ()
ffffff00085abeb0 genunix:ioctl+16b ()
ffffff00085abf00 unix:brand_sys_syscall32+29e ()
The assertion failed because for ekstat_t of cpu_info0, it's e_zone.next is 0,
that is, nothing was removed.
The root cause is when doing pool_destroy operation, cpupart_move_cpu() is called
for all online cpus, while for offline cpus, only the cpu_part is set to &cp_default.
and it's in cpupart_move_cpu() that the running zone will be added to online cpus'
cpu_info kstat, since offline cpus' don't do this, assertion fails.
kstat.
|