@@ -1673,69 +1673,51 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
1673
1673
}
1674
1674
1675
1675
/* Compose only probe arg */
1676
- int synthesize_perf_probe_arg (struct perf_probe_arg * pa , char * buf , size_t len )
1676
+ char * synthesize_perf_probe_arg (struct perf_probe_arg * pa )
1677
1677
{
1678
1678
struct perf_probe_arg_field * field = pa -> field ;
1679
- int ret ;
1680
- char * tmp = buf ;
1679
+ struct strbuf buf ;
1680
+ char * ret ;
1681
1681
1682
+ strbuf_init (& buf , 64 );
1682
1683
if (pa -> name && pa -> var )
1683
- ret = e_snprintf ( tmp , len , "%s=%s" , pa -> name , pa -> var );
1684
+ strbuf_addf ( & buf , "%s=%s" , pa -> name , pa -> var );
1684
1685
else
1685
- ret = e_snprintf (tmp , len , "%s" , pa -> name ? pa -> name : pa -> var );
1686
- if (ret <= 0 )
1687
- goto error ;
1688
- tmp += ret ;
1689
- len -= ret ;
1686
+ strbuf_addstr (& buf , pa -> name ?: pa -> var );
1690
1687
1691
1688
while (field ) {
1692
1689
if (field -> name [0 ] == '[' )
1693
- ret = e_snprintf ( tmp , len , "%s" , field -> name );
1690
+ strbuf_addstr ( & buf , field -> name );
1694
1691
else
1695
- ret = e_snprintf (tmp , len , "%s%s" ,
1696
- field -> ref ? "->" : "." , field -> name );
1697
- if (ret <= 0 )
1698
- goto error ;
1699
- tmp += ret ;
1700
- len -= ret ;
1692
+ strbuf_addf (& buf , "%s%s" , field -> ref ? "->" : "." ,
1693
+ field -> name );
1701
1694
field = field -> next ;
1702
1695
}
1703
1696
1704
- if (pa -> type ) {
1705
- ret = e_snprintf (tmp , len , ":%s" , pa -> type );
1706
- if (ret <= 0 )
1707
- goto error ;
1708
- tmp += ret ;
1709
- len -= ret ;
1710
- }
1697
+ if (pa -> type )
1698
+ strbuf_addf (& buf , ":%s" , pa -> type );
1699
+
1700
+ ret = strbuf_detach (& buf , NULL );
1711
1701
1712
- return tmp - buf ;
1713
- error :
1714
- pr_debug ("Failed to synthesize perf probe argument: %d\n" , ret );
1715
1702
return ret ;
1716
1703
}
1717
1704
1718
1705
/* Compose only probe point (not argument) */
1719
1706
static char * synthesize_perf_probe_point (struct perf_probe_point * pp )
1720
1707
{
1721
- char * buf , * tmp ;
1722
- char offs [32 ] = "" , line [32 ] = "" , file [32 ] = "" ;
1723
- int ret , len ;
1724
-
1725
- buf = zalloc (MAX_CMDLEN );
1726
- if (buf == NULL ) {
1727
- ret = - ENOMEM ;
1728
- goto error ;
1729
- }
1730
- if (pp -> offset ) {
1731
- ret = e_snprintf (offs , 32 , "+%lu" , pp -> offset );
1732
- if (ret <= 0 )
1733
- goto error ;
1734
- }
1735
- if (pp -> line ) {
1736
- ret = e_snprintf (line , 32 , ":%d" , pp -> line );
1737
- if (ret <= 0 )
1738
- goto error ;
1708
+ struct strbuf buf ;
1709
+ char * tmp ;
1710
+ int len ;
1711
+
1712
+ strbuf_init (& buf , 64 );
1713
+ if (pp -> function ) {
1714
+ strbuf_addstr (& buf , pp -> function );
1715
+ if (pp -> offset )
1716
+ strbuf_addf (& buf , "+%lu" , pp -> offset );
1717
+ else if (pp -> line )
1718
+ strbuf_addf (& buf , ":%d" , pp -> line );
1719
+ else if (pp -> retprobe )
1720
+ strbuf_addstr (& buf , "%return" );
1739
1721
}
1740
1722
if (pp -> file ) {
1741
1723
tmp = pp -> file ;
@@ -1744,25 +1726,12 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
1744
1726
tmp = strchr (pp -> file + len - 30 , '/' );
1745
1727
tmp = tmp ? tmp + 1 : pp -> file + len - 30 ;
1746
1728
}
1747
- ret = e_snprintf ( file , 32 , "@%s" , tmp );
1748
- if (ret <= 0 )
1749
- goto error ;
1729
+ strbuf_addf ( & buf , "@%s" , tmp );
1730
+ if (! pp -> function && pp -> line )
1731
+ strbuf_addf ( & buf , ":%d" , pp -> line ) ;
1750
1732
}
1751
1733
1752
- if (pp -> function )
1753
- ret = e_snprintf (buf , MAX_CMDLEN , "%s%s%s%s%s" , pp -> function ,
1754
- offs , pp -> retprobe ? "%return" : "" , line ,
1755
- file );
1756
- else
1757
- ret = e_snprintf (buf , MAX_CMDLEN , "%s%s" , file , line );
1758
- if (ret <= 0 )
1759
- goto error ;
1760
-
1761
- return buf ;
1762
- error :
1763
- pr_debug ("Failed to synthesize perf probe point: %d\n" , ret );
1764
- free (buf );
1765
- return NULL ;
1734
+ return strbuf_detach (& buf , NULL );
1766
1735
}
1767
1736
1768
1737
#if 0
@@ -1791,106 +1760,72 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev)
1791
1760
#endif
1792
1761
1793
1762
static int __synthesize_probe_trace_arg_ref (struct probe_trace_arg_ref * ref ,
1794
- char * * buf , size_t * buflen ,
1795
- int depth )
1763
+ struct strbuf * buf , int depth )
1796
1764
{
1797
- int ret ;
1798
1765
if (ref -> next ) {
1799
1766
depth = __synthesize_probe_trace_arg_ref (ref -> next , buf ,
1800
- buflen , depth + 1 );
1767
+ depth + 1 );
1801
1768
if (depth < 0 )
1802
1769
goto out ;
1803
1770
}
1804
-
1805
- ret = e_snprintf (* buf , * buflen , "%+ld(" , ref -> offset );
1806
- if (ret < 0 )
1807
- depth = ret ;
1808
- else {
1809
- * buf += ret ;
1810
- * buflen -= ret ;
1811
- }
1771
+ strbuf_addf (buf , "%+ld(" , ref -> offset );
1812
1772
out :
1813
1773
return depth ;
1814
-
1815
1774
}
1816
1775
1817
1776
static int synthesize_probe_trace_arg (struct probe_trace_arg * arg ,
1818
- char * buf , size_t buflen )
1777
+ struct strbuf * buf )
1819
1778
{
1820
1779
struct probe_trace_arg_ref * ref = arg -> ref ;
1821
- int ret , depth = 0 ;
1822
- char * tmp = buf ;
1780
+ int depth = 0 ;
1823
1781
1824
1782
/* Argument name or separator */
1825
1783
if (arg -> name )
1826
- ret = e_snprintf (buf , buflen , " %s=" , arg -> name );
1784
+ strbuf_addf (buf , " %s=" , arg -> name );
1827
1785
else
1828
- ret = e_snprintf (buf , buflen , " " );
1829
- if (ret < 0 )
1830
- return ret ;
1831
- buf += ret ;
1832
- buflen -= ret ;
1786
+ strbuf_addch (buf , ' ' );
1833
1787
1834
1788
/* Special case: @XXX */
1835
1789
if (arg -> value [0 ] == '@' && arg -> ref )
1836
1790
ref = ref -> next ;
1837
1791
1838
1792
/* Dereferencing arguments */
1839
1793
if (ref ) {
1840
- depth = __synthesize_probe_trace_arg_ref (ref , & buf ,
1841
- & buflen , 1 );
1794
+ depth = __synthesize_probe_trace_arg_ref (ref , buf , 1 );
1842
1795
if (depth < 0 )
1843
1796
return depth ;
1844
1797
}
1845
1798
1846
1799
/* Print argument value */
1847
1800
if (arg -> value [0 ] == '@' && arg -> ref )
1848
- ret = e_snprintf (buf , buflen , "%s%+ld" , arg -> value ,
1849
- arg -> ref -> offset );
1801
+ strbuf_addf (buf , "%s%+ld" , arg -> value , arg -> ref -> offset );
1850
1802
else
1851
- ret = e_snprintf (buf , buflen , "%s" , arg -> value );
1852
- if (ret < 0 )
1853
- return ret ;
1854
- buf += ret ;
1855
- buflen -= ret ;
1803
+ strbuf_addstr (buf , arg -> value );
1856
1804
1857
1805
/* Closing */
1858
- while (depth -- ) {
1859
- ret = e_snprintf (buf , buflen , ")" );
1860
- if (ret < 0 )
1861
- return ret ;
1862
- buf += ret ;
1863
- buflen -= ret ;
1864
- }
1806
+ while (depth -- )
1807
+ strbuf_addch (buf , ')' );
1865
1808
/* Print argument type */
1866
- if (arg -> type ) {
1867
- ret = e_snprintf (buf , buflen , ":%s" , arg -> type );
1868
- if (ret <= 0 )
1869
- return ret ;
1870
- buf += ret ;
1871
- }
1809
+ if (arg -> type )
1810
+ strbuf_addf (buf , ":%s" , arg -> type );
1872
1811
1873
- return buf - tmp ;
1812
+ return 0 ;
1874
1813
}
1875
1814
1876
1815
char * synthesize_probe_trace_command (struct probe_trace_event * tev )
1877
1816
{
1878
1817
struct probe_trace_point * tp = & tev -> point ;
1879
- char * buf ;
1880
- int i , len , ret ;
1881
-
1882
- buf = zalloc (MAX_CMDLEN );
1883
- if (buf == NULL )
1884
- return NULL ;
1885
-
1886
- len = e_snprintf (buf , MAX_CMDLEN , "%c:%s/%s " , tp -> retprobe ? 'r' : 'p' ,
1887
- tev -> group , tev -> event );
1888
- if (len <= 0 )
1889
- goto error ;
1818
+ struct strbuf buf ;
1819
+ char * ret = NULL ;
1820
+ int i ;
1890
1821
1891
1822
/* Uprobes must have tp->module */
1892
1823
if (tev -> uprobes && !tp -> module )
1893
- goto error ;
1824
+ return NULL ;
1825
+
1826
+ strbuf_init (& buf , 32 );
1827
+ strbuf_addf (& buf , "%c:%s/%s " , tp -> retprobe ? 'r' : 'p' ,
1828
+ tev -> group , tev -> event );
1894
1829
/*
1895
1830
* If tp->address == 0, then this point must be a
1896
1831
* absolute address uprobe.
@@ -1904,34 +1839,23 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
1904
1839
1905
1840
/* Use the tp->address for uprobes */
1906
1841
if (tev -> uprobes )
1907
- ret = e_snprintf (buf + len , MAX_CMDLEN - len , "%s:0x%lx" ,
1908
- tp -> module , tp -> address );
1842
+ strbuf_addf (& buf , "%s:0x%lx" , tp -> module , tp -> address );
1909
1843
else if (!strncmp (tp -> symbol , "0x" , 2 ))
1910
1844
/* Absolute address. See try_to_find_absolute_address() */
1911
- ret = e_snprintf (buf + len , MAX_CMDLEN - len , "%s%s0x%lx" ,
1912
- tp -> module ?: "" , tp -> module ? ":" : "" ,
1913
- tp -> address );
1845
+ strbuf_addf (& buf , "%s%s0x%lx" , tp -> module ?: "" ,
1846
+ tp -> module ? ":" : "" , tp -> address );
1914
1847
else
1915
- ret = e_snprintf (buf + len , MAX_CMDLEN - len , "%s%s%s+%lu" ,
1916
- tp -> module ?: "" , tp -> module ? ":" : "" ,
1917
- tp -> symbol , tp -> offset );
1918
-
1919
- if (ret <= 0 )
1920
- goto error ;
1921
- len += ret ;
1848
+ strbuf_addf (& buf , "%s%s%s+%lu" , tp -> module ?: "" ,
1849
+ tp -> module ? ":" : "" , tp -> symbol , tp -> offset );
1922
1850
1923
- for (i = 0 ; i < tev -> nargs ; i ++ ) {
1924
- ret = synthesize_probe_trace_arg (& tev -> args [i ], buf + len ,
1925
- MAX_CMDLEN - len );
1926
- if (ret <= 0 )
1851
+ for (i = 0 ; i < tev -> nargs ; i ++ )
1852
+ if (synthesize_probe_trace_arg (& tev -> args [i ], & buf ) < 0 )
1927
1853
goto error ;
1928
- len += ret ;
1929
- }
1930
1854
1931
- return buf ;
1855
+ ret = strbuf_detach ( & buf , NULL ) ;
1932
1856
error :
1933
- free ( buf );
1934
- return NULL ;
1857
+ strbuf_release ( & buf );
1858
+ return ret ;
1935
1859
}
1936
1860
1937
1861
static int find_perf_probe_point_from_map (struct probe_trace_point * tp ,
@@ -2013,7 +1937,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
2013
1937
static int convert_to_perf_probe_event (struct probe_trace_event * tev ,
2014
1938
struct perf_probe_event * pev , bool is_kprobe )
2015
1939
{
2016
- char buf [ 64 ] = "" ;
1940
+ struct strbuf buf = STRBUF_INIT ;
2017
1941
int i , ret ;
2018
1942
2019
1943
/* Convert event/group name */
@@ -2036,9 +1960,9 @@ static int convert_to_perf_probe_event(struct probe_trace_event *tev,
2036
1960
if (tev -> args [i ].name )
2037
1961
pev -> args [i ].name = strdup (tev -> args [i ].name );
2038
1962
else {
2039
- ret = synthesize_probe_trace_arg ( & tev -> args [ i ],
2040
- buf , 64 );
2041
- pev -> args [i ].name = strdup ( buf );
1963
+ strbuf_init ( & buf , 32 );
1964
+ ret = synthesize_probe_trace_arg ( & tev -> args [ i ], & buf );
1965
+ pev -> args [i ].name = strbuf_detach ( & buf , NULL );
2042
1966
}
2043
1967
if (pev -> args [i ].name == NULL && ret >= 0 )
2044
1968
ret = - ENOMEM ;
@@ -2216,37 +2140,37 @@ static int perf_probe_event__sprintf(const char *group, const char *event,
2216
2140
const char * module ,
2217
2141
struct strbuf * result )
2218
2142
{
2219
- int i , ret ;
2220
- char buf [128 ];
2221
- char * place ;
2143
+ int i ;
2144
+ char * buf ;
2222
2145
2223
- /* Synthesize only event probe point */
2224
- place = synthesize_perf_probe_point ( & pev -> point ) ;
2225
- if (! place )
2226
- return - EINVAL ;
2146
+ if ( asprintf ( & buf , "%s:%s" , group , event ) < 0 )
2147
+ return - errno ;
2148
+ strbuf_addf ( result , " %-20s (on " , buf );
2149
+ free ( buf ) ;
2227
2150
2228
- ret = e_snprintf (buf , 128 , "%s:%s" , group , event );
2229
- if (ret < 0 )
2230
- goto out ;
2151
+ /* Synthesize only event probe point */
2152
+ buf = synthesize_perf_probe_point (& pev -> point );
2153
+ if (!buf )
2154
+ return - ENOMEM ;
2155
+ strbuf_addstr (result , buf );
2156
+ free (buf );
2231
2157
2232
- strbuf_addf (result , " %-20s (on %s" , buf , place );
2233
2158
if (module )
2234
2159
strbuf_addf (result , " in %s" , module );
2235
2160
2236
2161
if (pev -> nargs > 0 ) {
2237
2162
strbuf_add (result , " with" , 5 );
2238
2163
for (i = 0 ; i < pev -> nargs ; i ++ ) {
2239
- ret = synthesize_perf_probe_arg (& pev -> args [i ],
2240
- buf , 128 );
2241
- if (ret < 0 )
2242
- goto out ;
2164
+ buf = synthesize_perf_probe_arg (& pev -> args [i ]);
2165
+ if (!buf )
2166
+ return - ENOMEM ;
2243
2167
strbuf_addf (result , " %s" , buf );
2168
+ free (buf );
2244
2169
}
2245
2170
}
2246
2171
strbuf_addch (result , ')' );
2247
- out :
2248
- free (place );
2249
- return ret ;
2172
+
2173
+ return 0 ;
2250
2174
}
2251
2175
2252
2176
/* Show an event */
0 commit comments