| @@ -27,6 +27,7 @@ · 26 unmodified lines |
| 27 | #include <linux/cpu.h> | 27 | #include <linux/cpu.h> |
| 28 | #include <linux/oom.h> | 28 | #include <linux/oom.h> |
| 29 | | 29 | |
| | 30 | #include <asm/local64.h> |
| 30 | #include <asm/local.h> | 31 | #include <asm/local.h> |
| 31 | | 32 | |
| 32 | /* | 33 | /* |
| @@ -317,6 +318,11 @@ struct buffer_data_page { · 284 unmodified lines |
| 317 | unsigned char data[] RB_ALIGN_DATA; /* data of buffer page */ | 318 | unsigned char data[] RB_ALIGN_DATA; /* data of buffer page */ |
| 318 | }; | 319 | }; |
| 319 | | 320 | |
| | 321 | struct buffer_data_read_page { |
| | 322 | unsigned order; /* order of the page */ |
| | 323 | struct buffer_data_page *data; /* actual data, stored in this page */ |
| | 324 | }; |
| | 325 | |
| 320 | /* | 326 | /* |
| 321 | * Note, the buffer_page list must be first. The buffer pages | 327 | * Note, the buffer_page list must be first. The buffer pages |
| 322 | * are allocated in cache lines, which means that each buffer | 328 | * are allocated in cache lines, which means that each buffer |
| @@ -331,6 +337,7 @@ struct buffer_page { · 8 unmodified lines |
| 331 | unsigned read; /* index for next read */ | 337 | unsigned read; /* index for next read */ |
| 332 | local_t entries; /* entries on this page */ | 338 | local_t entries; /* entries on this page */ |
| 333 | unsigned long real_end; /* real end of data */ | 339 | unsigned long real_end; /* real end of data */ |
| | 340 | unsigned order; /* order of the page */ |
| 334 | struct buffer_data_page *page; /* Actual data page */ | 341 | struct buffer_data_page *page; /* Actual data page */ |
| 335 | }; | 342 | }; |
| 336 | | 343 | |
| @@ -361,7 +368,7 @@ static __always_inline unsigned int rb_page_commit(struct buffer_page *bpage) · 24 unmodified lines |
| 361 | | 368 | |
| 362 | static void free_buffer_page(struct buffer_page *bpage) | 369 | static void free_buffer_page(struct buffer_page *bpage) |
| 363 | { | 370 | { |
| 364 | free_page((unsigned long)bpage->page); | 371 | free_pages((unsigned long)bpage->page, bpage->order); |
| 365 | kfree(bpage); | 372 | kfree(bpage); |
| 366 | } | 373 | } |
| 367 | | 374 | |
| @@ -373,41 +380,6 @@ static inline bool test_time_stamp(u64 delta) · 5 unmodified lines |
| 373 | return !!(delta & TS_DELTA_TEST); | 380 | return !!(delta & TS_DELTA_TEST); |
| 374 | } | 381 | } |
| 375 | | 382 | |
| 376 | #define BUF_PAGE_SIZE (PAGE_SIZE - BUF_PAGE_HDR_SIZE) | | |
| 377 | | | |
| 378 | /* Max payload is BUF_PAGE_SIZE - header (8bytes) */ | | |
| 379 | #define BUF_MAX_DATA_SIZE (BUF_PAGE_SIZE - (sizeof(u32) * 2)) | | |
| 380 | | | |
| 381 | int ring_buffer_print_page_header(struct trace_seq *s) | | |
| 382 | { | | |
| 383 | struct buffer_data_page field; | | |
| 384 | | | |
| 385 | trace_seq_printf(s, "\tfield: u64 timestamp;\t" | | |
| 386 | "offset:0;\tsize:%u;\tsigned:%u;\n", | | |
| 387 | (unsigned int)sizeof(field.time_stamp), | | |
| 388 | (unsigned int)is_signed_type(u64)); | | |
| 389 | | | |
| 390 | trace_seq_printf(s, "\tfield: local_t commit;\t" | | |
| 391 | "offset:%u;\tsize:%u;\tsigned:%u;\n", | | |
| 392 | (unsigned int)offsetof(typeof(field), commit), | | |
| 393 | (unsigned int)sizeof(field.commit), | | |
| 394 | (unsigned int)is_signed_type(long)); | | |
| 395 | | | |
| 396 | trace_seq_printf(s, "\tfield: int overwrite;\t" | | |
| 397 | "offset:%u;\tsize:%u;\tsigned:%u;\n", | | |
| 398 | (unsigned int)offsetof(typeof(field), commit), | | |
| 399 | 1, | | |
| 400 | (unsigned int)is_signed_type(long)); | | |
| 401 | | | |
| 402 | trace_seq_printf(s, "\tfield: char data;\t" | | |
| 403 | "offset:%u;\tsize:%u;\tsigned:%u;\n", | | |
| 404 | (unsigned int)offsetof(typeof(field), data), | | |
| 405 | (unsigned int)BUF_PAGE_SIZE, | | |
| 406 | (unsigned int)is_signed_type(char)); | | |
| 407 | | | |
| 408 | return !trace_seq_has_overflowed(s); | | |
| 409 | } | | |
| 410 | | | |
| 411 | struct rb_irq_work { | 383 | struct rb_irq_work { |
| 412 | struct irq_work work; | 384 | struct irq_work work; |
| 413 | wait_queue_head_t waiters; | 385 | wait_queue_head_t waiters; |
| @@ -463,27 +435,9 @@ enum { · 49 unmodified lines |
| 463 | RB_CTX_MAX | 435 | RB_CTX_MAX |
| 464 | }; | 436 | }; |
| 465 | | 437 | |
| 466 | #if BITS_PER_LONG == 32 | | |
| 467 | #define RB_TIME_32 | | |
| 468 | #endif | | |
| 469 | | | |
| 470 | /* To test on 64 bit machines */ | | |
| 471 | //#define RB_TIME_32 | | |
| 472 | | | |
| 473 | #ifdef RB_TIME_32 | | |
| 474 | | | |
| 475 | struct rb_time_struct { | | |
| 476 | local_t cnt; | | |
| 477 | local_t top; | | |
| 478 | local_t bottom; | | |
| 479 | local_t msb; | | |
| 480 | }; | | |
| 481 | #else | | |
| 482 | #include <asm/local64.h> | | |
| 483 | struct rb_time_struct { | 438 | struct rb_time_struct { |
| 484 | local64_t time; | 439 | local64_t time; |
| 485 | }; | 440 | }; |
| 486 | #endif | | |
| 487 | typedef struct rb_time_struct rb_time_t; | 441 | typedef struct rb_time_struct rb_time_t; |
| 488 | | 442 | |
| 489 | #define MAX_NEST 5 | 443 | #define MAX_NEST 5 |
| @@ -557,6 +511,10 @@ struct trace_buffer { · 67 unmodified lines |
| 557 | | 511 | |
| 558 | struct rb_irq_work irq_work; | 512 | struct rb_irq_work irq_work; |
| 559 | bool time_stamp_abs; | 513 | bool time_stamp_abs; |
| | 514 | |
| | 515 | unsigned int subbuf_size; |
| | 516 | unsigned int subbuf_order; |
| | 517 | unsigned int max_data_size; |
| 560 | }; | 518 | }; |
| 561 | | 519 | |
| 562 | struct ring_buffer_iter { | 520 | struct ring_buffer_iter { |
| @@ -570,150 +528,48 @@ struct ring_buffer_iter { · 7 unmodified lines |
| 570 | u64 read_stamp; | 528 | u64 read_stamp; |
| 571 | u64 page_stamp; | 529 | u64 page_stamp; |
| 572 | struct ring_buffer_event *event; | 530 | struct ring_buffer_event *event; |
| | 531 | size_t event_size; |
| 573 | int missed_events; | 532 | int missed_events; |
| 574 | }; | 533 | }; |
| 575 | | 534 | |
| 576 | #ifdef RB_TIME_32 | 535 | int ring_buffer_print_page_header(struct trace_buffer *buffer, struct trace_seq *s) |
| 577 | | | |
| 578 | /* | | |
| 579 | * On 32 bit machines, local64_t is very expensive. As the ring | | |
| 580 | * buffer doesn't need all the features of a true 64 bit atomic, | | |
| 581 | * on 32 bit, it uses these functions (64 still uses local64_t). | | |
| 582 | * | | |
| 583 | * For the ring buffer, 64 bit required operations for the time is | | |
| 584 | * the following: | | |
| 585 | * | | |
| 586 | * - Reads may fail if it interrupted a modification of the time stamp. | | |
| 587 | * It will succeed if it did not interrupt another write even if | | |
| 588 | * the read itself is interrupted by a write. | | |
| 589 | * It returns whether it was successful or not. | | |
| 590 | * | | |
| 591 | * - Writes always succeed and will overwrite other writes and writes | | |
| 592 | * that were done by events interrupting the current write. | | |
| 593 | * | | |
| 594 | * - A write followed by a read of the same time stamp will always succeed, | | |
| 595 | * but may not contain the same value. | | |
| 596 | * | | |
| 597 | * - A cmpxchg will fail if it interrupted another write or cmpxchg. | | |
| 598 | * Other than that, it acts like a normal cmpxchg. | | |
| 599 | * | | |
| 600 | * The 60 bit time stamp is broken up by 30 bits in a top and bottom half | | |
| 601 | * (bottom being the least significant 30 bits of the 60 bit time stamp). | | |
| 602 | * | | |
| 603 | * The two most significant bits of each half holds a 2 bit counter (0-3). | | |
| 604 | * Each update will increment this counter by one. | | |
| 605 | * When reading the top and bottom, if the two counter bits match then the | | |
| 606 | * top and bottom together make a valid 60 bit number. | | |
| 607 | */ | | |
| 608 | #define RB_TIME_SHIFT 30 | | |
| 609 | #define RB_TIME_VAL_MASK ((1 << RB_TIME_SHIFT) - 1) | | |
| 610 | #define RB_TIME_MSB_SHIFT 60 | | |
| 611 | | | |
| 612 | static inline int rb_time_cnt(unsigned long val) | | |
| 613 | { | 536 | { |
| 614 | return (val >> RB_TIME_SHIFT) & 3; | 537 | struct buffer_data_page field; |
| 615 | } | | |
| 616 | | | |
| 617 | static inline u64 rb_time_val(unsigned long top, unsigned long bottom) | | |
| 618 | { | | |
| 619 | u64 val; | | |
| 620 | | | |
| 621 | val = top & RB_TIME_VAL_MASK; | | |
| 622 | val <<= RB_TIME_SHIFT; | | |
| 623 | val |= bottom & RB_TIME_VAL_MASK; | | |
| 624 | | | |
| 625 | return val; | | |
| 626 | } | | |
| 627 | | | |
| 628 | static inline bool __rb_time_read(rb_time_t *t, u64 *ret, unsigned long *cnt) | | |
| 629 | { | | |
| 630 | unsigned long top, bottom, msb; | | |
| 631 | unsigned long c; | | |
| 632 | | | |
| 633 | /* | | |
| 634 | * If the read is interrupted by a write, then the cnt will | | |
| 635 | * be different. Loop until both top and bottom have been read | | |
| 636 | * without interruption. | | |
| 637 | */ | | |
| 638 | do { | | |
| 639 | c = local_read(&t->cnt); | | |
| 640 | top = local_read(&t->top); | | |
| 641 | bottom = local_read(&t->bottom); | | |
| 642 | msb = local_read(&t->msb); | | |
| 643 | } while (c != local_read(&t->cnt)); | | |
| 644 | | | |
| 645 | *cnt = rb_time_cnt(top); | | |
| 646 | | | |
| 647 | /* If top, msb or bottom counts don't match, this interrupted a write */ | | |
| 648 | if (*cnt != rb_time_cnt(msb) || *cnt != rb_time_cnt(bottom)) | | |
| 649 | return false; | | |
| 650 | | | |
| 651 | /* The shift to msb will lose its cnt bits */ | | |
| 652 | *ret = rb_time_val(top, bottom) | ((u64)msb << RB_TIME_MSB_SHIFT); | | |
| 653 | return true; | | |
| 654 | } | | |
| 655 | | | |
| 656 | static bool rb_time_read(rb_time_t *t, u64 *ret) | | |
| 657 | { | | |
| 658 | unsigned long cnt; | | |
| 659 | | | |
| 660 | return __rb_time_read(t, ret, &cnt); | | |
| 661 | } | | |
| 662 | | | |
| 663 | static inline unsigned long rb_time_val_cnt(unsigned long val, unsigned long cnt) | | |
| 664 | { | | |
| 665 | return (val & RB_TIME_VAL_MASK) | ((cnt & 3) << RB_TIME_SHIFT); | | |
| 666 | } | | |
| 667 | | | |
| 668 | static inline void rb_time_split(u64 val, unsigned long *top, unsigned long *bottom, | | |
| 669 | unsigned long *msb) | | |
| 670 | { | | |
| 671 | *top = (unsigned long)((val >> RB_TIME_SHIFT) & RB_TIME_VAL_MASK); | | |
| 672 | *bottom = (unsigned long)(val & RB_TIME_VAL_MASK); | | |
| 673 | *msb = (unsigned long)(val >> RB_TIME_MSB_SHIFT); | | |
| 674 | } | | |
| 675 | | 538 | |
| 676 | static inline void rb_time_val_set(local_t *t, unsigned long val, unsigned long cnt) | 539 | trace_seq_printf(s, "\tfield: u64 timestamp;\t" |
| 677 | { | 540 | "offset:0;\tsize:%u;\tsigned:%u;\n", |
| 678 | val = rb_time_val_cnt(val, cnt); | 541 | (unsigned int)sizeof(field.time_stamp), |
| 679 | local_set(t, val); | 542 | (unsigned int)is_signed_type(u64)); |
| 680 | } | | |
| 681 | | 543 | |
| 682 | static void rb_time_set(rb_time_t *t, u64 val) | 544 | trace_seq_printf(s, "\tfield: local_t commit;\t" |
| 683 | { | 545 | "offset:%u;\tsize:%u;\tsigned:%u;\n", |
| 684 | unsigned long cnt, top, bottom, msb; | 546 | (unsigned int)offsetof(typeof(field), commit), |
| | 547 | (unsigned int)sizeof(field.commit), |
| | 548 | (unsigned int)is_signed_type(long)); |
| 685 | | 549 | |
| 686 | rb_time_split(val, &top, &bottom, &msb); | 550 | trace_seq_printf(s, "\tfield: int overwrite;\t" |
| | 551 | "offset:%u;\tsize:%u;\tsigned:%u;\n", |
| | 552 | (unsigned int)offsetof(typeof(field), commit), |
| | 553 | 1, |
| | 554 | (unsigned int)is_signed_type(long)); |
| 687 | | 555 | |
| 688 | /* Writes always succeed with a valid number even if it gets interrupted. */ | 556 | trace_seq_printf(s, "\tfield: char data;\t" |
| 689 | do { | 557 | "offset:%u;\tsize:%u;\tsigned:%u;\n", |
| 690 | cnt = local_inc_return(&t->cnt); | 558 | (unsigned int)offsetof(typeof(field), data), |
| 691 | rb_time_val_set(&t->top, top, cnt); | 559 | (unsigned int)buffer->subbuf_size, |
| 692 | rb_time_val_set(&t->bottom, bottom, cnt); | 560 | (unsigned int)is_signed_type(char)); |
| 693 | rb_time_val_set(&t->msb, val >> RB_TIME_MSB_SHIFT, cnt); | | |
| 694 | } while (cnt != local_read(&t->cnt)); | | |
| 695 | } | | |
| 696 | | 561 | |
| 697 | static inline bool | 562 | return !trace_seq_has_overflowed(s); |
| 698 | rb_time_read_cmpxchg(local_t *l, unsigned long expect, unsigned long set) | | |
| 699 | { | | |
| 700 | return local_try_cmpxchg(l, &expect, set); | | |
| 701 | } | 563 | } |
| 702 | | 564 | |
| 703 | #else /* 64 bits */ | 565 | static inline void rb_time_read(rb_time_t *t, u64 *ret) |
| 704 | | | |
| 705 | /* local64_t always succeeds */ | | |
| 706 | | | |
| 707 | static inline bool rb_time_read(rb_time_t *t, u64 *ret) | | |
| 708 | { | 566 | { |
| 709 | *ret = local64_read(&t->time); | 567 | *ret = local64_read(&t->time); |
| 710 | return true; | | |
| 711 | } | 568 | } |
| 712 | static void rb_time_set(rb_time_t *t, u64 val) | 569 | static void rb_time_set(rb_time_t *t, u64 val) |
| 713 | { | 570 | { |
| 714 | local64_set(&t->time, val); | 571 | local64_set(&t->time, val); |
| 715 | } | 572 | } |
| 716 | #endif | | |
| 717 | | 573 | |
| 718 | /* | 574 | /* |
| 719 | * Enable this to make sure that the event passed to | 575 | * Enable this to make sure that the event passed to |
| @@ -820,10 +676,7 @@ u64 ring_buffer_event_time_stamp(struct trace_buffer *buffer, · 100 unmodified lines |
| 820 | WARN_ONCE(1, "nest (%d) greater than max", nest); | 676 | WARN_ONCE(1, "nest (%d) greater than max", nest); |
| 821 | | 677 | |
| 822 | fail: | 678 | fail: |
| 823 | /* Can only fail on 32 bit */ | 679 | rb_time_read(&cpu_buffer->write_stamp, &ts); |
| 824 | if (!rb_time_read(&cpu_buffer->write_stamp, &ts)) | | |
| 825 | /* Screw it, just read the current time */ | | |
| 826 | ts = rb_time_stamp(cpu_buffer->buffer); | | |
| 827 | | 680 | |
| 828 | return ts; | 681 | return ts; |
| 829 | } | 682 | } |
| @@ -1619,10 +1472,12 @@ static int __rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer, · 789 unmodified lines |
| 1619 | | 1472 | |
| 1620 | list_add(&bpage->list, pages); | 1473 | list_add(&bpage->list, pages); |
| 1621 | | 1474 | |
| 1622 | page = alloc_pages_node(cpu_to_node(cpu_buffer->cpu), mflags, 0); | 1475 | page = alloc_pages_node(cpu_to_node(cpu_buffer->cpu), mflags, |
| | 1476 | cpu_buffer->buffer->subbuf_order); |
| 1623 | if (!page) | 1477 | if (!page) |
| 1624 | goto free_pages; | 1478 | goto free_pages; |
| 1625 | bpage->page = page_address(page); | 1479 | bpage->page = page_address(page); |
| | 1480 | bpage->order = cpu_buffer->buffer->subbuf_order; |
| 1626 | rb_init_page(bpage->page); | 1481 | rb_init_page(bpage->page); |
| 1627 | | 1482 | |
| 1628 | if (user_thread && fatal_signal_pending(current)) | 1483 | if (user_thread && fatal_signal_pending(current)) |
| @@ -1701,7 +1556,8 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, long nr_pages, int cpu) · 72 unmodified lines |
| 1701 | rb_check_bpage(cpu_buffer, bpage); | 1556 | rb_check_bpage(cpu_buffer, bpage); |
| 1702 | | 1557 | |
| 1703 | cpu_buffer->reader_page = bpage; | 1558 | cpu_buffer->reader_page = bpage; |
| 1704 | page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, 0); | 1559 | |
| | 1560 | page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, cpu_buffer->buffer->subbuf_order); |
| 1705 | if (!page) | 1561 | if (!page) |
| 1706 | goto fail_free_reader; | 1562 | goto fail_free_reader; |
| 1707 | bpage->page = page_address(page); | 1563 | bpage->page = page_address(page); |
| @@ -1784,7 +1640,14 @@ struct trace_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags, · 76 unmodified lines |
| 1784 | if (!zalloc_cpumask_var(&buffer->cpumask, GFP_KERNEL)) | 1640 | if (!zalloc_cpumask_var(&buffer->cpumask, GFP_KERNEL)) |
| 1785 | goto fail_free_buffer; | 1641 | goto fail_free_buffer; |
| 1786 | | 1642 | |
| 1787 | nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); | 1643 | /* Default buffer page size - one system page */ |
| | 1644 | buffer->subbuf_order = 0; |
| | 1645 | buffer->subbuf_size = PAGE_SIZE - BUF_PAGE_HDR_SIZE; |
| | 1646 | |
| | 1647 | /* Max payload is buffer page size - header (8bytes) */ |
| | 1648 | buffer->max_data_size = buffer->subbuf_size - (sizeof(u32) * 2); |
| | 1649 | |
| | 1650 | nr_pages = DIV_ROUND_UP(size, buffer->subbuf_size); |
| 1788 | buffer->flags = flags; | 1651 | buffer->flags = flags; |
| 1789 | buffer->clock = trace_clock_local; | 1652 | buffer->clock = trace_clock_local; |
| 1790 | buffer->reader_lock_key = key; | 1653 | buffer->reader_lock_key = key; |
| @@ -2103,7 +1966,7 @@ static void update_pages_handler(struct work_struct *work) · 312 unmodified lines |
| 2103 | * @size: the new size. | 1966 | * @size: the new size. |
| 2104 | * @cpu_id: the cpu buffer to resize | 1967 | * @cpu_id: the cpu buffer to resize |
| 2105 | * | 1968 | * |
| 2106 | * Minimum size is 2 * BUF_PAGE_SIZE. | 1969 | * Minimum size is 2 * buffer->subbuf_size. |
| 2107 | * | 1970 | * |
| 2108 | * Returns 0 on success and < 0 on failure. | 1971 | * Returns 0 on success and < 0 on failure. |
| 2109 | */ | 1972 | */ |
| @@ -2125,7 +1988,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, · 15 unmodified lines |
| 2125 | !cpumask_test_cpu(cpu_id, buffer->cpumask)) | 1988 | !cpumask_test_cpu(cpu_id, buffer->cpumask)) |
| 2126 | return 0; | 1989 | return 0; |
| 2127 | | 1990 | |
| 2128 | nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); | 1991 | nr_pages = DIV_ROUND_UP(size, buffer->subbuf_size); |
| 2129 | | 1992 | |
| 2130 | /* we need a minimum of two pages */ | 1993 | /* we need a minimum of two pages */ |
| 2131 | if (nr_pages < 2) | 1994 | if (nr_pages < 2) |
| @@ -2372,7 +2235,7 @@ rb_iter_head_event(struct ring_buffer_iter *iter) · 240 unmodified lines |
| 2372 | */ | 2235 | */ |
| 2373 | barrier(); | 2236 | barrier(); |
| 2374 | | 2237 | |
| 2375 | if ((iter->head + length) > commit || length > BUF_PAGE_SIZE) | 2238 | if ((iter->head + length) > commit || length > iter->event_size) |
| 2376 | /* Writer corrupted the read? */ | 2239 | /* Writer corrupted the read? */ |
| 2377 | goto reset; | 2240 | goto reset; |
| 2378 | | 2241 | |
| @@ -2412,11 +2275,13 @@ rb_commit_index(struct ring_buffer_per_cpu *cpu_buffer) · 33 unmodified lines |
| 2412 | } | 2275 | } |
| 2413 | | 2276 | |
| 2414 | static __always_inline unsigned | 2277 | static __always_inline unsigned |
| 2415 | rb_event_index(struct ring_buffer_event *event) | 2278 | rb_event_index(struct ring_buffer_per_cpu *cpu_buffer, struct ring_buffer_event *event) |
| 2416 | { | 2279 | { |
| 2417 | unsigned long addr = (unsigned long)event; | 2280 | unsigned long addr = (unsigned long)event; |
| 2418 | | 2281 | |
| 2419 | return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE; | 2282 | addr &= (PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1; |
| | 2283 | |
| | 2284 | return addr - BUF_PAGE_HDR_SIZE; |
| 2420 | } | 2285 | } |
| 2421 | | 2286 | |
| 2422 | static void rb_inc_iter(struct ring_buffer_iter *iter) | 2287 | static void rb_inc_iter(struct ring_buffer_iter *iter) |
| @@ -2605,6 +2470,7 @@ static inline void · 182 unmodified lines |
| 2605 | rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, | 2470 | rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, |
| 2606 | unsigned long tail, struct rb_event_info *info) | 2471 | unsigned long tail, struct rb_event_info *info) |
| 2607 | { | 2472 | { |
| | 2473 | unsigned long bsize = READ_ONCE(cpu_buffer->buffer->subbuf_size); |
| 2608 | struct buffer_page *tail_page = info->tail_page; | 2474 | struct buffer_page *tail_page = info->tail_page; |
| 2609 | struct ring_buffer_event *event; | 2475 | struct ring_buffer_event *event; |
| 2610 | unsigned long length = info->length; | 2476 | unsigned long length = info->length; |
| @@ -2613,13 +2479,13 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, · 2 unmodified lines |
| 2613 | * Only the event that crossed the page boundary | 2479 | * Only the event that crossed the page boundary |
| 2614 | * must fill the old tail_page with padding. | 2480 | * must fill the old tail_page with padding. |
| 2615 | */ | 2481 | */ |
| 2616 | if (tail >= BUF_PAGE_SIZE) { | 2482 | if (tail >= bsize) { |
| 2617 | /* | 2483 | /* |
| 2618 | * If the page was filled, then we still need | 2484 | * If the page was filled, then we still need |
| 2619 | * to update the real_end. Reset it to zero | 2485 | * to update the real_end. Reset it to zero |
| 2620 | * and the reader will ignore it. | 2486 | * and the reader will ignore it. |
| 2621 | */ | 2487 | */ |
| 2622 | if (tail == BUF_PAGE_SIZE) | 2488 | if (tail == bsize) |
| 2623 | tail_page->real_end = 0; | 2489 | tail_page->real_end = 0; |
| 2624 | | 2490 | |
| 2625 | local_sub(length, &tail_page->write); | 2491 | local_sub(length, &tail_page->write); |
| @@ -2647,7 +2513,7 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, · 21 unmodified lines |
| 2647 | * If we are less than the minimum size, we don't need to | 2513 | * If we are less than the minimum size, we don't need to |
| 2648 | * worry about it. | 2514 | * worry about it. |
| 2649 | */ | 2515 | */ |
| 2650 | if (tail > (BUF_PAGE_SIZE - RB_EVNT_MIN_SIZE)) { | 2516 | if (tail > (bsize - RB_EVNT_MIN_SIZE)) { |
| 2651 | /* No room for any events */ | 2517 | /* No room for any events */ |
| 2652 | | 2518 | |
| 2653 | /* Mark the rest of the page with padding */ | 2519 | /* Mark the rest of the page with padding */ |
| @@ -2662,19 +2528,19 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, · 8 unmodified lines |
| 2662 | } | 2528 | } |
| 2663 | | 2529 | |
| 2664 | /* Put in a discarded event */ | 2530 | /* Put in a discarded event */ |
| 2665 | event->array[0] = (BUF_PAGE_SIZE - tail) - RB_EVNT_HDR_SIZE; | 2531 | event->array[0] = (bsize - tail) - RB_EVNT_HDR_SIZE; |
| 2666 | event->type_len = RINGBUF_TYPE_PADDING; | 2532 | event->type_len = RINGBUF_TYPE_PADDING; |
| 2667 | /* time delta must be non zero */ | 2533 | /* time delta must be non zero */ |
| 2668 | event->time_delta = 1; | 2534 | event->time_delta = 1; |
| 2669 | | 2535 | |
| 2670 | /* account for padding bytes */ | 2536 | /* account for padding bytes */ |
| 2671 | local_add(BUF_PAGE_SIZE - tail, &cpu_buffer->entries_bytes); | 2537 | local_add(bsize - tail, &cpu_buffer->entries_bytes); |
| 2672 | | 2538 | |
| 2673 | /* Make sure the padding is visible before the tail_page->write update */ | 2539 | /* Make sure the padding is visible before the tail_page->write update */ |
| 2674 | smp_wmb(); | 2540 | smp_wmb(); |
| 2675 | | 2541 | |
| 2676 | /* Set write to end of buffer */ | 2542 | /* Set write to end of buffer */ |
| 2677 | length = (tail + length) - BUF_PAGE_SIZE; | 2543 | length = (tail + length) - bsize; |
| 2678 | local_sub(length, &tail_page->write); | 2544 | local_sub(length, &tail_page->write); |
| 2679 | } | 2545 | } |
| 2680 | | 2546 | |
| @@ -2788,7 +2654,8 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, · 107 unmodified lines |
| 2788 | | 2654 | |
| 2789 | /* Slow path */ | 2655 | /* Slow path */ |
| 2790 | static struct ring_buffer_event * | 2656 | static struct ring_buffer_event * |
| 2791 | rb_add_time_stamp(struct ring_buffer_event *event, u64 delta, bool abs) | 2657 | rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer, |
| | 2658 | struct ring_buffer_event *event, u64 delta, bool abs) |
| 2792 | { | 2659 | { |
| 2793 | if (abs) | 2660 | if (abs) |
| 2794 | event->type_len = RINGBUF_TYPE_TIME_STAMP; | 2661 | event->type_len = RINGBUF_TYPE_TIME_STAMP; |
| @@ -2796,7 +2663,7 @@ rb_add_time_stamp(struct ring_buffer_event *event, u64 delta, bool abs) · 1 unmodified line |
| 2796 | event->type_len = RINGBUF_TYPE_TIME_EXTEND; | 2663 | event->type_len = RINGBUF_TYPE_TIME_EXTEND; |
| 2797 | | 2664 | |
| 2798 | /* Not the first event on the page, or not delta? */ | 2665 | /* Not the first event on the page, or not delta? */ |
| 2799 | if (abs || rb_event_index(event)) { | 2666 | if (abs || rb_event_index(cpu_buffer, event)) { |
| 2800 | event->time_delta = delta & TS_MASK; | 2667 | event->time_delta = delta & TS_MASK; |
| 2801 | event->array[0] = delta >> TS_SHIFT; | 2668 | event->array[0] = delta >> TS_SHIFT; |
| 2802 | } else { | 2669 | } else { |
| @@ -2826,7 +2693,7 @@ rb_check_timestamp(struct ring_buffer_per_cpu *cpu_buffer, · 23 unmodified lines |
| 2826 | (unsigned long long)info->ts, | 2693 | (unsigned long long)info->ts, |
| 2827 | (unsigned long long)info->before, | 2694 | (unsigned long long)info->before, |
| 2828 | (unsigned long long)info->after, | 2695 | (unsigned long long)info->after, |
| 2829 | (unsigned long long)(rb_time_read(&cpu_buffer->write_stamp, &write_stamp) ? write_stamp : 0), | 2696 | (unsigned long long)({rb_time_read(&cpu_buffer->write_stamp, &write_stamp); write_stamp;}), |
| 2830 | sched_clock_stable() ? "" : | 2697 | sched_clock_stable() ? "" : |
| 2831 | "If you just came from a suspend/resume,\n" | 2698 | "If you just came from a suspend/resume,\n" |
| 2832 | "please switch to the trace global clock:\n" | 2699 | "please switch to the trace global clock:\n" |
| @@ -2870,7 +2737,7 @@ static void rb_add_timestamp(struct ring_buffer_per_cpu *cpu_buffer, · 37 unmodified lines |
| 2870 | if (!abs) | 2737 | if (!abs) |
| 2871 | info->delta = 0; | 2738 | info->delta = 0; |
| 2872 | } | 2739 | } |
| 2873 | *event = rb_add_time_stamp(*event, info->delta, abs); | 2740 | *event = rb_add_time_stamp(cpu_buffer, *event, info->delta, abs); |
| 2874 | *length -= RB_LEN_TIME_EXTEND; | 2741 | *length -= RB_LEN_TIME_EXTEND; |
| 2875 | *delta = 0; | 2742 | *delta = 0; |
| 2876 | } | 2743 | } |
| @@ -2954,10 +2821,10 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, · 77 unmodified lines |
| 2954 | struct buffer_page *bpage; | 2821 | struct buffer_page *bpage; |
| 2955 | unsigned long addr; | 2822 | unsigned long addr; |
| 2956 | | 2823 | |
| 2957 | new_index = rb_event_index(event); | 2824 | new_index = rb_event_index(cpu_buffer, event); |
| 2958 | old_index = new_index + rb_event_ts_length(event); | 2825 | old_index = new_index + rb_event_ts_length(event); |
| 2959 | addr = (unsigned long)event; | 2826 | addr = (unsigned long)event; |
| 2960 | addr &= PAGE_MASK; | 2827 | addr &= ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); |
| 2961 | | 2828 | |
| 2962 | bpage = READ_ONCE(cpu_buffer->tail_page); | 2829 | bpage = READ_ONCE(cpu_buffer->tail_page); |
| 2963 | | 2830 | |
| @@ -3344,6 +3211,76 @@ EXPORT_SYMBOL_GPL(ring_buffer_unlock_commit); · 380 unmodified lines |
| 3344 | #define CHECK_FULL_PAGE 1L | 3211 | #define CHECK_FULL_PAGE 1L |
| 3345 | | 3212 | |
| 3346 | #ifdef CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS | 3213 | #ifdef CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS |
| | 3214 | |
| | 3215 | static const char *show_irq_str(int bits) |
| | 3216 | { |
| | 3217 | const char *type[] = { |
| | 3218 | ".", // 0 |
| | 3219 | "s", // 1 |
| | 3220 | "h", // 2 |
| | 3221 | "Hs", // 3 |
| | 3222 | "n", // 4 |
| | 3223 | "Ns", // 5 |
| | 3224 | "Nh", // 6 |
| | 3225 | "NHs", // 7 |
| | 3226 | }; |
| | 3227 | |
| | 3228 | return type[bits]; |
| | 3229 | } |
| | 3230 | |
| | 3231 | /* Assume this is an trace event */ |
| | 3232 | static const char *show_flags(struct ring_buffer_event *event) |
| | 3233 | { |
| | 3234 | struct trace_entry *entry; |
| | 3235 | int bits = 0; |
| | 3236 | |
| | 3237 | if (rb_event_data_length(event) - RB_EVNT_HDR_SIZE < sizeof(*entry)) |
| | 3238 | return "X"; |
| | 3239 | |
| | 3240 | entry = ring_buffer_event_data(event); |
| | 3241 | |
| | 3242 | if (entry->flags & TRACE_FLAG_SOFTIRQ) |
| | 3243 | bits |= 1; |
| | 3244 | |
| | 3245 | if (entry->flags & TRACE_FLAG_HARDIRQ) |
| | 3246 | bits |= 2; |
| | 3247 | |
| | 3248 | if (entry->flags & TRACE_FLAG_NMI) |
| | 3249 | bits |= 4; |
| | 3250 | |
| | 3251 | return show_irq_str(bits); |
| | 3252 | } |
| | 3253 | |
| | 3254 | static const char *show_irq(struct ring_buffer_event *event) |
| | 3255 | { |
| | 3256 | struct trace_entry *entry; |
| | 3257 | |
| | 3258 | if (rb_event_data_length(event) - RB_EVNT_HDR_SIZE < sizeof(*entry)) |
| | 3259 | return ""; |
| | 3260 | |
| | 3261 | entry = ring_buffer_event_data(event); |
| | 3262 | if (entry->flags & TRACE_FLAG_IRQS_OFF) |
| | 3263 | return "d"; |
| | 3264 | return ""; |
| | 3265 | } |
| | 3266 | |
| | 3267 | static const char *show_interrupt_level(void) |
| | 3268 | { |
| | 3269 | unsigned long pc = preempt_count(); |
| | 3270 | unsigned char level = 0; |
| | 3271 | |
| | 3272 | if (pc & SOFTIRQ_OFFSET) |
| | 3273 | level |= 1; |
| | 3274 | |
| | 3275 | if (pc & HARDIRQ_MASK) |
| | 3276 | level |= 2; |
| | 3277 | |
| | 3278 | if (pc & NMI_MASK) |
| | 3279 | level |= 4; |
| | 3280 | |
| | 3281 | return show_irq_str(level); |
| | 3282 | } |
| | 3283 | |
| 3347 | static void dump_buffer_page(struct buffer_data_page *bpage, | 3284 | static void dump_buffer_page(struct buffer_data_page *bpage, |
| 3348 | struct rb_event_info *info, | 3285 | struct rb_event_info *info, |
| 3349 | unsigned long tail) | 3286 | unsigned long tail) |
| @@ -3364,34 +3301,57 @@ static void dump_buffer_page(struct buffer_data_page *bpage, · 14 unmodified lines |
| 3364 | case RINGBUF_TYPE_TIME_EXTEND: | 3301 | case RINGBUF_TYPE_TIME_EXTEND: |
| 3365 | delta = rb_event_time_stamp(event); | 3302 | delta = rb_event_time_stamp(event); |
| 3366 | ts += delta; | 3303 | ts += delta; |
| 3367 | pr_warn(" [%lld] delta:%lld TIME EXTEND\n", ts, delta); | 3304 | pr_warn(" 0x%x: [%lld] delta:%lld TIME EXTEND\n", |
| | 3305 | e, ts, delta); |
| 3368 | break; | 3306 | break; |
| 3369 | | 3307 | |
| 3370 | case RINGBUF_TYPE_TIME_STAMP: | 3308 | case RINGBUF_TYPE_TIME_STAMP: |
| 3371 | delta = rb_event_time_stamp(event); | 3309 | delta = rb_event_time_stamp(event); |
| 3372 | ts = rb_fix_abs_ts(delta, ts); | 3310 | ts = rb_fix_abs_ts(delta, ts); |
| 3373 | pr_warn(" [%lld] absolute:%lld TIME STAMP\n", ts, delta); | 3311 | pr_warn(" 0x%x: [%lld] absolute:%lld TIME STAMP\n", |
| | 3312 | e, ts, delta); |
| 3374 | break; | 3313 | break; |
| 3375 | | 3314 | |
| 3376 | case RINGBUF_TYPE_PADDING: | 3315 | case RINGBUF_TYPE_PADDING: |
| 3377 | ts += event->time_delta; | 3316 | ts += event->time_delta; |
| 3378 | pr_warn(" [%lld] delta:%d PADDING\n", ts, event->time_delta); | 3317 | pr_warn(" 0x%x: [%lld] delta:%d PADDING\n", |
| | 3318 | e, ts, event->time_delta); |
| 3379 | break; | 3319 | break; |
| 3380 | | 3320 | |
| 3381 | case RINGBUF_TYPE_DATA: | 3321 | case RINGBUF_TYPE_DATA: |
| 3382 | ts += event->time_delta; | 3322 | ts += event->time_delta; |
| 3383 | pr_warn(" [%lld] delta:%d\n", ts, event->time_delta); | 3323 | pr_warn(" 0x%x: [%lld] delta:%d %s%s\n", |
| | 3324 | e, ts, event->time_delta, |
| | 3325 | show_flags(event), show_irq(event)); |
| 3384 | break; | 3326 | break; |
| 3385 | | 3327 | |
| 3386 | default: | 3328 | default: |
| 3387 | break; | 3329 | break; |
| 3388 | } | 3330 | } |
| 3389 | } | 3331 | } |
| | 3332 | pr_warn("expected end:0x%lx last event actually ended at:0x%x\n", tail, e); |
| 3390 | } | 3333 | } |
| 3391 | | 3334 | |
| 3392 | static DEFINE_PER_CPU(atomic_t, checking); | 3335 | static DEFINE_PER_CPU(atomic_t, checking); |
| 3393 | static atomic_t ts_dump; | 3336 | static atomic_t ts_dump; |
| 3394 | | 3337 | |
| | 3338 | #define buffer_warn_return(fmt, ...) \ |
| | 3339 | do { \ |
| | 3340 | /* If another report is happening, ignore this one */ \ |
| | 3341 | if (atomic_inc_return(&ts_dump) != 1) { \ |
| | 3342 | atomic_dec(&ts_dump); \ |
| | 3343 | goto out; \ |
| | 3344 | } \ |
| | 3345 | atomic_inc(&cpu_buffer->record_disabled); \ |
| | 3346 | pr_warn(fmt, ##__VA_ARGS__); \ |
| | 3347 | dump_buffer_page(bpage, info, tail); \ |
| | 3348 | atomic_dec(&ts_dump); \ |
| | 3349 | /* There's some cases in boot up that this can happen */ \ |
| | 3350 | if (WARN_ON_ONCE(system_state != SYSTEM_BOOTING)) \ |
| | 3351 | /* Do not re-enable checking */ \ |
| | 3352 | return; \ |
| | 3353 | } while (0) |
| | 3354 | |
| 3395 | /* | 3355 | /* |
| 3396 | * Check if the current event time stamp matches the deltas on | 3356 | * Check if the current event time stamp matches the deltas on |
| 3397 | * the buffer page. | 3357 | * the buffer page. |
| @@ -3445,7 +3405,12 @@ static void check_buffer(struct ring_buffer_per_cpu *cpu_buffer, · 47 unmodified lines |
| 3445 | | 3405 | |
| 3446 | case RINGBUF_TYPE_TIME_STAMP: | 3406 | case RINGBUF_TYPE_TIME_STAMP: |
| 3447 | delta = rb_event_time_stamp(event); | 3407 | delta = rb_event_time_stamp(event); |
| 3448 | ts = rb_fix_abs_ts(delta, ts); | 3408 | delta = rb_fix_abs_ts(delta, ts); |
| | 3409 | if (delta < ts) { |
| | 3410 | buffer_warn_return("[CPU: %d]ABSOLUTE TIME WENT BACKWARDS: last ts: %lld absolute ts: %lld\n", |
| | 3411 | cpu_buffer->cpu, ts, delta); |
| | 3412 | } |
| | 3413 | ts = delta; |
| 3449 | break; | 3414 | break; |
| 3450 | | 3415 | |
| 3451 | case RINGBUF_TYPE_PADDING: | 3416 | case RINGBUF_TYPE_PADDING: |
| @@ -3462,23 +3427,11 @@ static void check_buffer(struct ring_buffer_per_cpu *cpu_buffer, · 10 unmodified lines |
| 3462 | } | 3427 | } |
| 3463 | if ((full && ts > info->ts) || | 3428 | if ((full && ts > info->ts) || |
| 3464 | (!full && ts + info->delta != info->ts)) { | 3429 | (!full && ts + info->delta != info->ts)) { |
| 3465 | /* If another report is happening, ignore this one */ | 3430 | buffer_warn_return("[CPU: %d]TIME DOES NOT MATCH expected:%lld actual:%lld delta:%lld before:%lld after:%lld%s context:%s\n", |
| 3466 | if (atomic_inc_return(&ts_dump) != 1) { | 3431 | cpu_buffer->cpu, |
| 3467 | atomic_dec(&ts_dump); | 3432 | ts + info->delta, info->ts, info->delta, |
| 3468 | goto out; | 3433 | info->before, info->after, |
| 3469 | } | 3434 | full ? " (full)" : "", show_interrupt_level()); |
| 3470 | atomic_inc(&cpu_buffer->record_disabled); | | |
| 3471 | /* There's some cases in boot up that this can happen */ | | |
| 3472 | WARN_ON_ONCE(system_state != SYSTEM_BOOTING); | | |
| 3473 | pr_warn("[CPU: %d]TIME DOES NOT MATCH expected:%lld actual:%lld delta:%lld before:%lld after:%lld%s\n", | | |
| 3474 | cpu_buffer->cpu, | | |
| 3475 | ts + info->delta, info->ts, info->delta, | | |
| 3476 | info->before, info->after, | | |
| 3477 | full ? " (full)" : ""); | | |
| 3478 | dump_buffer_page(bpage, info, tail); | | |
| 3479 | atomic_dec(&ts_dump); | | |
| 3480 | /* Do not re-enable checking */ | | |
| 3481 | return; | | |
| 3482 | } | 3435 | } |
| 3483 | out: | 3436 | out: |
| 3484 | atomic_dec(this_cpu_ptr(&checking)); | 3437 | atomic_dec(this_cpu_ptr(&checking)); |
| @@ -3498,16 +3451,14 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, · 13 unmodified lines |
| 3498 | struct ring_buffer_event *event; | 3451 | struct ring_buffer_event *event; |
| 3499 | struct buffer_page *tail_page; | 3452 | struct buffer_page *tail_page; |
| 3500 | unsigned long tail, write, w; | 3453 | unsigned long tail, write, w; |
| 3501 | bool a_ok; | | |
| 3502 | bool b_ok; | | |
| 3503 | | 3454 | |
| 3504 | /* Don't let the compiler play games with cpu_buffer->tail_page */ | 3455 | /* Don't let the compiler play games with cpu_buffer->tail_page */ |
| 3505 | tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page); | 3456 | tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page); |
| 3506 | | 3457 | |
| 3507 | /*A*/ w = local_read(&tail_page->write) & RB_WRITE_MASK; | 3458 | /*A*/ w = local_read(&tail_page->write) & RB_WRITE_MASK; |
| 3508 | barrier(); | 3459 | barrier(); |
| 3509 | b_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before); | 3460 | rb_time_read(&cpu_buffer->before_stamp, &info->before); |
| 3510 | a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after); | 3461 | rb_time_read(&cpu_buffer->write_stamp, &info->after); |
| 3511 | barrier(); | 3462 | barrier(); |
| 3512 | info->ts = rb_time_stamp(cpu_buffer->buffer); | 3463 | info->ts = rb_time_stamp(cpu_buffer->buffer); |
| 3513 | | 3464 | |
| @@ -3522,7 +3473,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, · 8 unmodified lines |
| 3522 | if (!w) { | 3473 | if (!w) { |
| 3523 | /* Use the sub-buffer timestamp */ | 3474 | /* Use the sub-buffer timestamp */ |
| 3524 | info->delta = 0; | 3475 | info->delta = 0; |
| 3525 | } else if (unlikely(!a_ok || !b_ok || info->before != info->after)) { | 3476 | } else if (unlikely(info->before != info->after)) { |
| 3526 | info->add_timestamp |= RB_ADD_STAMP_FORCE | RB_ADD_STAMP_EXTEND; | 3477 | info->add_timestamp |= RB_ADD_STAMP_FORCE | RB_ADD_STAMP_EXTEND; |
| 3527 | info->length += RB_LEN_TIME_EXTEND; | 3478 | info->length += RB_LEN_TIME_EXTEND; |
| 3528 | } else { | 3479 | } else { |
| @@ -3544,7 +3495,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, · 15 unmodified lines |
| 3544 | tail = write - info->length; | 3495 | tail = write - info->length; |
| 3545 | | 3496 | |
| 3546 | /* See if we shot pass the end of this buffer page */ | 3497 | /* See if we shot pass the end of this buffer page */ |
| 3547 | if (unlikely(write > BUF_PAGE_SIZE)) { | 3498 | if (unlikely(write > cpu_buffer->buffer->subbuf_size)) { |
| 3548 | check_buffer(cpu_buffer, info, CHECK_FULL_PAGE); | 3499 | check_buffer(cpu_buffer, info, CHECK_FULL_PAGE); |
| 3549 | return rb_move_tail(cpu_buffer, tail, info); | 3500 | return rb_move_tail(cpu_buffer, tail, info); |
| 3550 | } | 3501 | } |
| @@ -3571,8 +3522,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, · 20 unmodified lines |
| 3571 | /* SLOW PATH - Interrupted between A and C */ | 3522 | /* SLOW PATH - Interrupted between A and C */ |
| 3572 | | 3523 | |
| 3573 | /* Save the old before_stamp */ | 3524 | /* Save the old before_stamp */ |
| 3574 | a_ok = rb_time_read(&cpu_buffer->before_stamp, &info->before); | 3525 | rb_time_read(&cpu_buffer->before_stamp, &info->before); |
| 3575 | RB_WARN_ON(cpu_buffer, !a_ok); | | |
| 3576 | | 3526 | |
| 3577 | /* | 3527 | /* |
| 3578 | * Read a new timestamp and update the before_stamp to make | 3528 | * Read a new timestamp and update the before_stamp to make |
| @@ -3584,9 +3534,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, · 5 unmodified lines |
| 3584 | rb_time_set(&cpu_buffer->before_stamp, ts); | 3534 | rb_time_set(&cpu_buffer->before_stamp, ts); |
| 3585 | | 3535 | |
| 3586 | barrier(); | 3536 | barrier(); |
| 3587 | /*E*/ a_ok = rb_time_read(&cpu_buffer->write_stamp, &info->after); | 3537 | /*E*/ rb_time_read(&cpu_buffer->write_stamp, &info->after); |
| 3588 | /* Was interrupted before here, write_stamp must be valid */ | | |
| 3589 | RB_WARN_ON(cpu_buffer, !a_ok); | | |
| 3590 | barrier(); | 3538 | barrier(); |
| 3591 | /*F*/ if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) && | 3539 | /*F*/ if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) && |
| 3592 | info->after == info->before && info->after < ts) { | 3540 | info->after == info->before && info->after < ts) { |
| @@ -3678,7 +3626,7 @@ rb_reserve_next_event(struct trace_buffer *buffer, · 85 unmodified lines |
| 3678 | if (ring_buffer_time_stamp_abs(cpu_buffer->buffer)) { | 3626 | if (ring_buffer_time_stamp_abs(cpu_buffer->buffer)) { |
| 3679 | add_ts_default = RB_ADD_STAMP_ABSOLUTE; | 3627 | add_ts_default = RB_ADD_STAMP_ABSOLUTE; |
| 3680 | info.length += RB_LEN_TIME_EXTEND; | 3628 | info.length += RB_LEN_TIME_EXTEND; |
| 3681 | if (info.length > BUF_MAX_DATA_SIZE) | 3629 | if (info.length > cpu_buffer->buffer->max_data_size) |
| 3682 | goto out_fail; | 3630 | goto out_fail; |
| 3683 | } else { | 3631 | } else { |
| 3684 | add_ts_default = RB_ADD_STAMP_NONE; | 3632 | add_ts_default = RB_ADD_STAMP_NONE; |
| @@ -3753,7 +3701,7 @@ ring_buffer_lock_reserve(struct trace_buffer *buffer, unsigned long length) · 68 unmodified lines |
| 3753 | if (unlikely(atomic_read(&cpu_buffer->record_disabled))) | 3701 | if (unlikely(atomic_read(&cpu_buffer->record_disabled))) |
| 3754 | goto out; | 3702 | goto out; |
| 3755 | | 3703 | |
| 3756 | if (unlikely(length > BUF_MAX_DATA_SIZE)) | 3704 | if (unlikely(length > buffer->max_data_size)) |
| 3757 | goto out; | 3705 | goto out; |
| 3758 | | 3706 | |
| 3759 | if (unlikely(trace_recursive_lock(cpu_buffer))) | 3707 | if (unlikely(trace_recursive_lock(cpu_buffer))) |
| @@ -3787,7 +3735,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_buffer, · 27 unmodified lines |
| 3787 | struct buffer_page *bpage = cpu_buffer->commit_page; | 3735 | struct buffer_page *bpage = cpu_buffer->commit_page; |
| 3788 | struct buffer_page *start; | 3736 | struct buffer_page *start; |
| 3789 | | 3737 | |
| 3790 | addr &= PAGE_MASK; | 3738 | addr &= ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); |
| 3791 | | 3739 | |
| 3792 | /* Do the likely case first */ | 3740 | /* Do the likely case first */ |
| 3793 | if (likely(bpage->page == (void *)addr)) { | 3741 | if (likely(bpage->page == (void *)addr)) { |
| @@ -3903,7 +3851,7 @@ int ring_buffer_write(struct trace_buffer *buffer, · 109 unmodified lines |
| 3903 | if (atomic_read(&cpu_buffer->record_disabled)) | 3851 | if (atomic_read(&cpu_buffer->record_disabled)) |
| 3904 | goto out; | 3852 | goto out; |
| 3905 | | 3853 | |
| 3906 | if (length > BUF_MAX_DATA_SIZE) | 3854 | if (length > buffer->max_data_size) |
| 3907 | goto out; | 3855 | goto out; |
| 3908 | | 3856 | |
| 3909 | if (unlikely(trace_recursive_lock(cpu_buffer))) | 3857 | if (unlikely(trace_recursive_lock(cpu_buffer))) |
| @@ -4483,6 +4431,7 @@ static struct buffer_page * · 573 unmodified lines |
| 4483 | rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | 4431 | rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) |
| 4484 | { | 4432 | { |
| 4485 | struct buffer_page *reader = NULL; | 4433 | struct buffer_page *reader = NULL; |
| | 4434 | unsigned long bsize = READ_ONCE(cpu_buffer->buffer->subbuf_size); |
| 4486 | unsigned long overwrite; | 4435 | unsigned long overwrite; |
| 4487 | unsigned long flags; | 4436 | unsigned long flags; |
| 4488 | int nr_loops = 0; | 4437 | int nr_loops = 0; |
| @@ -4618,7 +4567,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) · 129 unmodified lines |
| 4618 | #define USECS_WAIT 1000000 | 4567 | #define USECS_WAIT 1000000 |
| 4619 | for (nr_loops = 0; nr_loops < USECS_WAIT; nr_loops++) { | 4568 | for (nr_loops = 0; nr_loops < USECS_WAIT; nr_loops++) { |
| 4620 | /* If the write is past the end of page, a writer is still updating it */ | 4569 | /* If the write is past the end of page, a writer is still updating it */ |
| 4621 | if (likely(!reader || rb_page_write(reader) <= BUF_PAGE_SIZE)) | 4570 | if (likely(!reader || rb_page_write(reader) <= bsize)) |
| 4622 | break; | 4571 | break; |
| 4623 | | 4572 | |
| 4624 | udelay(1); | 4573 | udelay(1); |
| @@ -5062,7 +5011,8 @@ ring_buffer_read_prepare(struct trace_buffer *buffer, int cpu, gfp_t flags) · 437 unmodified lines |
| 5062 | return NULL; | 5011 | return NULL; |
| 5063 | | 5012 | |
| 5064 | /* Holds the entire event: data and meta data */ | 5013 | /* Holds the entire event: data and meta data */ |
| 5065 | iter->event = kmalloc(BUF_PAGE_SIZE, flags); | 5014 | iter->event_size = buffer->subbuf_size; |
| | 5015 | iter->event = kmalloc(iter->event_size, flags); |
| 5066 | if (!iter->event) { | 5016 | if (!iter->event) { |
| 5067 | kfree(iter); | 5017 | kfree(iter); |
| 5068 | return NULL; | 5018 | return NULL; |
| @@ -5178,19 +5128,28 @@ EXPORT_SYMBOL_GPL(ring_buffer_iter_advance); · 109 unmodified lines |
| 5178 | */ | 5128 | */ |
| 5179 | unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu) | 5129 | unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu) |
| 5180 | { | 5130 | { |
| 5181 | /* | | |
| 5182 | * Earlier, this method returned | | |
| 5183 | * BUF_PAGE_SIZE * buffer->nr_pages | | |
| 5184 | * Since the nr_pages field is now removed, we have converted this to | | |
| 5185 | * return the per cpu buffer value. | | |
| 5186 | */ | | |
| 5187 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) | 5131 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
| 5188 | return 0; | 5132 | return 0; |
| 5189 | | 5133 | |
| 5190 | return BUF_PAGE_SIZE * buffer->buffers[cpu]->nr_pages; | 5134 | return buffer->subbuf_size * buffer->buffers[cpu]->nr_pages; |
| 5191 | } | 5135 | } |
| 5192 | EXPORT_SYMBOL_GPL(ring_buffer_size); | 5136 | EXPORT_SYMBOL_GPL(ring_buffer_size); |
| 5193 | | 5137 | |
| | 5138 | /** |
| | 5139 | * ring_buffer_max_event_size - return the max data size of an event |
| | 5140 | * @buffer: The ring buffer. |
| | 5141 | * |
| | 5142 | * Returns the maximum size an event can be. |
| | 5143 | */ |
| | 5144 | unsigned long ring_buffer_max_event_size(struct trace_buffer *buffer) |
| | 5145 | { |
| | 5146 | /* If abs timestamp is requested, events have a timestamp too */ |
| | 5147 | if (ring_buffer_time_stamp_abs(buffer)) |
| | 5148 | return buffer->max_data_size - RB_LEN_TIME_EXTEND; |
| | 5149 | return buffer->max_data_size; |
| | 5150 | } |
| | 5151 | EXPORT_SYMBOL_GPL(ring_buffer_max_event_size); |
| | 5152 | |
| 5194 | static void rb_clear_buffer_page(struct buffer_page *page) | 5153 | static void rb_clear_buffer_page(struct buffer_page *page) |
| 5195 | { | 5154 | { |
| 5196 | local_set(&page->write, 0); | 5155 | local_set(&page->write, 0); |
| @@ -5461,6 +5420,9 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a, · 264 unmodified lines |
| 5461 | if (cpu_buffer_a->nr_pages != cpu_buffer_b->nr_pages) | 5420 | if (cpu_buffer_a->nr_pages != cpu_buffer_b->nr_pages) |
| 5462 | goto out; | 5421 | goto out; |
| 5463 | | 5422 | |
| | 5423 | if (buffer_a->subbuf_order != buffer_b->subbuf_order) |
| | 5424 | goto out; |
| | 5425 | |
| 5464 | ret = -EAGAIN; | 5426 | ret = -EAGAIN; |
| 5465 | | 5427 | |
| 5466 | if (atomic_read(&buffer_a->record_disabled)) | 5428 | if (atomic_read(&buffer_a->record_disabled)) |
| @@ -5532,40 +5494,48 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); · 65 unmodified lines |
| 5532 | * Returns: | 5494 | * Returns: |
| 5533 | * The page allocated, or ERR_PTR | 5495 | * The page allocated, or ERR_PTR |
| 5534 | */ | 5496 | */ |
| 5535 | void *ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu) | 5497 | struct buffer_data_read_page * |
| | 5498 | ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu) |
| 5536 | { | 5499 | { |
| 5537 | struct ring_buffer_per_cpu *cpu_buffer; | 5500 | struct ring_buffer_per_cpu *cpu_buffer; |
| 5538 | struct buffer_data_page *bpage = NULL; | 5501 | struct buffer_data_read_page *bpage = NULL; |
| 5539 | unsigned long flags; | 5502 | unsigned long flags; |
| 5540 | struct page *page; | 5503 | struct page *page; |
| 5541 | | 5504 | |
| 5542 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) | 5505 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
| 5543 | return ERR_PTR(-ENODEV); | 5506 | return ERR_PTR(-ENODEV); |
| 5544 | | 5507 | |
| | 5508 | bpage = kzalloc(sizeof(*bpage), GFP_KERNEL); |
| | 5509 | if (!bpage) |
| | 5510 | return ERR_PTR(-ENOMEM); |
| | 5511 | |
| | 5512 | bpage->order = buffer->subbuf_order; |
| 5545 | cpu_buffer = buffer->buffers[cpu]; | 5513 | cpu_buffer = buffer->buffers[cpu]; |
| 5546 | local_irq_save(flags); | 5514 | local_irq_save(flags); |
| 5547 | arch_spin_lock(&cpu_buffer->lock); | 5515 | arch_spin_lock(&cpu_buffer->lock); |
| 5548 | | 5516 | |
| 5549 | if (cpu_buffer->free_page) { | 5517 | if (cpu_buffer->free_page) { |
| 5550 | bpage = cpu_buffer->free_page; | 5518 | bpage->data = cpu_buffer->free_page; |
| 5551 | cpu_buffer->free_page = NULL; | 5519 | cpu_buffer->free_page = NULL; |
| 5552 | } | 5520 | } |
| 5553 | | 5521 | |
| 5554 | arch_spin_unlock(&cpu_buffer->lock); | 5522 | arch_spin_unlock(&cpu_buffer->lock); |
| 5555 | local_irq_restore(flags); | 5523 | local_irq_restore(flags); |
| 5556 | | 5524 | |
| 5557 | if (bpage) | 5525 | if (bpage->data) |
| 5558 | goto out; | 5526 | goto out; |
| 5559 | | 5527 | |
| 5560 | page = alloc_pages_node(cpu_to_node(cpu), | 5528 | page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL | __GFP_NORETRY, |
| 5561 | GFP_KERNEL | __GFP_NORETRY, 0); | 5529 | cpu_buffer->buffer->subbuf_order); |
| 5562 | if (!page) | 5530 | if (!page) { |
| | 5531 | kfree(bpage); |
| 5563 | return ERR_PTR(-ENOMEM); | 5532 | return ERR_PTR(-ENOMEM); |
| | 5533 | } |
| 5564 | | 5534 | |
| 5565 | bpage = page_address(page); | 5535 | bpage->data = page_address(page); |
| 5566 | | 5536 | |
| 5567 | out: | 5537 | out: |
| 5568 | rb_init_page(bpage); | 5538 | rb_init_page(bpage->data); |
| 5569 | | 5539 | |
| 5570 | return bpage; | 5540 | return bpage; |
| 5571 | } | 5541 | } |
| @@ -5575,14 +5545,15 @@ EXPORT_SYMBOL_GPL(ring_buffer_alloc_read_page); · 3 unmodified lines |
| 5575 | * ring_buffer_free_read_page - free an allocated read page | 5545 | * ring_buffer_free_read_page - free an allocated read page |
| 5576 | * @buffer: the buffer the page was allocate for | 5546 | * @buffer: the buffer the page was allocate for |
| 5577 | * @cpu: the cpu buffer the page came from | 5547 | * @cpu: the cpu buffer the page came from |
| 5578 | * @data: the page to free | 5548 | * @data_page: the page to free |
| 5579 | * | 5549 | * |
| 5580 | * Free a page allocated from ring_buffer_alloc_read_page. | 5550 | * Free a page allocated from ring_buffer_alloc_read_page. |
| 5581 | */ | 5551 | */ |
| 5582 | void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, void *data) | 5552 | void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, |
| | 5553 | struct buffer_data_read_page *data_page) |
| 5583 | { | 5554 | { |
| 5584 | struct ring_buffer_per_cpu *cpu_buffer; | 5555 | struct ring_buffer_per_cpu *cpu_buffer; |
| 5585 | struct buffer_data_page *bpage = data; | 5556 | struct buffer_data_page *bpage = data_page->data; |
| 5586 | struct page *page = virt_to_page(bpage); | 5557 | struct page *page = virt_to_page(bpage); |
| 5587 | unsigned long flags; | 5558 | unsigned long flags; |
| 5588 | | 5559 | |
| @@ -5591,8 +5562,12 @@ void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, void *data · 2 unmodified lines |
| 5591 | | 5562 | |
| 5592 | cpu_buffer = buffer->buffers[cpu]; | 5563 | cpu_buffer = buffer->buffers[cpu]; |
| 5593 | | 5564 | |
| 5594 | /* If the page is still in use someplace else, we can't reuse it */ | 5565 | /* |
| 5595 | if (page_ref_count(page) > 1) | 5566 | * If the page is still in use someplace else, or order of the page |
| | 5567 | * is different from the subbuffer order of the buffer - |
| | 5568 | * we can't reuse it |
| | 5569 | */ |
| | 5570 | if (page_ref_count(page) > 1 || data_page->order != buffer->subbuf_order) |
| 5596 | goto out; | 5571 | goto out; |
| 5597 | | 5572 | |
| 5598 | local_irq_save(flags); | 5573 | local_irq_save(flags); |
| @@ -5607,7 +5582,8 @@ void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, void *data · 8 unmodified lines |
| 5607 | local_irq_restore(flags); | 5582 | local_irq_restore(flags); |
| 5608 | | 5583 | |
| 5609 | out: | 5584 | out: |
| 5610 | free_page((unsigned long)bpage); | 5585 | free_pages((unsigned long)bpage, data_page->order); |
| | 5586 | kfree(data_page); |
| 5611 | } | 5587 | } |
| 5612 | EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); | 5588 | EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); |
| 5613 | | 5589 | |
| @@ -5628,9 +5604,10 @@ EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); · 14 unmodified lines |
| 5628 | * rpage = ring_buffer_alloc_read_page(buffer, cpu); | 5604 | * rpage = ring_buffer_alloc_read_page(buffer, cpu); |
| 5629 | * if (IS_ERR(rpage)) | 5605 | * if (IS_ERR(rpage)) |
| 5630 | * return PTR_ERR(rpage); | 5606 | * return PTR_ERR(rpage); |
| 5631 | * ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0); | 5607 | * ret = ring_buffer_read_page(buffer, rpage, len, cpu, 0); |
| 5632 | * if (ret >= 0) | 5608 | * if (ret >= 0) |
| 5633 | * process_page(rpage, ret); | 5609 | * process_page(ring_buffer_read_page_data(rpage), ret); |
| | 5610 | * ring_buffer_free_read_page(buffer, cpu, rpage); |
| 5634 | * | 5611 | * |
| 5635 | * When @full is set, the function will not return true unless | 5612 | * When @full is set, the function will not return true unless |
| 5636 | * the writer is off the reader page. | 5613 | * the writer is off the reader page. |
| @@ -5645,7 +5622,8 @@ EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); · 8 unmodified lines |
| 5645 | * <0 if no data has been transferred. | 5622 | * <0 if no data has been transferred. |
| 5646 | */ | 5623 | */ |
| 5647 | int ring_buffer_read_page(struct trace_buffer *buffer, | 5624 | int ring_buffer_read_page(struct trace_buffer *buffer, |
| 5648 | void **data_page, size_t len, int cpu, int full) | 5625 | struct buffer_data_read_page *data_page, |
| | 5626 | size_t len, int cpu, int full) |
| 5649 | { | 5627 | { |
| 5650 | struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; | 5628 | struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; |
| 5651 | struct ring_buffer_event *event; | 5629 | struct ring_buffer_event *event; |
| @@ -5670,10 +5648,12 @@ int ring_buffer_read_page(struct trace_buffer *buffer, · 18 unmodified lines |
| 5670 | | 5648 | |
| 5671 | len -= BUF_PAGE_HDR_SIZE; | 5649 | len -= BUF_PAGE_HDR_SIZE; |
| 5672 | | 5650 | |
| 5673 | if (!data_page) | 5651 | if (!data_page || !data_page->data) |
| | 5652 | goto out; |
| | 5653 | if (data_page->order != buffer->subbuf_order) |
| 5674 | goto out; | 5654 | goto out; |
| 5675 | | 5655 | |
| 5676 | bpage = *data_page; | 5656 | bpage = data_page->data; |
| 5677 | if (!bpage) | 5657 | if (!bpage) |
| 5678 | goto out; | 5658 | goto out; |
| 5679 | | 5659 | |
| @@ -5767,11 +5747,11 @@ int ring_buffer_read_page(struct trace_buffer *buffer, · 87 unmodified lines |
| 5767 | /* swap the pages */ | 5747 | /* swap the pages */ |
| 5768 | rb_init_page(bpage); | 5748 | rb_init_page(bpage); |
| 5769 | bpage = reader->page; | 5749 | bpage = reader->page; |
| 5770 | reader->page = *data_page; | 5750 | reader->page = data_page->data; |
| 5771 | local_set(&reader->write, 0); | 5751 | local_set(&reader->write, 0); |
| 5772 | local_set(&reader->entries, 0); | 5752 | local_set(&reader->entries, 0); |
| 5773 | reader->read = 0; | 5753 | reader->read = 0; |
| 5774 | *data_page = bpage; | 5754 | data_page->data = bpage; |
| 5775 | | 5755 | |
| 5776 | /* | 5756 | /* |
| 5777 | * Use the real_end for the data size, | 5757 | * Use the real_end for the data size, |
| @@ -5793,7 +5773,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer, · 15 unmodified lines |
| 5793 | /* If there is room at the end of the page to save the | 5773 | /* If there is room at the end of the page to save the |
| 5794 | * missed events, then record it there. | 5774 | * missed events, then record it there. |
| 5795 | */ | 5775 | */ |
| 5796 | if (BUF_PAGE_SIZE - commit >= sizeof(missed_events)) { | 5776 | if (buffer->subbuf_size - commit >= sizeof(missed_events)) { |
| 5797 | memcpy(&bpage->data[commit], &missed_events, | 5777 | memcpy(&bpage->data[commit], &missed_events, |
| 5798 | sizeof(missed_events)); | 5778 | sizeof(missed_events)); |
| 5799 | local_add(RB_MISSED_STORED, &bpage->commit); | 5779 | local_add(RB_MISSED_STORED, &bpage->commit); |
| @@ -5805,8 +5785,8 @@ int ring_buffer_read_page(struct trace_buffer *buffer, · 5 unmodified lines |
| 5805 | /* | 5785 | /* |
| 5806 | * This page may be off to user land. Zero it out here. | 5786 | * This page may be off to user land. Zero it out here. |
| 5807 | */ | 5787 | */ |
| 5808 | if (commit < BUF_PAGE_SIZE) | 5788 | if (commit < buffer->subbuf_size) |
| 5809 | memset(&bpage->data[commit], 0, BUF_PAGE_SIZE - commit); | 5789 | memset(&bpage->data[commit], 0, buffer->subbuf_size - commit); |
| 5810 | | 5790 | |
| 5811 | out_unlock: | 5791 | out_unlock: |
| 5812 | raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | 5792 | raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |
| @@ -5816,6 +5796,209 @@ int ring_buffer_read_page(struct trace_buffer *buffer, · 3 unmodified lines |
| 5816 | } | 5796 | } |
| 5817 | EXPORT_SYMBOL_GPL(ring_buffer_read_page); | 5797 | EXPORT_SYMBOL_GPL(ring_buffer_read_page); |
| 5818 | | 5798 | |
| | 5799 | /** |
| | 5800 | * ring_buffer_read_page_data - get pointer to the data in the page. |
| | 5801 | * @page: the page to get the data from |
| | 5802 | * |
| | 5803 | * Returns pointer to the actual data in this page. |
| | 5804 | */ |
| | 5805 | void *ring_buffer_read_page_data(struct buffer_data_read_page *page) |
| | 5806 | { |
| | 5807 | return page->data; |
| | 5808 | } |
| | 5809 | EXPORT_SYMBOL_GPL(ring_buffer_read_page_data); |
| | 5810 | |
| | 5811 | /** |
| | 5812 | * ring_buffer_subbuf_size_get - get size of the sub buffer. |
| | 5813 | * @buffer: the buffer to get the sub buffer size from |
| | 5814 | * |
| | 5815 | * Returns size of the sub buffer, in bytes. |
| | 5816 | */ |
| | 5817 | int ring_buffer_subbuf_size_get(struct trace_buffer *buffer) |
| | 5818 | { |
| | 5819 | return buffer->subbuf_size + BUF_PAGE_HDR_SIZE; |
| | 5820 | } |
| | 5821 | EXPORT_SYMBOL_GPL(ring_buffer_subbuf_size_get); |
| | 5822 | |
| | 5823 | /** |
| | 5824 | * ring_buffer_subbuf_order_get - get order of system sub pages in one buffer page. |
| | 5825 | * @buffer: The ring_buffer to get the system sub page order from |
| | 5826 | * |
| | 5827 | * By default, one ring buffer sub page equals to one system page. This parameter |
| | 5828 | * is configurable, per ring buffer. The size of the ring buffer sub page can be |
| | 5829 | * extended, but must be an order of system page size. |
| | 5830 | * |
| | 5831 | * Returns the order of buffer sub page size, in system pages: |
| | 5832 | * 0 means the sub buffer size is 1 system page and so forth. |
| | 5833 | * In case of an error < 0 is returned. |
| | 5834 | */ |
| | 5835 | int ring_buffer_subbuf_order_get(struct trace_buffer *buffer) |
| | 5836 | { |
| | 5837 | if (!buffer) |
| | 5838 | return -EINVAL; |
| | 5839 | |
| | 5840 | return buffer->subbuf_order; |
| | 5841 | } |
| | 5842 | EXPORT_SYMBOL_GPL(ring_buffer_subbuf_order_get); |
| | 5843 | |
| | 5844 | /** |
| | 5845 | * ring_buffer_subbuf_order_set - set the size of ring buffer sub page. |
| | 5846 | * @buffer: The ring_buffer to set the new page size. |
| | 5847 | * @order: Order of the system pages in one sub buffer page |
| | 5848 | * |
| | 5849 | * By default, one ring buffer pages equals to one system page. This API can be |
| | 5850 | * used to set new size of the ring buffer page. The size must be order of |
| | 5851 | * system page size, that's why the input parameter @order is the order of |
| | 5852 | * system pages that are allocated for one ring buffer page: |
| | 5853 | * 0 - 1 system page |
| | 5854 | * 1 - 2 system pages |
| | 5855 | * 3 - 4 system pages |
| | 5856 | * ... |
| | 5857 | * |
| | 5858 | * Returns 0 on success or < 0 in case of an error. |
| | 5859 | */ |
| | 5860 | int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order) |
| | 5861 | { |
| | 5862 | struct ring_buffer_per_cpu *cpu_buffer; |
| | 5863 | struct buffer_page *bpage, *tmp; |
| | 5864 | int old_order, old_size; |
| | 5865 | int nr_pages; |
| | 5866 | int psize; |
| | 5867 | int err; |
| | 5868 | int cpu; |
| | 5869 | |
| | 5870 | if (!buffer || order < 0) |
| | 5871 | return -EINVAL; |
| | 5872 | |
| | 5873 | if (buffer->subbuf_order == order) |
| | 5874 | return 0; |
| | 5875 | |
| | 5876 | psize = (1 << order) * PAGE_SIZE; |
| | 5877 | if (psize <= BUF_PAGE_HDR_SIZE) |
| | 5878 | return -EINVAL; |
| | 5879 | |
| | 5880 | old_order = buffer->subbuf_order; |
| | 5881 | old_size = buffer->subbuf_size; |
| | 5882 | |
| | 5883 | /* prevent another thread from changing buffer sizes */ |
| | 5884 | mutex_lock(&buffer->mutex); |
| | 5885 | atomic_inc(&buffer->record_disabled); |
| | 5886 | |
| | 5887 | /* Make sure all commits have finished */ |
| | 5888 | synchronize_rcu(); |
| | 5889 | |
| | 5890 | buffer->subbuf_order = order; |
| | 5891 | buffer->subbuf_size = psize - BUF_PAGE_HDR_SIZE; |
| | 5892 | |
| | 5893 | /* Make sure all new buffers are allocated, before deleting the old ones */ |
| | 5894 | for_each_buffer_cpu(buffer, cpu) { |
| | 5895 | |
| | 5896 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
| | 5897 | continue; |
| | 5898 | |
| | 5899 | cpu_buffer = buffer->buffers[cpu]; |
| | 5900 | |
| | 5901 | /* Update the number of pages to match the new size */ |
| | 5902 | nr_pages = old_size * buffer->buffers[cpu]->nr_pages; |
| | 5903 | nr_pages = DIV_ROUND_UP(nr_pages, buffer->subbuf_size); |
| | 5904 | |
| | 5905 | /* we need a minimum of two pages */ |
| | 5906 | if (nr_pages < 2) |
| | 5907 | nr_pages = 2; |
| | 5908 | |
| | 5909 | cpu_buffer->nr_pages_to_update = nr_pages; |
| | 5910 | |
| | 5911 | /* Include the reader page */ |
| | 5912 | nr_pages++; |
| | 5913 | |
| | 5914 | /* Allocate the new size buffer */ |
| | 5915 | INIT_LIST_HEAD(&cpu_buffer->new_pages); |
| | 5916 | if (__rb_allocate_pages(cpu_buffer, nr_pages, |
| | 5917 | &cpu_buffer->new_pages)) { |
| | 5918 | /* not enough memory for new pages */ |
| | 5919 | err = -ENOMEM; |
| | 5920 | goto error; |
| | 5921 | } |
| | 5922 | } |
| | 5923 | |
| | 5924 | for_each_buffer_cpu(buffer, cpu) { |
| | 5925 | |
| | 5926 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
| | 5927 | continue; |
| | 5928 | |
| | 5929 | cpu_buffer = buffer->buffers[cpu]; |
| | 5930 | |
| | 5931 | /* Clear the head bit to make the link list normal to read */ |
| | 5932 | rb_head_page_deactivate(cpu_buffer); |
| | 5933 | |
| | 5934 | /* Now walk the list and free all the old sub buffers */ |
| | 5935 | list_for_each_entry_safe(bpage, tmp, cpu_buffer->pages, list) { |
| | 5936 | list_del_init(&bpage->list); |
| | 5937 | free_buffer_page(bpage); |
| | 5938 | } |
| | 5939 | /* The above loop stopped an the last page needing to be freed */ |
| | 5940 | bpage = list_entry(cpu_buffer->pages, struct buffer_page, list); |
| | 5941 | free_buffer_page(bpage); |
| | 5942 | |
| | 5943 | /* Free the current reader page */ |
| | 5944 | free_buffer_page(cpu_buffer->reader_page); |
| | 5945 | |
| | 5946 | /* One page was allocated for the reader page */ |
| | 5947 | cpu_buffer->reader_page = list_entry(cpu_buffer->new_pages.next, |
| | 5948 | struct buffer_page, list); |
| | 5949 | list_del_init(&cpu_buffer->reader_page->list); |
| | 5950 | |
| | 5951 | /* The cpu_buffer pages are a link list with no head */ |
| | 5952 | cpu_buffer->pages = cpu_buffer->new_pages.next; |
| | 5953 | cpu_buffer->new_pages.next->prev = cpu_buffer->new_pages.prev; |
| | 5954 | cpu_buffer->new_pages.prev->next = cpu_buffer->new_pages.next; |
| | 5955 | |
| | 5956 | /* Clear the new_pages list */ |
| | 5957 | INIT_LIST_HEAD(&cpu_buffer->new_pages); |
| | 5958 | |
| | 5959 | cpu_buffer->head_page |
| | 5960 | = list_entry(cpu_buffer->pages, struct buffer_page, list); |
| | 5961 | cpu_buffer->tail_page = cpu_buffer->commit_page = cpu_buffer->head_page; |
| | 5962 | |
| | 5963 | cpu_buffer->nr_pages = cpu_buffer->nr_pages_to_update; |
| | 5964 | cpu_buffer->nr_pages_to_update = 0; |
| | 5965 | |
| | 5966 | free_pages((unsigned long)cpu_buffer->free_page, old_order); |
| | 5967 | cpu_buffer->free_page = NULL; |
| | 5968 | |
| | 5969 | rb_head_page_activate(cpu_buffer); |
| | 5970 | |
| | 5971 | rb_check_pages(cpu_buffer); |
| | 5972 | } |
| | 5973 | |
| | 5974 | atomic_dec(&buffer->record_disabled); |
| | 5975 | mutex_unlock(&buffer->mutex); |
| | 5976 | |
| | 5977 | return 0; |
| | 5978 | |
| | 5979 | error: |
| | 5980 | buffer->subbuf_order = old_order; |
| | 5981 | buffer->subbuf_size = old_size; |
| | 5982 | |
| | 5983 | atomic_dec(&buffer->record_disabled); |
| | 5984 | mutex_unlock(&buffer->mutex); |
| | 5985 | |
| | 5986 | for_each_buffer_cpu(buffer, cpu) { |
| | 5987 | cpu_buffer = buffer->buffers[cpu]; |
| | 5988 | |
| | 5989 | if (!cpu_buffer->nr_pages_to_update) |
| | 5990 | continue; |
| | 5991 | |
| | 5992 | list_for_each_entry_safe(bpage, tmp, &cpu_buffer->new_pages, list) { |
| | 5993 | list_del_init(&bpage->list); |
| | 5994 | free_buffer_page(bpage); |
| | 5995 | } |
| | 5996 | } |
| | 5997 | |
| | 5998 | return err; |
| | 5999 | } |
| | 6000 | EXPORT_SYMBOL_GPL(ring_buffer_subbuf_order_set); |
| | 6001 | |
| 5819 | /* | 6002 | /* |
| 5820 | * We only allocate new buffers, never free them if the CPU goes down. | 6003 | * We only allocate new buffers, never free them if the CPU goes down. |
| 5821 | * If we were to free the buffer, then the user would lose any trace that was in | 6004 | * If we were to free the buffer, then the user would lose any trace that was in |