diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-07-12 17:16:22 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-07-16 07:04:33 -0400 |
commit | 83292e0a9c3f1c326b28fbf8cb70a8ce81a98163 (patch) | |
tree | 38794e806ba5fe8d10234c5c24a4efa22180c05c /include | |
parent | 43fdf27470b216ebdef47e09ff83bed2f2894b13 (diff) |
[SPARC64]: Fix MD property lifetime bugs.
Property values cannot be referenced outside of
mdesc_grab()/mdesc_release() pairs. The only major
offender was the VIO bus layer, easily fixed.
Add some commentary to mdesc.h describing these rules.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-sparc64/mdesc.h | 22 | ||||
-rw-r--r-- | include/asm-sparc64/vio.h | 7 |
2 files changed, 25 insertions, 4 deletions
diff --git a/include/asm-sparc64/mdesc.h b/include/asm-sparc64/mdesc.h index bbb0c0bed486..dc372df23fb3 100644 --- a/include/asm-sparc64/mdesc.h +++ b/include/asm-sparc64/mdesc.h | |||
@@ -23,8 +23,28 @@ extern u64 mdesc_node_by_name(struct mdesc_handle *handle, | |||
23 | (__node) != MDESC_NODE_NULL; \ | 23 | (__node) != MDESC_NODE_NULL; \ |
24 | __node = mdesc_node_by_name(__hdl, __node, __name)) | 24 | __node = mdesc_node_by_name(__hdl, __node, __name)) |
25 | 25 | ||
26 | /* Access to property values returned from mdesc_get_property() are | ||
27 | * only valid inside of a mdesc_grab()/mdesc_release() sequence. | ||
28 | * Once mdesc_release() is called, the memory backed up by these | ||
29 | * pointers may reference freed up memory. | ||
30 | * | ||
31 | * Therefore callers must make copies of any property values | ||
32 | * they need. | ||
33 | * | ||
34 | * These same rules apply to mdesc_node_name(). | ||
35 | */ | ||
26 | extern const void *mdesc_get_property(struct mdesc_handle *handle, | 36 | extern const void *mdesc_get_property(struct mdesc_handle *handle, |
27 | u64 node, const char *name, int *lenp); | 37 | u64 node, const char *name, int *lenp); |
38 | extern const char *mdesc_node_name(struct mdesc_handle *hp, u64 node); | ||
39 | |||
40 | /* MD arc iteration, the standard sequence is: | ||
41 | * | ||
42 | * unsigned long arc; | ||
43 | * mdesc_for_each_arc(arc, handle, node, MDESC_ARC_TYPE_{FWD,BACK}) { | ||
44 | * unsigned long target = mdesc_arc_target(handle, arc); | ||
45 | * ... | ||
46 | * } | ||
47 | */ | ||
28 | 48 | ||
29 | #define MDESC_ARC_TYPE_FWD "fwd" | 49 | #define MDESC_ARC_TYPE_FWD "fwd" |
30 | #define MDESC_ARC_TYPE_BACK "back" | 50 | #define MDESC_ARC_TYPE_BACK "back" |
@@ -38,8 +58,6 @@ extern u64 mdesc_next_arc(struct mdesc_handle *handle, u64 from, | |||
38 | 58 | ||
39 | extern u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc); | 59 | extern u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc); |
40 | 60 | ||
41 | extern const char *mdesc_node_name(struct mdesc_handle *hp, u64 node); | ||
42 | |||
43 | extern void mdesc_update(void); | 61 | extern void mdesc_update(void); |
44 | 62 | ||
45 | extern void sun4v_mdesc_init(void); | 63 | extern void sun4v_mdesc_init(void); |
diff --git a/include/asm-sparc64/vio.h b/include/asm-sparc64/vio.h index a8a53e6fc250..83c96422e9d6 100644 --- a/include/asm-sparc64/vio.h +++ b/include/asm-sparc64/vio.h | |||
@@ -264,12 +264,15 @@ static inline u32 vio_dring_avail(struct vio_dring_state *dr, | |||
264 | ((dr->prod - dr->cons) & (ring_size - 1))); | 264 | ((dr->prod - dr->cons) & (ring_size - 1))); |
265 | } | 265 | } |
266 | 266 | ||
267 | #define VIO_MAX_TYPE_LEN 64 | ||
268 | #define VIO_MAX_COMPAT_LEN 64 | ||
269 | |||
267 | struct vio_dev { | 270 | struct vio_dev { |
268 | u64 mp; | 271 | u64 mp; |
269 | struct device_node *dp; | 272 | struct device_node *dp; |
270 | 273 | ||
271 | const char *type; | 274 | char type[VIO_MAX_TYPE_LEN]; |
272 | const char *compat; | 275 | char compat[VIO_MAX_COMPAT_LEN]; |
273 | int compat_len; | 276 | int compat_len; |
274 | 277 | ||
275 | unsigned long channel_id; | 278 | unsigned long channel_id; |