@@ -1798,6 +1798,60 @@ void synth_event_cmd_init(struct dynevent_cmd *cmd, char *buf, int maxlen)
1798
1798
}
1799
1799
EXPORT_SYMBOL_GPL (synth_event_cmd_init );
1800
1800
1801
+ static inline int
1802
+ __synth_event_trace_start (struct trace_event_file * file ,
1803
+ struct synth_event_trace_state * trace_state )
1804
+ {
1805
+ int entry_size , fields_size = 0 ;
1806
+ int ret = 0 ;
1807
+
1808
+ /*
1809
+ * Normal event tracing doesn't get called at all unless the
1810
+ * ENABLED bit is set (which attaches the probe thus allowing
1811
+ * this code to be called, etc). Because this is called
1812
+ * directly by the user, we don't have that but we still need
1813
+ * to honor not logging when disabled. For the the iterated
1814
+ * trace case, we save the enabed state upon start and just
1815
+ * ignore the following data calls.
1816
+ */
1817
+ if (!(file -> flags & EVENT_FILE_FL_ENABLED ) ||
1818
+ trace_trigger_soft_disabled (file )) {
1819
+ trace_state -> disabled = true;
1820
+ ret = - ENOENT ;
1821
+ goto out ;
1822
+ }
1823
+
1824
+ trace_state -> event = file -> event_call -> data ;
1825
+
1826
+ fields_size = trace_state -> event -> n_u64 * sizeof (u64 );
1827
+
1828
+ /*
1829
+ * Avoid ring buffer recursion detection, as this event
1830
+ * is being performed within another event.
1831
+ */
1832
+ trace_state -> buffer = file -> tr -> array_buffer .buffer ;
1833
+ ring_buffer_nest_start (trace_state -> buffer );
1834
+
1835
+ entry_size = sizeof (* trace_state -> entry ) + fields_size ;
1836
+ trace_state -> entry = trace_event_buffer_reserve (& trace_state -> fbuffer ,
1837
+ file ,
1838
+ entry_size );
1839
+ if (!trace_state -> entry ) {
1840
+ ring_buffer_nest_end (trace_state -> buffer );
1841
+ ret = - EINVAL ;
1842
+ }
1843
+ out :
1844
+ return ret ;
1845
+ }
1846
+
1847
+ static inline void
1848
+ __synth_event_trace_end (struct synth_event_trace_state * trace_state )
1849
+ {
1850
+ trace_event_buffer_commit (& trace_state -> fbuffer );
1851
+
1852
+ ring_buffer_nest_end (trace_state -> buffer );
1853
+ }
1854
+
1801
1855
/**
1802
1856
* synth_event_trace - Trace a synthetic event
1803
1857
* @file: The trace_event_file representing the synthetic event
@@ -1819,71 +1873,38 @@ EXPORT_SYMBOL_GPL(synth_event_cmd_init);
1819
1873
*/
1820
1874
int synth_event_trace (struct trace_event_file * file , unsigned int n_vals , ...)
1821
1875
{
1822
- struct trace_event_buffer fbuffer ;
1823
- struct synth_trace_event * entry ;
1824
- struct trace_buffer * buffer ;
1825
- struct synth_event * event ;
1876
+ struct synth_event_trace_state state ;
1826
1877
unsigned int i , n_u64 ;
1827
- int fields_size = 0 ;
1828
1878
va_list args ;
1829
- int ret = 0 ;
1830
-
1831
- /*
1832
- * Normal event generation doesn't get called at all unless
1833
- * the ENABLED bit is set (which attaches the probe thus
1834
- * allowing this code to be called, etc). Because this is
1835
- * called directly by the user, we don't have that but we
1836
- * still need to honor not logging when disabled.
1837
- */
1838
- if (!(file -> flags & EVENT_FILE_FL_ENABLED ))
1839
- return 0 ;
1840
-
1841
- event = file -> event_call -> data ;
1842
-
1843
- if (n_vals != event -> n_fields )
1844
- return - EINVAL ;
1845
-
1846
- if (trace_trigger_soft_disabled (file ))
1847
- return - EINVAL ;
1848
-
1849
- fields_size = event -> n_u64 * sizeof (u64 );
1850
-
1851
- /*
1852
- * Avoid ring buffer recursion detection, as this event
1853
- * is being performed within another event.
1854
- */
1855
- buffer = file -> tr -> array_buffer .buffer ;
1856
- ring_buffer_nest_start (buffer );
1879
+ int ret ;
1857
1880
1858
- entry = trace_event_buffer_reserve ( & fbuffer , file ,
1859
- sizeof ( * entry ) + fields_size );
1860
- if (! entry ) {
1861
- ret = - EINVAL ;
1862
- goto out ;
1881
+ ret = __synth_event_trace_start ( file , & state );
1882
+ if ( ret ) {
1883
+ if (ret == - ENOENT )
1884
+ ret = 0 ; /* just disabled, not really an error */
1885
+ return ret ;
1863
1886
}
1864
1887
1865
1888
va_start (args , n_vals );
1866
- for (i = 0 , n_u64 = 0 ; i < event -> n_fields ; i ++ ) {
1889
+ for (i = 0 , n_u64 = 0 ; i < state . event -> n_fields ; i ++ ) {
1867
1890
u64 val ;
1868
1891
1869
1892
val = va_arg (args , u64 );
1870
1893
1871
- if (event -> fields [i ]-> is_string ) {
1894
+ if (state . event -> fields [i ]-> is_string ) {
1872
1895
char * str_val = (char * )(long )val ;
1873
- char * str_field = (char * )& entry -> fields [n_u64 ];
1896
+ char * str_field = (char * )& state . entry -> fields [n_u64 ];
1874
1897
1875
1898
strscpy (str_field , str_val , STR_VAR_LEN_MAX );
1876
1899
n_u64 += STR_VAR_LEN_MAX / sizeof (u64 );
1877
1900
} else {
1878
- entry -> fields [n_u64 ] = val ;
1901
+ state . entry -> fields [n_u64 ] = val ;
1879
1902
n_u64 ++ ;
1880
1903
}
1881
1904
}
1882
1905
va_end (args );
1883
1906
1884
- trace_event_buffer_commit (& fbuffer );
1885
- out :
1886
- ring_buffer_nest_end (buffer );
1907
+ __synth_event_trace_end (& state );
1887
1908
1888
1909
return ret ;
1889
1910
}
@@ -1910,64 +1931,31 @@ EXPORT_SYMBOL_GPL(synth_event_trace);
1910
1931
int synth_event_trace_array (struct trace_event_file * file , u64 * vals ,
1911
1932
unsigned int n_vals )
1912
1933
{
1913
- struct trace_event_buffer fbuffer ;
1914
- struct synth_trace_event * entry ;
1915
- struct trace_buffer * buffer ;
1916
- struct synth_event * event ;
1934
+ struct synth_event_trace_state state ;
1917
1935
unsigned int i , n_u64 ;
1918
- int fields_size = 0 ;
1919
- int ret = 0 ;
1920
-
1921
- /*
1922
- * Normal event generation doesn't get called at all unless
1923
- * the ENABLED bit is set (which attaches the probe thus
1924
- * allowing this code to be called, etc). Because this is
1925
- * called directly by the user, we don't have that but we
1926
- * still need to honor not logging when disabled.
1927
- */
1928
- if (!(file -> flags & EVENT_FILE_FL_ENABLED ))
1929
- return 0 ;
1930
-
1931
- event = file -> event_call -> data ;
1932
-
1933
- if (n_vals != event -> n_fields )
1934
- return - EINVAL ;
1935
-
1936
- if (trace_trigger_soft_disabled (file ))
1937
- return - EINVAL ;
1938
-
1939
- fields_size = event -> n_u64 * sizeof (u64 );
1940
-
1941
- /*
1942
- * Avoid ring buffer recursion detection, as this event
1943
- * is being performed within another event.
1944
- */
1945
- buffer = file -> tr -> array_buffer .buffer ;
1946
- ring_buffer_nest_start (buffer );
1936
+ int ret ;
1947
1937
1948
- entry = trace_event_buffer_reserve ( & fbuffer , file ,
1949
- sizeof ( * entry ) + fields_size );
1950
- if (! entry ) {
1951
- ret = - EINVAL ;
1952
- goto out ;
1938
+ ret = __synth_event_trace_start ( file , & state );
1939
+ if ( ret ) {
1940
+ if (ret == - ENOENT )
1941
+ ret = 0 ; /* just disabled, not really an error */
1942
+ return ret ;
1953
1943
}
1954
1944
1955
- for (i = 0 , n_u64 = 0 ; i < event -> n_fields ; i ++ ) {
1956
- if (event -> fields [i ]-> is_string ) {
1945
+ for (i = 0 , n_u64 = 0 ; i < state . event -> n_fields ; i ++ ) {
1946
+ if (state . event -> fields [i ]-> is_string ) {
1957
1947
char * str_val = (char * )(long )vals [i ];
1958
- char * str_field = (char * )& entry -> fields [n_u64 ];
1948
+ char * str_field = (char * )& state . entry -> fields [n_u64 ];
1959
1949
1960
1950
strscpy (str_field , str_val , STR_VAR_LEN_MAX );
1961
1951
n_u64 += STR_VAR_LEN_MAX / sizeof (u64 );
1962
1952
} else {
1963
- entry -> fields [n_u64 ] = vals [i ];
1953
+ state . entry -> fields [n_u64 ] = vals [i ];
1964
1954
n_u64 ++ ;
1965
1955
}
1966
1956
}
1967
1957
1968
- trace_event_buffer_commit (& fbuffer );
1969
- out :
1970
- ring_buffer_nest_end (buffer );
1958
+ __synth_event_trace_end (& state );
1971
1959
1972
1960
return ret ;
1973
1961
}
@@ -2004,58 +1992,17 @@ EXPORT_SYMBOL_GPL(synth_event_trace_array);
2004
1992
int synth_event_trace_start (struct trace_event_file * file ,
2005
1993
struct synth_event_trace_state * trace_state )
2006
1994
{
2007
- struct synth_trace_event * entry ;
2008
- int fields_size = 0 ;
2009
- int ret = 0 ;
1995
+ int ret ;
2010
1996
2011
- if (!trace_state ) {
2012
- ret = - EINVAL ;
2013
- goto out ;
2014
- }
1997
+ if (!trace_state )
1998
+ return - EINVAL ;
2015
1999
2016
2000
memset (trace_state , '\0' , sizeof (* trace_state ));
2017
2001
2018
- /*
2019
- * Normal event tracing doesn't get called at all unless the
2020
- * ENABLED bit is set (which attaches the probe thus allowing
2021
- * this code to be called, etc). Because this is called
2022
- * directly by the user, we don't have that but we still need
2023
- * to honor not logging when disabled. For the the iterated
2024
- * trace case, we save the enabed state upon start and just
2025
- * ignore the following data calls.
2026
- */
2027
- if (!(file -> flags & EVENT_FILE_FL_ENABLED )) {
2028
- trace_state -> enabled = false;
2029
- goto out ;
2030
- }
2031
-
2032
- trace_state -> enabled = true;
2033
-
2034
- trace_state -> event = file -> event_call -> data ;
2035
-
2036
- if (trace_trigger_soft_disabled (file )) {
2037
- ret = - EINVAL ;
2038
- goto out ;
2039
- }
2002
+ ret = __synth_event_trace_start (file , trace_state );
2003
+ if (ret == - ENOENT )
2004
+ ret = 0 ; /* just disabled, not really an error */
2040
2005
2041
- fields_size = trace_state -> event -> n_u64 * sizeof (u64 );
2042
-
2043
- /*
2044
- * Avoid ring buffer recursion detection, as this event
2045
- * is being performed within another event.
2046
- */
2047
- trace_state -> buffer = file -> tr -> array_buffer .buffer ;
2048
- ring_buffer_nest_start (trace_state -> buffer );
2049
-
2050
- entry = trace_event_buffer_reserve (& trace_state -> fbuffer , file ,
2051
- sizeof (* entry ) + fields_size );
2052
- if (!entry ) {
2053
- ret = - EINVAL ;
2054
- goto out ;
2055
- }
2056
-
2057
- trace_state -> entry = entry ;
2058
- out :
2059
2006
return ret ;
2060
2007
}
2061
2008
EXPORT_SYMBOL_GPL (synth_event_trace_start );
@@ -2088,7 +2035,7 @@ static int __synth_event_add_val(const char *field_name, u64 val,
2088
2035
trace_state -> add_next = true;
2089
2036
}
2090
2037
2091
- if (! trace_state -> enabled )
2038
+ if (trace_state -> disabled )
2092
2039
goto out ;
2093
2040
2094
2041
event = trace_state -> event ;
@@ -2223,9 +2170,7 @@ int synth_event_trace_end(struct synth_event_trace_state *trace_state)
2223
2170
if (!trace_state )
2224
2171
return - EINVAL ;
2225
2172
2226
- trace_event_buffer_commit (& trace_state -> fbuffer );
2227
-
2228
- ring_buffer_nest_end (trace_state -> buffer );
2173
+ __synth_event_trace_end (trace_state );
2229
2174
2230
2175
return 0 ;
2231
2176
}
0 commit comments