Halting a Non Global Zone (NGZ) Hangs the zone_destroy() System Call on Solaris 10

(Doc ID 1401915.1)

Last updated on JULY 29, 2016

Applies to:

Solaris Operating System - Version 10 3/05 to 10 8/11 U10 [Release 10.0]
Information in this document applies to any platform.


On Solaris 10 systems without 147440-05/147441-05, the "zoneadm halt" command can can hang and a non-global zone cannot be halted.

When the problem happens, a thread of zoneadmd is waiting zone_destroy().

> ::pgrep zoneadmd
S    PID   PPID   PGID    SID    UID      FLAGS             ADDR NAME
R   5200      1   5200   5200      0 0x42000000 ffffffff8d3e2918 zoneadmd

> ffffffff8d3e2918::walk thread | ::findstack
stack pointer for thread ffffffff8ebc33c0: fffffe80009a5cf0
[ fffffe80009a5cf0 _resume_from_idle+0xf8() ]
  fffffe80009a5d20 swtch+0x135()
  fffffe80009a5d70 cv_wait_sig+0x15c()
  fffffe80009a5db0 zone_destroy+0x134()
  fffffe80009a5ec0 zone+0x164()
  fffffe80009a5f10 _sys_sysenter_post_swapgs+0x14b()


The process that actually changes the zone's state is not zoneadm command but zoneadmd daemon.

Though the non-global zone's status is DEAD, its reference count is not 1. The reason of hang is that zone_destroy() has been waiting for zone_ref to drop to 1 indefinitely.

> ::zone
            ADDR     ID NAME                 PATH
fffffffffbcd5660      0 global               /
ffffffff8ed67340      2 zone0                /zones/zone0/root/

> ffffffff8ed67340::print zone_t zone_status zone_ref
zone_status = 9 (ZONE_IS_DEAD)
zone_ref = 0x4


Sign In with your My Oracle Support account

Don't have a My Oracle Support account? Click to get started

My Oracle Support provides customers with access to over a
Million Knowledge Articles and hundreds of Community platforms