Two easily resolvable overlapping change conflicts, one in TCP and one in the eBPF verifier.
Showing the changes to kernel (5 of 142 files). Show all
Unified · Split
| @@ -44,7 +44,7 @@ static void do_up_read(struct irq_work *entry) · 43 unmodified lines | ||
| 44 | 44 | struct stack_map_irq_work *work; |
| 45 | 45 | |
| 46 | 46 | work = container_of(entry, struct stack_map_irq_work, irq_work); |
| 47 | − up_read(work->sem); | |
| 47 | + up_read_non_owner(work->sem); | |
| 48 | 48 | work->sem = NULL; |
| 49 | 49 | } |
| 50 | 50 | |
| @@ -338,6 +338,12 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, · 287 unmodified lines | ||
| 338 | 338 | } else { |
| 339 | 339 | work->sem = ¤t->mm->mmap_sem; |
| 340 | 340 | irq_work_queue(&work->irq_work); |
| 341 | + /* | |
| 342 | + * The irq_work will release the mmap_sem with | |
| 343 | + * up_read_non_owner(). The rwsem_release() is called | |
| 344 | + * here to release the lock from lockdep's perspective. | |
| 345 | + */ | |
| 346 | + rwsem_release(¤t->mm->mmap_sem.dep_map, 1, _RET_IP_); | |
| 341 | 347 | } |
| 342 | 348 | } |
| 343 | 349 | |
| @@ -4963,6 +4963,11 @@ static void __perf_event_period(struct perf_event *event, · 4962 unmodified lines | ||
| 4963 | 4963 | } |
| 4964 | 4964 | } |
| 4965 | 4965 | |
| 4966 | +static int perf_event_check_period(struct perf_event *event, u64 value) | |
| 4967 | +{ | |
| 4968 | + return event->pmu->check_period(event, value); | |
| 4969 | +} | |
| 4970 | + | |
| 4966 | 4971 | static int perf_event_period(struct perf_event *event, u64 __user *arg) |
| 4967 | 4972 | { |
| 4968 | 4973 | u64 value; |
| @@ -4979,6 +4984,9 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) · 10 unmodified lines | ||
| 4979 | 4984 | if (event->attr.freq && value > sysctl_perf_event_sample_rate) |
| 4980 | 4985 | return -EINVAL; |
| 4981 | 4986 | |
| 4987 | + if (perf_event_check_period(event, value)) | |
| 4988 | + return -EINVAL; | |
| 4989 | + | |
| 4982 | 4990 | event_function_call(event, __perf_event_period, &value); |
| 4983 | 4991 | |
| 4984 | 4992 | return 0; |
| @@ -9391,6 +9399,11 @@ static int perf_pmu_nop_int(struct pmu *pmu) · 4406 unmodified lines | ||
| 9391 | 9399 | return 0; |
| 9392 | 9400 | } |
| 9393 | 9401 | |
| 9402 | +static int perf_event_nop_int(struct perf_event *event, u64 value) | |
| 9403 | +{ | |
| 9404 | + return 0; | |
| 9405 | +} | |
| 9406 | + | |
| 9394 | 9407 | static DEFINE_PER_CPU(unsigned int, nop_txn_flags); |
| 9395 | 9408 | |
| 9396 | 9409 | static void perf_pmu_start_txn(struct pmu *pmu, unsigned int flags) |
| @@ -9691,6 +9704,9 @@ got_cpu_context: · 294 unmodified lines | ||
| 9691 | 9704 | pmu->pmu_disable = perf_pmu_nop_void; |
| 9692 | 9705 | } |
| 9693 | 9706 | |
| 9707 | + if (!pmu->check_period) | |
| 9708 | + pmu->check_period = perf_event_nop_int; | |
| 9709 | + | |
| 9694 | 9710 | if (!pmu->event_idx) |
| 9695 | 9711 | pmu->event_idx = perf_event_idx_default; |
| 9696 | 9712 | |
| @@ -734,7 +734,7 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags) · 733 unmodified lines | ||
| 734 | 734 | size = sizeof(struct ring_buffer); |
| 735 | 735 | size += nr_pages * sizeof(void *); |
| 736 | 736 | |
| 737 | − if (order_base_2(size) >= MAX_ORDER) | |
| 737 | + if (order_base_2(size) >= PAGE_SHIFT+MAX_ORDER) | |
| 738 | 738 | goto fail; |
| 739 | 739 | |
| 740 | 740 | rb = kzalloc(size, GFP_KERNEL); |
| @@ -3384,6 +3384,8 @@ static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file · 3383 unmodified lines | ||
| 3384 | 3384 | const char tgid_space[] = " "; |
| 3385 | 3385 | const char space[] = " "; |
| 3386 | 3386 | |
| 3387 | + print_event_info(buf, m); | |
| 3388 | + | |
| 3387 | 3389 | seq_printf(m, "# %s _-----=> irqs-off\n", |
| 3388 | 3390 | tgid ? tgid_space : space); |
| 3389 | 3391 | seq_printf(m, "# %s / _----=> need-resched\n", |
| @@ -861,22 +861,14 @@ static const struct file_operations kprobe_profile_ops = { · 860 unmodified lines | ||
| 861 | 861 | static nokprobe_inline int |
| 862 | 862 | fetch_store_strlen(unsigned long addr) |
| 863 | 863 | { |
| 864 | − mm_segment_t old_fs; | |
| 865 | 864 | int ret, len = 0; |
| 866 | 865 | u8 c; |
| 867 | 866 | |
| 868 | − old_fs = get_fs(); | |
| 869 | − set_fs(KERNEL_DS); | |
| 870 | − pagefault_disable(); | |
| 871 | − | |
| 872 | 867 | do { |
| 873 | − ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1); | |
| 868 | + ret = probe_mem_read(&c, (u8 *)addr + len, 1); | |
| 874 | 869 | len++; |
| 875 | 870 | } while (c && ret == 0 && len < MAX_STRING_SIZE); |
| 876 | 871 | |
| 877 | − pagefault_enable(); | |
| 878 | − set_fs(old_fs); | |
| 879 | − | |
| 880 | 872 | return (ret < 0) ? ret : len; |
| 881 | 873 | } |
| 882 | 874 | |