1. A method, comprising: maintaining a hierarchical packet scheduler, wherein the hierarchical packet scheduler includes one or more levels, each level including one or more schedulers, wherein each scheduler includes at least one buffer, each buffer including a head entry and a tail entry, each of the head entry and of the tail entry capable of storing a packet reference, wherein one or more threads serve each level, wherein each of the one or more threads is dedicated to a single level; and performing scheduling operations at each scheduler of the hierarchical packet scheduler by reading a portion of scheduler state from external memory, wherein reading the portion of scheduler state includes reading the head entry or the tail entry, wherein performing scheduling operations includes performing hole-filling operations by a hole-filling thread, wherein hole-filling operations comprise: removing a packet reference from a child scheduler of a parent scheduler, wherein the removed packet reference is the minimum tag reference packet from among the packet references in the head entries of buffers of the child scheduler; sliding another packet reference from a tail entry to a head entry of a buffer of the parent scheduler; and inserting the packet reference into the tail entry of the parent scheduler.