core.c (2c0248d68880fc0e783af1048b3367ee5d4412f0) | core.c (19809c2da28aee5860ad9a2eff760730a0710df0) |
---|---|
1/* 2 * Linux Socket Filter - Kernel level socket filtering 3 * 4 * Based on the design of the Berkeley Packet Filter. The new 5 * internal format has been designed by PLUMgrid: 6 * 7 * Copyright (c) 2011 - 2014 PLUMgrid, http://plumgrid.com 8 * --- 62 unchanged lines hidden (view full) --- 71 if (ptr >= skb->head && ptr + size <= skb_tail_pointer(skb)) 72 return ptr; 73 74 return NULL; 75} 76 77struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags) 78{ | 1/* 2 * Linux Socket Filter - Kernel level socket filtering 3 * 4 * Based on the design of the Berkeley Packet Filter. The new 5 * internal format has been designed by PLUMgrid: 6 * 7 * Copyright (c) 2011 - 2014 PLUMgrid, http://plumgrid.com 8 * --- 62 unchanged lines hidden (view full) --- 71 if (ptr >= skb->head && ptr + size <= skb_tail_pointer(skb)) 72 return ptr; 73 74 return NULL; 75} 76 77struct bpf_prog *bpf_prog_alloc(unsigned int size, gfp_t gfp_extra_flags) 78{ |
79 gfp_t gfp_flags = GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO | 80 gfp_extra_flags; | 79 gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO | gfp_extra_flags; |
81 struct bpf_prog_aux *aux; 82 struct bpf_prog *fp; 83 84 size = round_up(size, PAGE_SIZE); 85 fp = __vmalloc(size, gfp_flags, PAGE_KERNEL); 86 if (fp == NULL) 87 return NULL; 88 --- 13 unchanged lines hidden (view full) --- 102 103 return fp; 104} 105EXPORT_SYMBOL_GPL(bpf_prog_alloc); 106 107struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size, 108 gfp_t gfp_extra_flags) 109{ | 80 struct bpf_prog_aux *aux; 81 struct bpf_prog *fp; 82 83 size = round_up(size, PAGE_SIZE); 84 fp = __vmalloc(size, gfp_flags, PAGE_KERNEL); 85 if (fp == NULL) 86 return NULL; 87 --- 13 unchanged lines hidden (view full) --- 101 102 return fp; 103} 104EXPORT_SYMBOL_GPL(bpf_prog_alloc); 105 106struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size, 107 gfp_t gfp_extra_flags) 108{ |
110 gfp_t gfp_flags = GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO | 111 gfp_extra_flags; | 109 gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO | gfp_extra_flags; |
112 struct bpf_prog *fp; 113 u32 pages, delta; 114 int ret; 115 116 BUG_ON(fp_old == NULL); 117 118 size = round_up(size, PAGE_SIZE); 119 pages = size / PAGE_SIZE; --- 269 unchanged lines hidden (view full) --- 389static bool bpf_prog_kallsyms_verify_off(const struct bpf_prog *fp) 390{ 391 return list_empty(&fp->aux->ksym_lnode) || 392 fp->aux->ksym_lnode.prev == LIST_POISON2; 393} 394 395void bpf_prog_kallsyms_add(struct bpf_prog *fp) 396{ | 110 struct bpf_prog *fp; 111 u32 pages, delta; 112 int ret; 113 114 BUG_ON(fp_old == NULL); 115 116 size = round_up(size, PAGE_SIZE); 117 pages = size / PAGE_SIZE; --- 269 unchanged lines hidden (view full) --- 387static bool bpf_prog_kallsyms_verify_off(const struct bpf_prog *fp) 388{ 389 return list_empty(&fp->aux->ksym_lnode) || 390 fp->aux->ksym_lnode.prev == LIST_POISON2; 391} 392 393void bpf_prog_kallsyms_add(struct bpf_prog *fp) 394{ |
397 unsigned long flags; 398 | |
399 if (!bpf_prog_kallsyms_candidate(fp) || 400 !capable(CAP_SYS_ADMIN)) 401 return; 402 | 395 if (!bpf_prog_kallsyms_candidate(fp) || 396 !capable(CAP_SYS_ADMIN)) 397 return; 398 |
403 spin_lock_irqsave(&bpf_lock, flags); | 399 spin_lock_bh(&bpf_lock); |
404 bpf_prog_ksym_node_add(fp->aux); | 400 bpf_prog_ksym_node_add(fp->aux); |
405 spin_unlock_irqrestore(&bpf_lock, flags); | 401 spin_unlock_bh(&bpf_lock); |
406} 407 408void bpf_prog_kallsyms_del(struct bpf_prog *fp) 409{ | 402} 403 404void bpf_prog_kallsyms_del(struct bpf_prog *fp) 405{ |
410 unsigned long flags; 411 | |
412 if (!bpf_prog_kallsyms_candidate(fp)) 413 return; 414 | 406 if (!bpf_prog_kallsyms_candidate(fp)) 407 return; 408 |
415 spin_lock_irqsave(&bpf_lock, flags); | 409 spin_lock_bh(&bpf_lock); |
416 bpf_prog_ksym_node_del(fp->aux); | 410 bpf_prog_ksym_node_del(fp->aux); |
417 spin_unlock_irqrestore(&bpf_lock, flags); | 411 spin_unlock_bh(&bpf_lock); |
418} 419 420static struct bpf_prog *bpf_prog_kallsyms_find(unsigned long addr) 421{ 422 struct latch_tree_node *n; 423 424 if (!bpf_jit_kallsyms_enabled()) 425 return NULL; --- 228 unchanged lines hidden (view full) --- 654 } 655out: 656 return to - to_buff; 657} 658 659static struct bpf_prog *bpf_prog_clone_create(struct bpf_prog *fp_other, 660 gfp_t gfp_extra_flags) 661{ | 412} 413 414static struct bpf_prog *bpf_prog_kallsyms_find(unsigned long addr) 415{ 416 struct latch_tree_node *n; 417 418 if (!bpf_jit_kallsyms_enabled()) 419 return NULL; --- 228 unchanged lines hidden (view full) --- 648 } 649out: 650 return to - to_buff; 651} 652 653static struct bpf_prog *bpf_prog_clone_create(struct bpf_prog *fp_other, 654 gfp_t gfp_extra_flags) 655{ |
662 gfp_t gfp_flags = GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO | 663 gfp_extra_flags; | 656 gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO | gfp_extra_flags; |
664 struct bpf_prog *fp; 665 666 fp = __vmalloc(fp_other->pages * PAGE_SIZE, gfp_flags, PAGE_KERNEL); 667 if (fp != NULL) { 668 kmemcheck_annotate_bitfield(fp, meta); 669 670 /* aux->prog still points to the fp_other one, so 671 * when promoting the clone to the real program, --- 746 unchanged lines hidden --- | 657 struct bpf_prog *fp; 658 659 fp = __vmalloc(fp_other->pages * PAGE_SIZE, gfp_flags, PAGE_KERNEL); 660 if (fp != NULL) { 661 kmemcheck_annotate_bitfield(fp, meta); 662 663 /* aux->prog still points to the fp_other one, so 664 * when promoting the clone to the real program, --- 746 unchanged lines hidden --- |