Release a dead process's device claims (M17.1)
Every path out of a process (exit, fault, kill) now releases its device claims alongside its IRQ and MSI bindings, so a restarted driver can claim its hardware again — the cleanup half of process-lifecycle.md's iron rule 1. MSI vectors were already swept by irq.releaseOwner; claims were the gap. The claim-release test proves kill -> release -> re-claim, plus the broker release in isolation.
This commit is contained in:
@@ -552,7 +552,11 @@ pub var fault_kill_count: u64 = 0;
|
||||
/// endpoint reference destroys the Endpoint, and a still-bound GSI would have an
|
||||
/// ISR call notifyFromIsr on freed memory the next time the device fired.
|
||||
/// `releaseOwner` also leaves the line masked, so a dead driver's device goes
|
||||
/// quiet rather than storming.
|
||||
/// quiet rather than storming. (It drops MSI vectors by the same owner sweep.)
|
||||
/// - Device claims are released with the IRQ bindings, so a restarted driver can
|
||||
/// claim the same hardware again — the cleanup half of process-lifecycle.md's
|
||||
/// iron rule 1. Claims hold no pointers, so ordering is free; they go here so
|
||||
/// the exit notification (below, last) observes a fully-released child.
|
||||
/// - A client this task still owes a reply to (it died between receive and reply)
|
||||
/// is failed with -EPEER rather than left blocked forever — a dead server must
|
||||
/// not hang its callers.
|
||||
@@ -566,6 +570,7 @@ pub var fault_kill_count: u64 = 0;
|
||||
/// Precondition: the big kernel lock is held.
|
||||
fn releaseTaskResourcesLocked(t: *scheduler.Task) void {
|
||||
irq.releaseOwner(t.id);
|
||||
devices_broker.releaseAllOwnedBy(t.id);
|
||||
if (t.ipc_client) |client| {
|
||||
t.ipc_client = null;
|
||||
client.ipc_status = -ipc.EPEER;
|
||||
|
||||
Reference in New Issue
Block a user