Return bool from reset_alarm_* apis.
authorGodfrey van der Linden <gvdl@google.com>
Tue, 17 Feb 2015 22:02:35 +0000 (14:02 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 1 Mar 2015 14:30:44 +0000 (09:30 -0500)
commit7514affce9cc62b84b9c9a65896d08417c535f2e
treed9ad9cf935d2d03987bc16a254cdcaea8c2ed28b
parent2c1da78a8a549d4d10f1f127daa726a042172388
Return bool from reset_alarm_* apis.

In the presence of kernel pre-emption or multi-core scheduling leak free
clean up is a challenge. This idiom is the best I've found but it must
have support from the underlying apis.

Say a hot plugging device driver is dynamically unloadable and it has a
kreffed context and after a command completes we now have scheduled the
next I/O and have to reset the timeout alarm.

struct context {
bool is_active;  // Set to false on unloading
}

void start_next_io()
{
[snipped]

// Reschedule an alarm

// Always take a reference for the alarm function’s context
kref_get(context, 1);
if (reset_alarm_abs(...)) {
// We caught the alarm in time, i.e. the reference from the original
// set_awaiter_*  is still good, clear our reference.
kref_put(context);
}

[snipped]
}

void alarm_func(context)
{
 if (context->is_active) {  // Various atomic ops can go here
  // Do work referring to context
 }
 kref_put(context);  // Potentially releasing the context now
}
kern/include/alarm.h
kern/src/alarm.c