qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

qapi: add trace events for visitor

Allow tracing of the operation of visitors

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1475246744-29302-4-git-send-email-berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[visit_type_uint8() & friends rearranged slightly for clarity]
Signed-off-by: Markus Armbruster <armbru@redhat.com>

authored by

Daniel P. Berrange and committed by
Markus Armbruster
ebfd93b6 6235b9cd

+79 -6
+1
Makefile.objs
··· 162 162 trace-events-y += target-ppc/trace-events 163 163 trace-events-y += qom/trace-events 164 164 trace-events-y += linux-user/trace-events 165 + trace-events-y += qapi/trace-events
+45 -6
qapi/qapi-visit-core.c
··· 19 19 #include "qapi/qmp/qerror.h" 20 20 #include "qapi/visitor.h" 21 21 #include "qapi/visitor-impl.h" 22 + #include "trace.h" 22 23 23 24 void visit_complete(Visitor *v, void *opaque) 24 25 { 25 26 assert(v->type != VISITOR_OUTPUT || v->complete); 27 + trace_visit_complete(v, opaque); 26 28 if (v->complete) { 27 29 v->complete(v, opaque); 28 30 } ··· 30 32 31 33 void visit_free(Visitor *v) 32 34 { 35 + trace_visit_free(v); 33 36 if (v) { 34 37 v->free(v); 35 38 } ··· 40 43 { 41 44 Error *err = NULL; 42 45 46 + trace_visit_start_struct(v, name, obj, size); 43 47 if (obj) { 44 48 assert(size); 45 49 assert(!(v->type & VISITOR_OUTPUT) || *obj); ··· 53 57 54 58 void visit_check_struct(Visitor *v, Error **errp) 55 59 { 60 + trace_visit_check_struct(v); 56 61 if (v->check_struct) { 57 62 v->check_struct(v, errp); 58 63 } ··· 60 65 61 66 void visit_end_struct(Visitor *v, void **obj) 62 67 { 68 + trace_visit_end_struct(v, obj); 63 69 v->end_struct(v, obj); 64 70 } 65 71 ··· 69 75 Error *err = NULL; 70 76 71 77 assert(!list || size >= sizeof(GenericList)); 78 + trace_visit_start_list(v, name, list, size); 72 79 v->start_list(v, name, list, size, &err); 73 80 if (list && (v->type & VISITOR_INPUT)) { 74 81 assert(!(err && *list)); ··· 79 86 GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size) 80 87 { 81 88 assert(tail && size >= sizeof(GenericList)); 89 + trace_visit_next_list(v, tail, size); 82 90 return v->next_list(v, tail, size); 83 91 } 84 92 85 93 void visit_end_list(Visitor *v, void **obj) 86 94 { 95 + trace_visit_end_list(v, obj); 87 96 v->end_list(v, obj); 88 97 } 89 98 ··· 95 104 96 105 assert(obj && size >= sizeof(GenericAlternate)); 97 106 assert(!(v->type & VISITOR_OUTPUT) || *obj); 107 + trace_visit_start_alternate(v, name, obj, size, promote_int); 98 108 if (v->start_alternate) { 99 109 v->start_alternate(v, name, obj, size, promote_int, &err); 100 110 } ··· 106 116 107 117 void visit_end_alternate(Visitor *v, void **obj) 108 118 { 119 + trace_visit_end_alternate(v, obj); 109 120 if (v->end_alternate) { 110 121 v->end_alternate(v, obj); 111 122 } ··· 113 124 114 125 bool visit_optional(Visitor *v, const char *name, bool *present) 115 126 { 127 + trace_visit_optional(v, name, present); 116 128 if (v->optional) { 117 129 v->optional(v, name, present); 118 130 } ··· 127 139 void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp) 128 140 { 129 141 assert(obj); 142 + trace_visit_type_int(v, name, obj); 130 143 v->type_int64(v, name, obj, errp); 131 144 } 132 145 ··· 150 163 void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, 151 164 Error **errp) 152 165 { 153 - uint64_t value = *obj; 166 + uint64_t value; 167 + 168 + trace_visit_type_uint8(v, name, obj); 169 + value = *obj; 154 170 visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp); 155 171 *obj = value; 156 172 } ··· 158 174 void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, 159 175 Error **errp) 160 176 { 161 - uint64_t value = *obj; 177 + uint64_t value; 178 + 179 + trace_visit_type_uint16(v, name, obj); 180 + value = *obj; 162 181 visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp); 163 182 *obj = value; 164 183 } ··· 166 185 void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, 167 186 Error **errp) 168 187 { 169 - uint64_t value = *obj; 188 + uint64_t value; 189 + 190 + trace_visit_type_uint32(v, name, obj); 191 + value = *obj; 170 192 visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp); 171 193 *obj = value; 172 194 } ··· 175 197 Error **errp) 176 198 { 177 199 assert(obj); 200 + trace_visit_type_uint64(v, name, obj); 178 201 v->type_uint64(v, name, obj, errp); 179 202 } 180 203 ··· 198 221 199 222 void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp) 200 223 { 201 - int64_t value = *obj; 224 + int64_t value; 225 + 226 + trace_visit_type_int8(v, name, obj); 227 + value = *obj; 202 228 visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", errp); 203 229 *obj = value; 204 230 } ··· 206 232 void visit_type_int16(Visitor *v, const char *name, int16_t *obj, 207 233 Error **errp) 208 234 { 209 - int64_t value = *obj; 235 + int64_t value; 236 + 237 + trace_visit_type_int16(v, name, obj); 238 + value = *obj; 210 239 visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t", errp); 211 240 *obj = value; 212 241 } ··· 214 243 void visit_type_int32(Visitor *v, const char *name, int32_t *obj, 215 244 Error **errp) 216 245 { 217 - int64_t value = *obj; 246 + int64_t value; 247 + 248 + trace_visit_type_int32(v, name, obj); 249 + value = *obj; 218 250 visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t", errp); 219 251 *obj = value; 220 252 } ··· 223 255 Error **errp) 224 256 { 225 257 assert(obj); 258 + trace_visit_type_int64(v, name, obj); 226 259 v->type_int64(v, name, obj, errp); 227 260 } 228 261 ··· 230 263 Error **errp) 231 264 { 232 265 assert(obj); 266 + trace_visit_type_size(v, name, obj); 233 267 if (v->type_size) { 234 268 v->type_size(v, name, obj, errp); 235 269 } else { ··· 240 274 void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) 241 275 { 242 276 assert(obj); 277 + trace_visit_type_bool(v, name, obj); 243 278 v->type_bool(v, name, obj, errp); 244 279 } 245 280 ··· 252 287 * can enable: 253 288 assert(!(v->type & VISITOR_OUTPUT) || *obj); 254 289 */ 290 + trace_visit_type_str(v, name, obj); 255 291 v->type_str(v, name, obj, &err); 256 292 if (v->type & VISITOR_INPUT) { 257 293 assert(!err != !*obj); ··· 263 299 Error **errp) 264 300 { 265 301 assert(obj); 302 + trace_visit_type_number(v, name, obj); 266 303 v->type_number(v, name, obj, errp); 267 304 } 268 305 ··· 272 309 273 310 assert(obj); 274 311 assert(v->type != VISITOR_OUTPUT || *obj); 312 + trace_visit_type_any(v, name, obj); 275 313 v->type_any(v, name, obj, &err); 276 314 if (v->type == VISITOR_INPUT) { 277 315 assert(!err != !*obj); ··· 281 319 282 320 void visit_type_null(Visitor *v, const char *name, Error **errp) 283 321 { 322 + trace_visit_type_null(v, name); 284 323 v->type_null(v, name, errp); 285 324 } 286 325
+33
qapi/trace-events
··· 1 + # qapi-visit-core.c 2 + visit_free(void *v) "v=%p" 3 + visit_complete(void *v, void *opaque) "v=%p opaque=%p" 4 + 5 + visit_start_struct(void *v, const char *name, void *obj, size_t size) "v=%p name=%s obj=%p size=%zu" 6 + visit_check_struct(void *v) "v=%p" 7 + visit_end_struct(void *v, void *obj) "v=%p obj=%p" 8 + 9 + visit_start_list(void *v, const char *name, void *obj, size_t size) "v=%p name=%s obj=%p size=%zu" 10 + visit_next_list(void *v, void *tail, size_t size) "v=%p tail=%p size=%zu" 11 + visit_end_list(void *v, void *obj) "v=%p obj=%p" 12 + 13 + visit_start_alternate(void *v, const char *name, void *obj, size_t size, bool promote_int) "v=%p name=%s obj=%p size=%zu promote_int=%d" 14 + visit_end_alternate(void *v, void *obj) "v=%p obj=%p" 15 + 16 + visit_optional(void *v, const char *name, bool *present) "v=%p name=%s present=%p" 17 + 18 + visit_type_enum(void *v, const char *name, int *obj) "v=%p name=%s obj=%p" 19 + visit_type_int(void *v, const char *name, int64_t *obj) "v=%p name=%s obj=%p" 20 + visit_type_uint8(void *v, const char *name, uint8_t *obj) "v=%p name=%s obj=%p" 21 + visit_type_uint16(void *v, const char *name, uint16_t *obj) "v=%p name=%s obj=%p" 22 + visit_type_uint32(void *v, const char *name, uint32_t *obj) "v=%p name=%s obj=%p" 23 + visit_type_uint64(void *v, const char *name, uint64_t *obj) "v=%p name=%s obj=%p" 24 + visit_type_int8(void *v, const char *name, int8_t *obj) "v=%p name=%s obj=%p" 25 + visit_type_int16(void *v, const char *name, int16_t *obj) "v=%p name=%s obj=%p" 26 + visit_type_int32(void *v, const char *name, int32_t *obj) "v=%p name=%s obj=%p" 27 + visit_type_int64(void *v, const char *name, int64_t *obj) "v=%p name=%s obj=%p" 28 + visit_type_size(void *v, const char *name, uint64_t *obj) "v=%p name=%s obj=%p" 29 + visit_type_bool(void *v, const char *name, bool *obj) "v=%p name=%s obj=%p" 30 + visit_type_str(void *v, const char *name, char **obj) "v=%p name=%s obj=%p" 31 + visit_type_number(void *v, const char *name, double *obj) "v=%p name=%s obj=%p" 32 + visit_type_any(void *v, const char *name, void *obj) "v=%p name=%s obj=%p" 33 + visit_type_null(void *v, const char *name) "v=%p name=%s"