first step towards enforcing must-succeed semantics for bus accessors
Unlike BUS_READ_IVAR / BUS_WRITE_IVAR, bus accessors do not have a return code. It is assumed that there is a tight coupling between a bus driver and a driver for a device on the bus with respect to instance variables that the bus defines for its children. So, the driver is supposed to have only valid accesses to the variables and, thus, the accessors must always succeed. Of course, programming errors sometimes happen. At present, such errors go completely unnoticed. The idea of this change is to start catching them. As a first step, there will be a warning about a failed accessor call. This is to give developers a heads-up. I plan to replace the printf with a KASSERT a week later, so that the warning is harder to ignore. Reviewed by: cem, imp, ian MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D20458
This commit is contained in:
parent
56db4ebd34
commit
2b1d0ab2f6
@ -810,16 +810,30 @@ DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \
|
||||
static __inline type varp ## _get_ ## var(device_t dev) \
|
||||
{ \
|
||||
uintptr_t v; \
|
||||
BUS_READ_IVAR(device_get_parent(dev), dev, \
|
||||
int e; \
|
||||
e = BUS_READ_IVAR(device_get_parent(dev), dev, \
|
||||
ivarp ## _IVAR_ ## ivar, &v); \
|
||||
if (e != 0) { \
|
||||
device_printf(dev, "failed to read ivar " \
|
||||
__XSTRING(ivarp ## _IVAR_ ## ivar) " on bus %s, " \
|
||||
"error = %d\n", \
|
||||
device_get_nameunit(device_get_parent(dev)), e); \
|
||||
} \
|
||||
return ((type) v); \
|
||||
} \
|
||||
\
|
||||
static __inline void varp ## _set_ ## var(device_t dev, type t) \
|
||||
{ \
|
||||
uintptr_t v = (uintptr_t) t; \
|
||||
BUS_WRITE_IVAR(device_get_parent(dev), dev, \
|
||||
int e; \
|
||||
e = BUS_WRITE_IVAR(device_get_parent(dev), dev, \
|
||||
ivarp ## _IVAR_ ## ivar, v); \
|
||||
if (e != 0) { \
|
||||
device_printf(dev, "failed to write ivar " \
|
||||
__XSTRING(ivarp ## _IVAR_ ## ivar) " on bus %s, " \
|
||||
"error = %d\n", \
|
||||
device_get_nameunit(device_get_parent(dev)), e); \
|
||||
} \
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user