hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/kernel/bpf/queue_stack_maps.c
....@@ -111,7 +111,12 @@
111111 int err = 0;
112112 void *ptr;
113113
114
- raw_spin_lock_irqsave(&qs->lock, flags);
114
+ if (in_nmi()) {
115
+ if (!raw_spin_trylock_irqsave(&qs->lock, flags))
116
+ return -EBUSY;
117
+ } else {
118
+ raw_spin_lock_irqsave(&qs->lock, flags);
119
+ }
115120
116121 if (queue_stack_map_is_empty(qs)) {
117122 memset(value, 0, qs->map.value_size);
....@@ -141,7 +146,12 @@
141146 void *ptr;
142147 u32 index;
143148
144
- raw_spin_lock_irqsave(&qs->lock, flags);
149
+ if (in_nmi()) {
150
+ if (!raw_spin_trylock_irqsave(&qs->lock, flags))
151
+ return -EBUSY;
152
+ } else {
153
+ raw_spin_lock_irqsave(&qs->lock, flags);
154
+ }
145155
146156 if (queue_stack_map_is_empty(qs)) {
147157 memset(value, 0, qs->map.value_size);
....@@ -206,7 +216,12 @@
206216 if (flags & BPF_NOEXIST || flags > BPF_EXIST)
207217 return -EINVAL;
208218
209
- raw_spin_lock_irqsave(&qs->lock, irq_flags);
219
+ if (in_nmi()) {
220
+ if (!raw_spin_trylock_irqsave(&qs->lock, irq_flags))
221
+ return -EBUSY;
222
+ } else {
223
+ raw_spin_lock_irqsave(&qs->lock, irq_flags);
224
+ }
210225
211226 if (queue_stack_map_is_full(qs)) {
212227 if (!replace) {