| .. | .. |
|---|
| 111 | 111 | int err = 0; |
|---|
| 112 | 112 | void *ptr; |
|---|
| 113 | 113 | |
|---|
| 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 | + } |
|---|
| 115 | 120 | |
|---|
| 116 | 121 | if (queue_stack_map_is_empty(qs)) { |
|---|
| 117 | 122 | memset(value, 0, qs->map.value_size); |
|---|
| .. | .. |
|---|
| 141 | 146 | void *ptr; |
|---|
| 142 | 147 | u32 index; |
|---|
| 143 | 148 | |
|---|
| 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 | + } |
|---|
| 145 | 155 | |
|---|
| 146 | 156 | if (queue_stack_map_is_empty(qs)) { |
|---|
| 147 | 157 | memset(value, 0, qs->map.value_size); |
|---|
| .. | .. |
|---|
| 206 | 216 | if (flags & BPF_NOEXIST || flags > BPF_EXIST) |
|---|
| 207 | 217 | return -EINVAL; |
|---|
| 208 | 218 | |
|---|
| 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 | + } |
|---|
| 210 | 225 | |
|---|
| 211 | 226 | if (queue_stack_map_is_full(qs)) { |
|---|
| 212 | 227 | if (!replace) { |
|---|