@@ -22,12 +22,12 @@ type perfEventRing struct {
22
22
ringReader
23
23
}
24
24
25
- func newPerfEventRing (cpu , perCPUBuffer , watermark int , overwritable bool ) (* perfEventRing , error ) {
26
- if watermark >= perCPUBuffer {
25
+ func newPerfEventRing (cpu , perCPUBuffer int , opts ReaderOptions ) (* perfEventRing , error ) {
26
+ if opts . Watermark >= perCPUBuffer {
27
27
return nil , errors .New ("watermark must be smaller than perCPUBuffer" )
28
28
}
29
29
30
- fd , err := createPerfEvent (cpu , watermark , overwritable )
30
+ fd , err := createPerfEvent (cpu , opts )
31
31
if err != nil {
32
32
return nil , err
33
33
}
@@ -38,7 +38,7 @@ func newPerfEventRing(cpu, perCPUBuffer, watermark int, overwritable bool) (*per
38
38
}
39
39
40
40
protections := unix .PROT_READ
41
- if ! overwritable {
41
+ if ! opts . Overwritable {
42
42
protections |= unix .PROT_WRITE
43
43
}
44
44
@@ -55,7 +55,7 @@ func newPerfEventRing(cpu, perCPUBuffer, watermark int, overwritable bool) (*per
55
55
meta := (* unix .PerfEventMmapPage )(unsafe .Pointer (& mmap [0 ]))
56
56
57
57
var reader ringReader
58
- if overwritable {
58
+ if opts . Overwritable {
59
59
reader = newReverseReader (meta , mmap [meta .Data_offset :meta .Data_offset + meta .Data_size ])
60
60
} else {
61
61
reader = newForwardReader (meta , mmap [meta .Data_offset :meta .Data_offset + meta .Data_size ])
@@ -98,13 +98,20 @@ func (ring *perfEventRing) Close() {
98
98
ring .mmap = nil
99
99
}
100
100
101
- func createPerfEvent (cpu , watermark int , overwritable bool ) (int , error ) {
102
- if watermark == 0 {
103
- watermark = 1
101
+ func createPerfEvent (cpu int , opts ReaderOptions ) (int , error ) {
102
+ wakeup := 0
103
+ bits := 0
104
+ if opts .WakeupEvents > 0 {
105
+ wakeup = opts .WakeupEvents
106
+ } else {
107
+ wakeup = opts .Watermark
108
+ if wakeup == 0 {
109
+ wakeup = 1
110
+ }
111
+ bits |= unix .PerfBitWatermark
104
112
}
105
113
106
- bits := unix .PerfBitWatermark
107
- if overwritable {
114
+ if opts .Overwritable {
108
115
bits |= unix .PerfBitWriteBackward
109
116
}
110
117
@@ -113,7 +120,7 @@ func createPerfEvent(cpu, watermark int, overwritable bool) (int, error) {
113
120
Config : unix .PERF_COUNT_SW_BPF_OUTPUT ,
114
121
Bits : uint64 (bits ),
115
122
Sample_type : unix .PERF_SAMPLE_RAW ,
116
- Wakeup : uint32 (watermark ),
123
+ Wakeup : uint32 (wakeup ),
117
124
}
118
125
119
126
attr .Size = uint32 (unsafe .Sizeof (attr ))
0 commit comments