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 ---