paddr_guest2host() returns NULL when a range does not fit within guest
RAM. An unmappable queue address previously left the queue marked
allocated with ring pointers computed from the failed mapping. Check
the legacy virtqueue ring mapping and indirect descriptor table mapping
before dereferencing them, and ignore notifications for unallocated
queues. Treat a zero PFN as a queue disable, leave an invalid queue
unallocated, and return an error for an unmappable indirect descriptor
table.
Also check queue readiness in the virtio-net RX path, which can be
reached from the backend rather than from a notification, including
after snapshot restore. Disable backend RX notifications until the
queue is ready to avoid repeatedly handling unread packets.
Sponsored by: The FreeBSD Foundation