42
42
43
43
static void update_pages_handler (struct work_struct * work );
44
44
45
+ struct ring_buffer_meta {
46
+ };
47
+
45
48
/*
46
49
* The ring buffer header is special. We must manually up keep it.
47
50
*/
@@ -342,7 +345,8 @@ struct buffer_page {
342
345
local_t entries ; /* entries on this page */
343
346
unsigned long real_end ; /* real end of data */
344
347
unsigned order ; /* order of the page */
345
- u32 id ; /* ID for external mapping */
348
+ u32 id :30 ; /* ID for external mapping */
349
+ u32 range :1 ; /* Mapped via a range */
346
350
struct buffer_data_page * page ; /* Actual data page */
347
351
};
348
352
@@ -373,7 +377,9 @@ static __always_inline unsigned int rb_page_commit(struct buffer_page *bpage)
373
377
374
378
static void free_buffer_page (struct buffer_page * bpage )
375
379
{
376
- free_pages ((unsigned long )bpage -> page , bpage -> order );
380
+ /* Range pages are not to be freed */
381
+ if (!bpage -> range )
382
+ free_pages ((unsigned long )bpage -> page , bpage -> order );
377
383
kfree (bpage );
378
384
}
379
385
@@ -524,6 +530,9 @@ struct trace_buffer {
524
530
struct rb_irq_work irq_work ;
525
531
bool time_stamp_abs ;
526
532
533
+ unsigned long range_addr_start ;
534
+ unsigned long range_addr_end ;
535
+
527
536
unsigned int subbuf_size ;
528
537
unsigned int subbuf_order ;
529
538
unsigned int max_data_size ;
@@ -1491,9 +1500,70 @@ static void rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
1491
1500
}
1492
1501
}
1493
1502
1503
+ /*
1504
+ * Take an address, add the meta data size as well as the array of
1505
+ * array subbuffer indexes, then align it to a subbuffer size.
1506
+ *
1507
+ * This is used to help find the next per cpu subbuffer within a mapped range.
1508
+ */
1509
+ static unsigned long
1510
+ rb_range_align_subbuf (unsigned long addr , int subbuf_size , int nr_subbufs )
1511
+ {
1512
+ addr += sizeof (struct ring_buffer_meta ) +
1513
+ sizeof (int ) * nr_subbufs ;
1514
+ return ALIGN (addr , subbuf_size );
1515
+ }
1516
+
1517
+ /*
1518
+ * Return a specific sub-buffer for a given @cpu defined by @idx.
1519
+ */
1520
+ static void * rb_range_buffer (struct trace_buffer * buffer , int cpu , int nr_pages , int idx )
1521
+ {
1522
+ unsigned long ptr ;
1523
+ int subbuf_size = buffer -> subbuf_size + BUF_PAGE_HDR_SIZE ;
1524
+ int nr_subbufs ;
1525
+
1526
+ /* Include the reader page */
1527
+ nr_subbufs = nr_pages + 1 ;
1528
+
1529
+ /*
1530
+ * The first chunk may not be subbuffer aligned, where as
1531
+ * the rest of the chunks are.
1532
+ */
1533
+ ptr = buffer -> range_addr_start ;
1534
+ ptr = rb_range_align_subbuf (ptr , subbuf_size , nr_subbufs );
1535
+ if (cpu ) {
1536
+ unsigned long p ;
1537
+
1538
+ ptr += subbuf_size * nr_subbufs ;
1539
+
1540
+ /* Save the beginning of this CPU chunk */
1541
+ p = ptr ;
1542
+
1543
+ ptr = rb_range_align_subbuf (ptr , subbuf_size , nr_subbufs );
1544
+
1545
+ /* We can use multiplication to find chunks greater than 1 */
1546
+ if (cpu > 1 ) {
1547
+ unsigned long size ;
1548
+
1549
+ ptr += subbuf_size * nr_subbufs ;
1550
+
1551
+ /* Now all chunks after this are the same size */
1552
+ size = ptr - p ;
1553
+ ptr += size * (cpu - 2 );
1554
+
1555
+ ptr = rb_range_align_subbuf (ptr , subbuf_size , nr_subbufs );
1556
+ }
1557
+ }
1558
+ if (ptr + subbuf_size * nr_subbufs > buffer -> range_addr_end )
1559
+ return NULL ;
1560
+ return (void * )ptr ;
1561
+ }
1562
+
1494
1563
static int __rb_allocate_pages (struct ring_buffer_per_cpu * cpu_buffer ,
1495
1564
long nr_pages , struct list_head * pages )
1496
1565
{
1566
+ struct trace_buffer * buffer = cpu_buffer -> buffer ;
1497
1567
struct buffer_page * bpage , * tmp ;
1498
1568
bool user_thread = current -> mm != NULL ;
1499
1569
gfp_t mflags ;
@@ -1530,6 +1600,7 @@ static int __rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
1530
1600
set_current_oom_origin ();
1531
1601
for (i = 0 ; i < nr_pages ; i ++ ) {
1532
1602
struct page * page ;
1603
+ int cpu = cpu_buffer -> cpu ;
1533
1604
1534
1605
bpage = kzalloc_node (ALIGN (sizeof (* bpage ), cache_line_size ()),
1535
1606
mflags , cpu_to_node (cpu_buffer -> cpu ));
@@ -1538,14 +1609,26 @@ static int __rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
1538
1609
1539
1610
rb_check_bpage (cpu_buffer , bpage );
1540
1611
1541
- list_add (& bpage -> list , pages );
1542
-
1543
- page = alloc_pages_node (cpu_to_node (cpu_buffer -> cpu ),
1544
- mflags | __GFP_COMP | __GFP_ZERO ,
1545
- cpu_buffer -> buffer -> subbuf_order );
1546
- if (!page )
1547
- goto free_pages ;
1548
- bpage -> page = page_address (page );
1612
+ /*
1613
+ * Append the pages as for mapped buffers we want to keep
1614
+ * the order
1615
+ */
1616
+ list_add_tail (& bpage -> list , pages );
1617
+
1618
+ if (buffer -> range_addr_start ) {
1619
+ /* A range was given. Use that for the buffer page */
1620
+ bpage -> page = rb_range_buffer (buffer , cpu , nr_pages , i + 1 );
1621
+ if (!bpage -> page )
1622
+ goto free_pages ;
1623
+ bpage -> range = 1 ;
1624
+ } else {
1625
+ page = alloc_pages_node (cpu_to_node (cpu_buffer -> cpu ),
1626
+ mflags | __GFP_COMP | __GFP_ZERO ,
1627
+ cpu_buffer -> buffer -> subbuf_order );
1628
+ if (!page )
1629
+ goto free_pages ;
1630
+ bpage -> page = page_address (page );
1631
+ }
1549
1632
bpage -> order = cpu_buffer -> buffer -> subbuf_order ;
1550
1633
rb_init_page (bpage -> page );
1551
1634
@@ -1627,11 +1710,19 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, long nr_pages, int cpu)
1627
1710
1628
1711
cpu_buffer -> reader_page = bpage ;
1629
1712
1630
- page = alloc_pages_node (cpu_to_node (cpu ), GFP_KERNEL | __GFP_COMP | __GFP_ZERO ,
1631
- cpu_buffer -> buffer -> subbuf_order );
1632
- if (!page )
1633
- goto fail_free_reader ;
1634
- bpage -> page = page_address (page );
1713
+ if (buffer -> range_addr_start ) {
1714
+ bpage -> page = rb_range_buffer (buffer , cpu , nr_pages , 0 );
1715
+ if (!bpage -> page )
1716
+ goto fail_free_reader ;
1717
+ bpage -> range = 1 ;
1718
+ } else {
1719
+ page = alloc_pages_node (cpu_to_node (cpu ),
1720
+ GFP_KERNEL | __GFP_COMP | __GFP_ZERO ,
1721
+ cpu_buffer -> buffer -> subbuf_order );
1722
+ if (!page )
1723
+ goto fail_free_reader ;
1724
+ bpage -> page = page_address (page );
1725
+ }
1635
1726
rb_init_page (bpage -> page );
1636
1727
1637
1728
INIT_LIST_HEAD (& cpu_buffer -> reader_page -> list );
@@ -1682,22 +1773,14 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
1682
1773
kfree (cpu_buffer );
1683
1774
}
1684
1775
1685
- /**
1686
- * __ring_buffer_alloc - allocate a new ring_buffer
1687
- * @size: the size in bytes per cpu that is needed.
1688
- * @flags: attributes to set for the ring buffer.
1689
- * @key: ring buffer reader_lock_key.
1690
- *
1691
- * Currently the only flag that is available is the RB_FL_OVERWRITE
1692
- * flag. This flag means that the buffer will overwrite old data
1693
- * when the buffer wraps. If this flag is not set, the buffer will
1694
- * drop data when the tail hits the head.
1695
- */
1696
- struct trace_buffer * __ring_buffer_alloc (unsigned long size , unsigned flags ,
1697
- struct lock_class_key * key )
1776
+ static struct trace_buffer * alloc_buffer (unsigned long size , unsigned flags ,
1777
+ int order , unsigned long start ,
1778
+ unsigned long end ,
1779
+ struct lock_class_key * key )
1698
1780
{
1699
1781
struct trace_buffer * buffer ;
1700
1782
long nr_pages ;
1783
+ int subbuf_size ;
1701
1784
int bsize ;
1702
1785
int cpu ;
1703
1786
int ret ;
@@ -1711,25 +1794,20 @@ struct trace_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags,
1711
1794
if (!zalloc_cpumask_var (& buffer -> cpumask , GFP_KERNEL ))
1712
1795
goto fail_free_buffer ;
1713
1796
1714
- /* Default buffer page size - one system page */
1715
- buffer -> subbuf_order = 0 ;
1716
- buffer -> subbuf_size = PAGE_SIZE - BUF_PAGE_HDR_SIZE ;
1797
+ buffer -> subbuf_order = order ;
1798
+ subbuf_size = ( PAGE_SIZE << order ) ;
1799
+ buffer -> subbuf_size = subbuf_size - BUF_PAGE_HDR_SIZE ;
1717
1800
1718
1801
/* Max payload is buffer page size - header (8bytes) */
1719
1802
buffer -> max_data_size = buffer -> subbuf_size - (sizeof (u32 ) * 2 );
1720
1803
1721
- nr_pages = DIV_ROUND_UP (size , buffer -> subbuf_size );
1722
1804
buffer -> flags = flags ;
1723
1805
buffer -> clock = trace_clock_local ;
1724
1806
buffer -> reader_lock_key = key ;
1725
1807
1726
1808
init_irq_work (& buffer -> irq_work .work , rb_wake_up_waiters );
1727
1809
init_waitqueue_head (& buffer -> irq_work .waiters );
1728
1810
1729
- /* need at least two pages */
1730
- if (nr_pages < 2 )
1731
- nr_pages = 2 ;
1732
-
1733
1811
buffer -> cpus = nr_cpu_ids ;
1734
1812
1735
1813
bsize = sizeof (void * ) * nr_cpu_ids ;
@@ -1738,6 +1816,54 @@ struct trace_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags,
1738
1816
if (!buffer -> buffers )
1739
1817
goto fail_free_cpumask ;
1740
1818
1819
+ /* If start/end are specified, then that overrides size */
1820
+ if (start && end ) {
1821
+ unsigned long ptr ;
1822
+ int n ;
1823
+
1824
+ size = end - start ;
1825
+ size = size / nr_cpu_ids ;
1826
+
1827
+ /*
1828
+ * The number of sub-buffers (nr_pages) is determined by the
1829
+ * total size allocated minus the meta data size.
1830
+ * Then that is divided by the number of per CPU buffers
1831
+ * needed, plus account for the integer array index that
1832
+ * will be appended to the meta data.
1833
+ */
1834
+ nr_pages = (size - sizeof (struct ring_buffer_meta )) /
1835
+ (subbuf_size + sizeof (int ));
1836
+ /* Need at least two pages plus the reader page */
1837
+ if (nr_pages < 3 )
1838
+ goto fail_free_buffers ;
1839
+
1840
+ again :
1841
+ /* Make sure that the size fits aligned */
1842
+ for (n = 0 , ptr = start ; n < nr_cpu_ids ; n ++ ) {
1843
+ ptr += sizeof (struct ring_buffer_meta ) +
1844
+ sizeof (int ) * nr_pages ;
1845
+ ptr = ALIGN (ptr , subbuf_size );
1846
+ ptr += subbuf_size * nr_pages ;
1847
+ }
1848
+ if (ptr > end ) {
1849
+ if (nr_pages <= 3 )
1850
+ goto fail_free_buffers ;
1851
+ nr_pages -- ;
1852
+ goto again ;
1853
+ }
1854
+
1855
+ /* nr_pages should not count the reader page */
1856
+ nr_pages -- ;
1857
+ buffer -> range_addr_start = start ;
1858
+ buffer -> range_addr_end = end ;
1859
+ } else {
1860
+
1861
+ /* need at least two pages */
1862
+ nr_pages = DIV_ROUND_UP (size , buffer -> subbuf_size );
1863
+ if (nr_pages < 2 )
1864
+ nr_pages = 2 ;
1865
+ }
1866
+
1741
1867
cpu = raw_smp_processor_id ();
1742
1868
cpumask_set_cpu (cpu , buffer -> cpumask );
1743
1869
buffer -> buffers [cpu ] = rb_allocate_cpu_buffer (buffer , nr_pages , cpu );
@@ -1766,8 +1892,49 @@ struct trace_buffer *__ring_buffer_alloc(unsigned long size, unsigned flags,
1766
1892
kfree (buffer );
1767
1893
return NULL ;
1768
1894
}
1895
+
1896
+ /**
1897
+ * __ring_buffer_alloc - allocate a new ring_buffer
1898
+ * @size: the size in bytes per cpu that is needed.
1899
+ * @flags: attributes to set for the ring buffer.
1900
+ * @key: ring buffer reader_lock_key.
1901
+ *
1902
+ * Currently the only flag that is available is the RB_FL_OVERWRITE
1903
+ * flag. This flag means that the buffer will overwrite old data
1904
+ * when the buffer wraps. If this flag is not set, the buffer will
1905
+ * drop data when the tail hits the head.
1906
+ */
1907
+ struct trace_buffer * __ring_buffer_alloc (unsigned long size , unsigned flags ,
1908
+ struct lock_class_key * key )
1909
+ {
1910
+ /* Default buffer page size - one system page */
1911
+ return alloc_buffer (size , flags , 0 , 0 , 0 ,key );
1912
+
1913
+ }
1769
1914
EXPORT_SYMBOL_GPL (__ring_buffer_alloc );
1770
1915
1916
+ /**
1917
+ * __ring_buffer_alloc_range - allocate a new ring_buffer from existing memory
1918
+ * @size: the size in bytes per cpu that is needed.
1919
+ * @flags: attributes to set for the ring buffer.
1920
+ * @start: start of allocated range
1921
+ * @range_size: size of allocated range
1922
+ * @order: sub-buffer order
1923
+ * @key: ring buffer reader_lock_key.
1924
+ *
1925
+ * Currently the only flag that is available is the RB_FL_OVERWRITE
1926
+ * flag. This flag means that the buffer will overwrite old data
1927
+ * when the buffer wraps. If this flag is not set, the buffer will
1928
+ * drop data when the tail hits the head.
1929
+ */
1930
+ struct trace_buffer * __ring_buffer_alloc_range (unsigned long size , unsigned flags ,
1931
+ int order , unsigned long start ,
1932
+ unsigned long range_size ,
1933
+ struct lock_class_key * key )
1934
+ {
1935
+ return alloc_buffer (size , flags , order , start , start + range_size , key );
1936
+ }
1937
+
1771
1938
/**
1772
1939
* ring_buffer_free - free a ring buffer.
1773
1940
* @buffer: the buffer to free.
0 commit comments