diff options
| -rw-r--r-- | kernel/trace/trace_mmiotrace.c | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index 0abd9b863474..7a9ba62e9fef 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c | |||
| @@ -59,17 +59,15 @@ static void mmio_trace_start(struct trace_array *tr) | |||
| 59 | mmio_reset_data(tr); | 59 | mmio_reset_data(tr); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static int mmio_print_pcidev(struct trace_seq *s, const struct pci_dev *dev) | 62 | static void mmio_print_pcidev(struct trace_seq *s, const struct pci_dev *dev) |
| 63 | { | 63 | { |
| 64 | int ret = 0; | ||
| 65 | int i; | 64 | int i; |
| 66 | resource_size_t start, end; | 65 | resource_size_t start, end; |
| 67 | const struct pci_driver *drv = pci_dev_driver(dev); | 66 | const struct pci_driver *drv = pci_dev_driver(dev); |
| 68 | 67 | ||
| 69 | /* XXX: incomplete checks for trace_seq_printf() return value */ | 68 | trace_seq_printf(s, "PCIDEV %02x%02x %04x%04x %x", |
| 70 | ret += trace_seq_printf(s, "PCIDEV %02x%02x %04x%04x %x", | 69 | dev->bus->number, dev->devfn, |
| 71 | dev->bus->number, dev->devfn, | 70 | dev->vendor, dev->device, dev->irq); |
| 72 | dev->vendor, dev->device, dev->irq); | ||
| 73 | /* | 71 | /* |
| 74 | * XXX: is pci_resource_to_user() appropriate, since we are | 72 | * XXX: is pci_resource_to_user() appropriate, since we are |
| 75 | * supposed to interpret the __ioremap() phys_addr argument based on | 73 | * supposed to interpret the __ioremap() phys_addr argument based on |
| @@ -77,21 +75,20 @@ static int mmio_print_pcidev(struct trace_seq *s, const struct pci_dev *dev) | |||
| 77 | */ | 75 | */ |
| 78 | for (i = 0; i < 7; i++) { | 76 | for (i = 0; i < 7; i++) { |
| 79 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); | 77 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); |
| 80 | ret += trace_seq_printf(s, " %llx", | 78 | trace_seq_printf(s, " %llx", |
| 81 | (unsigned long long)(start | | 79 | (unsigned long long)(start | |
| 82 | (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); | 80 | (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); |
| 83 | } | 81 | } |
| 84 | for (i = 0; i < 7; i++) { | 82 | for (i = 0; i < 7; i++) { |
| 85 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); | 83 | pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); |
| 86 | ret += trace_seq_printf(s, " %llx", | 84 | trace_seq_printf(s, " %llx", |
| 87 | dev->resource[i].start < dev->resource[i].end ? | 85 | dev->resource[i].start < dev->resource[i].end ? |
| 88 | (unsigned long long)(end - start) + 1 : 0); | 86 | (unsigned long long)(end - start) + 1 : 0); |
| 89 | } | 87 | } |
| 90 | if (drv) | 88 | if (drv) |
| 91 | ret += trace_seq_printf(s, " %s\n", drv->name); | 89 | trace_seq_printf(s, " %s\n", drv->name); |
| 92 | else | 90 | else |
| 93 | ret += trace_seq_puts(s, " \n"); | 91 | trace_seq_puts(s, " \n"); |
| 94 | return ret; | ||
| 95 | } | 92 | } |
| 96 | 93 | ||
| 97 | static void destroy_header_iter(struct header_iter *hiter) | 94 | static void destroy_header_iter(struct header_iter *hiter) |
| @@ -179,28 +176,27 @@ static enum print_line_t mmio_print_rw(struct trace_iterator *iter) | |||
| 179 | unsigned long long t = ns2usecs(iter->ts); | 176 | unsigned long long t = ns2usecs(iter->ts); |
| 180 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); | 177 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); |
| 181 | unsigned secs = (unsigned long)t; | 178 | unsigned secs = (unsigned long)t; |
| 182 | int ret = 1; | ||
| 183 | 179 | ||
| 184 | trace_assign_type(field, entry); | 180 | trace_assign_type(field, entry); |
| 185 | rw = &field->rw; | 181 | rw = &field->rw; |
| 186 | 182 | ||
| 187 | switch (rw->opcode) { | 183 | switch (rw->opcode) { |
| 188 | case MMIO_READ: | 184 | case MMIO_READ: |
| 189 | ret = trace_seq_printf(s, | 185 | trace_seq_printf(s, |
| 190 | "R %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", | 186 | "R %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", |
| 191 | rw->width, secs, usec_rem, rw->map_id, | 187 | rw->width, secs, usec_rem, rw->map_id, |
| 192 | (unsigned long long)rw->phys, | 188 | (unsigned long long)rw->phys, |
| 193 | rw->value, rw->pc, 0); | 189 | rw->value, rw->pc, 0); |
| 194 | break; | 190 | break; |
| 195 | case MMIO_WRITE: | 191 | case MMIO_WRITE: |
| 196 | ret = trace_seq_printf(s, | 192 | trace_seq_printf(s, |
| 197 | "W %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", | 193 | "W %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", |
| 198 | rw->width, secs, usec_rem, rw->map_id, | 194 | rw->width, secs, usec_rem, rw->map_id, |
| 199 | (unsigned long long)rw->phys, | 195 | (unsigned long long)rw->phys, |
| 200 | rw->value, rw->pc, 0); | 196 | rw->value, rw->pc, 0); |
| 201 | break; | 197 | break; |
| 202 | case MMIO_UNKNOWN_OP: | 198 | case MMIO_UNKNOWN_OP: |
| 203 | ret = trace_seq_printf(s, | 199 | trace_seq_printf(s, |
| 204 | "UNKNOWN %u.%06lu %d 0x%llx %02lx,%02lx," | 200 | "UNKNOWN %u.%06lu %d 0x%llx %02lx,%02lx," |
| 205 | "%02lx 0x%lx %d\n", | 201 | "%02lx 0x%lx %d\n", |
| 206 | secs, usec_rem, rw->map_id, | 202 | secs, usec_rem, rw->map_id, |
| @@ -209,12 +205,11 @@ static enum print_line_t mmio_print_rw(struct trace_iterator *iter) | |||
| 209 | (rw->value >> 0) & 0xff, rw->pc, 0); | 205 | (rw->value >> 0) & 0xff, rw->pc, 0); |
| 210 | break; | 206 | break; |
| 211 | default: | 207 | default: |
| 212 | ret = trace_seq_puts(s, "rw what?\n"); | 208 | trace_seq_puts(s, "rw what?\n"); |
| 213 | break; | 209 | break; |
| 214 | } | 210 | } |
| 215 | if (ret) | 211 | |
| 216 | return TRACE_TYPE_HANDLED; | 212 | return trace_handle_return(s); |
| 217 | return TRACE_TYPE_PARTIAL_LINE; | ||
| 218 | } | 213 | } |
| 219 | 214 | ||
| 220 | static enum print_line_t mmio_print_map(struct trace_iterator *iter) | 215 | static enum print_line_t mmio_print_map(struct trace_iterator *iter) |
| @@ -226,31 +221,29 @@ static enum print_line_t mmio_print_map(struct trace_iterator *iter) | |||
| 226 | unsigned long long t = ns2usecs(iter->ts); | 221 | unsigned long long t = ns2usecs(iter->ts); |
| 227 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); | 222 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); |
| 228 | unsigned secs = (unsigned long)t; | 223 | unsigned secs = (unsigned long)t; |
| 229 | int ret; | ||
| 230 | 224 | ||
| 231 | trace_assign_type(field, entry); | 225 | trace_assign_type(field, entry); |
| 232 | m = &field->map; | 226 | m = &field->map; |
| 233 | 227 | ||
| 234 | switch (m->opcode) { | 228 | switch (m->opcode) { |
| 235 | case MMIO_PROBE: | 229 | case MMIO_PROBE: |
| 236 | ret = trace_seq_printf(s, | 230 | trace_seq_printf(s, |
| 237 | "MAP %u.%06lu %d 0x%llx 0x%lx 0x%lx 0x%lx %d\n", | 231 | "MAP %u.%06lu %d 0x%llx 0x%lx 0x%lx 0x%lx %d\n", |
| 238 | secs, usec_rem, m->map_id, | 232 | secs, usec_rem, m->map_id, |
| 239 | (unsigned long long)m->phys, m->virt, m->len, | 233 | (unsigned long long)m->phys, m->virt, m->len, |
| 240 | 0UL, 0); | 234 | 0UL, 0); |
| 241 | break; | 235 | break; |
| 242 | case MMIO_UNPROBE: | 236 | case MMIO_UNPROBE: |
| 243 | ret = trace_seq_printf(s, | 237 | trace_seq_printf(s, |
| 244 | "UNMAP %u.%06lu %d 0x%lx %d\n", | 238 | "UNMAP %u.%06lu %d 0x%lx %d\n", |
| 245 | secs, usec_rem, m->map_id, 0UL, 0); | 239 | secs, usec_rem, m->map_id, 0UL, 0); |
| 246 | break; | 240 | break; |
| 247 | default: | 241 | default: |
| 248 | ret = trace_seq_puts(s, "map what?\n"); | 242 | trace_seq_puts(s, "map what?\n"); |
| 249 | break; | 243 | break; |
| 250 | } | 244 | } |
| 251 | if (ret) | 245 | |
| 252 | return TRACE_TYPE_HANDLED; | 246 | return trace_handle_return(s); |
| 253 | return TRACE_TYPE_PARTIAL_LINE; | ||
| 254 | } | 247 | } |
| 255 | 248 | ||
| 256 | static enum print_line_t mmio_print_mark(struct trace_iterator *iter) | 249 | static enum print_line_t mmio_print_mark(struct trace_iterator *iter) |
| @@ -262,14 +255,11 @@ static enum print_line_t mmio_print_mark(struct trace_iterator *iter) | |||
| 262 | unsigned long long t = ns2usecs(iter->ts); | 255 | unsigned long long t = ns2usecs(iter->ts); |
| 263 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); | 256 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); |
| 264 | unsigned secs = (unsigned long)t; | 257 | unsigned secs = (unsigned long)t; |
| 265 | int ret; | ||
| 266 | 258 | ||
| 267 | /* The trailing newline must be in the message. */ | 259 | /* The trailing newline must be in the message. */ |
| 268 | ret = trace_seq_printf(s, "MARK %u.%06lu %s", secs, usec_rem, msg); | 260 | trace_seq_printf(s, "MARK %u.%06lu %s", secs, usec_rem, msg); |
| 269 | if (!ret) | ||
| 270 | return TRACE_TYPE_PARTIAL_LINE; | ||
| 271 | 261 | ||
| 272 | return TRACE_TYPE_HANDLED; | 262 | return trace_handle_return(s); |
| 273 | } | 263 | } |
| 274 | 264 | ||
| 275 | static enum print_line_t mmio_print_line(struct trace_iterator *iter) | 265 | static enum print_line_t mmio_print_line(struct trace_iterator *iter) |
