Skip to content

Commit 60b1ebe

Browse files
rgushchinkernel-patches-bot
authored andcommitted
bpf: eliminate rlimit-based memory accounting for bpf progs
Do not use rlimit-based memory accounting for bpf progs. It has been replaced with memcg-based memory accounting. Signed-off-by: Roman Gushchin <[email protected]> Acked-by: Song Liu <[email protected]>
1 parent 81866de commit 60b1ebe

File tree

3 files changed

+12
-97
lines changed

3 files changed

+12
-97
lines changed

include/linux/bpf.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,8 +1200,6 @@ void bpf_prog_sub(struct bpf_prog *prog, int i);
12001200
void bpf_prog_inc(struct bpf_prog *prog);
12011201
struct bpf_prog * __must_check bpf_prog_inc_not_zero(struct bpf_prog *prog);
12021202
void bpf_prog_put(struct bpf_prog *prog);
1203-
int __bpf_prog_charge(struct user_struct *user, u32 pages);
1204-
void __bpf_prog_uncharge(struct user_struct *user, u32 pages);
12051203
void __bpf_free_used_maps(struct bpf_prog_aux *aux,
12061204
struct bpf_map **used_maps, u32 len);
12071205

@@ -1482,15 +1480,6 @@ bpf_prog_inc_not_zero(struct bpf_prog *prog)
14821480
return ERR_PTR(-EOPNOTSUPP);
14831481
}
14841482

1485-
static inline int __bpf_prog_charge(struct user_struct *user, u32 pages)
1486-
{
1487-
return 0;
1488-
}
1489-
1490-
static inline void __bpf_prog_uncharge(struct user_struct *user, u32 pages)
1491-
{
1492-
}
1493-
14941483
static inline void bpf_link_init(struct bpf_link *link, enum bpf_link_type type,
14951484
const struct bpf_link_ops *ops,
14961485
struct bpf_prog *prog)

kernel/bpf/core.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,15 @@ struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size,
221221
{
222222
gfp_t gfp_flags = GFP_KERNEL_ACCOUNT | __GFP_ZERO | gfp_extra_flags;
223223
struct bpf_prog *fp;
224-
u32 pages, delta;
225-
int ret;
224+
u32 pages;
226225

227226
size = round_up(size, PAGE_SIZE);
228227
pages = size / PAGE_SIZE;
229228
if (pages <= fp_old->pages)
230229
return fp_old;
231230

232-
delta = pages - fp_old->pages;
233-
ret = __bpf_prog_charge(fp_old->aux->user, delta);
234-
if (ret)
235-
return NULL;
236-
237231
fp = __vmalloc(size, gfp_flags);
238-
if (fp == NULL) {
239-
__bpf_prog_uncharge(fp_old->aux->user, delta);
240-
} else {
232+
if (fp) {
241233
memcpy(fp, fp_old, fp_old->pages * PAGE_SIZE);
242234
fp->pages = pages;
243235
fp->aux->prog = fp;

kernel/bpf/syscall.c

Lines changed: 10 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -342,23 +342,6 @@ void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr)
342342
map->numa_node = bpf_map_attr_numa_node(attr);
343343
}
344344

345-
static int bpf_charge_memlock(struct user_struct *user, u32 pages)
346-
{
347-
unsigned long memlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
348-
349-
if (atomic_long_add_return(pages, &user->locked_vm) > memlock_limit) {
350-
atomic_long_sub(pages, &user->locked_vm);
351-
return -EPERM;
352-
}
353-
return 0;
354-
}
355-
356-
static void bpf_uncharge_memlock(struct user_struct *user, u32 pages)
357-
{
358-
if (user)
359-
atomic_long_sub(pages, &user->locked_vm);
360-
}
361-
362345
static int bpf_map_alloc_id(struct bpf_map *map)
363346
{
364347
int id;
@@ -1594,51 +1577,6 @@ static void bpf_audit_prog(const struct bpf_prog *prog, unsigned int op)
15941577
audit_log_end(ab);
15951578
}
15961579

1597-
int __bpf_prog_charge(struct user_struct *user, u32 pages)
1598-
{
1599-
unsigned long memlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
1600-
unsigned long user_bufs;
1601-
1602-
if (user) {
1603-
user_bufs = atomic_long_add_return(pages, &user->locked_vm);
1604-
if (user_bufs > memlock_limit) {
1605-
atomic_long_sub(pages, &user->locked_vm);
1606-
return -EPERM;
1607-
}
1608-
}
1609-
1610-
return 0;
1611-
}
1612-
1613-
void __bpf_prog_uncharge(struct user_struct *user, u32 pages)
1614-
{
1615-
if (user)
1616-
atomic_long_sub(pages, &user->locked_vm);
1617-
}
1618-
1619-
static int bpf_prog_charge_memlock(struct bpf_prog *prog)
1620-
{
1621-
struct user_struct *user = get_current_user();
1622-
int ret;
1623-
1624-
ret = __bpf_prog_charge(user, prog->pages);
1625-
if (ret) {
1626-
free_uid(user);
1627-
return ret;
1628-
}
1629-
1630-
prog->aux->user = user;
1631-
return 0;
1632-
}
1633-
1634-
static void bpf_prog_uncharge_memlock(struct bpf_prog *prog)
1635-
{
1636-
struct user_struct *user = prog->aux->user;
1637-
1638-
__bpf_prog_uncharge(user, prog->pages);
1639-
free_uid(user);
1640-
}
1641-
16421580
static int bpf_prog_alloc_id(struct bpf_prog *prog)
16431581
{
16441582
int id;
@@ -1688,7 +1626,7 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)
16881626

16891627
kvfree(aux->func_info);
16901628
kfree(aux->func_info_aux);
1691-
bpf_prog_uncharge_memlock(aux->prog);
1629+
free_uid(aux->user);
16921630
security_bpf_prog_free(aux);
16931631
bpf_prog_free(aux->prog);
16941632
}
@@ -2126,7 +2064,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
21262064
dst_prog = bpf_prog_get(attr->attach_prog_fd);
21272065
if (IS_ERR(dst_prog)) {
21282066
err = PTR_ERR(dst_prog);
2129-
goto free_prog_nouncharge;
2067+
goto free_prog;
21302068
}
21312069
prog->aux->dst_prog = dst_prog;
21322070
}
@@ -2136,18 +2074,15 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
21362074

21372075
err = security_bpf_prog_alloc(prog->aux);
21382076
if (err)
2139-
goto free_prog_nouncharge;
2140-
2141-
err = bpf_prog_charge_memlock(prog);
2142-
if (err)
2143-
goto free_prog_sec;
2077+
goto free_prog;
21442078

2079+
prog->aux->user = get_current_user();
21452080
prog->len = attr->insn_cnt;
21462081

21472082
err = -EFAULT;
21482083
if (copy_from_user(prog->insns, u64_to_user_ptr(attr->insns),
21492084
bpf_prog_insn_size(prog)) != 0)
2150-
goto free_prog;
2085+
goto free_prog_sec;
21512086

21522087
prog->orig_prog = NULL;
21532088
prog->jited = 0;
@@ -2158,19 +2093,19 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
21582093
if (bpf_prog_is_dev_bound(prog->aux)) {
21592094
err = bpf_prog_offload_init(prog, attr);
21602095
if (err)
2161-
goto free_prog;
2096+
goto free_prog_sec;
21622097
}
21632098

21642099
/* find program type: socket_filter vs tracing_filter */
21652100
err = find_prog_type(type, prog);
21662101
if (err < 0)
2167-
goto free_prog;
2102+
goto free_prog_sec;
21682103

21692104
prog->aux->load_time = ktime_get_boottime_ns();
21702105
err = bpf_obj_name_cpy(prog->aux->name, attr->prog_name,
21712106
sizeof(attr->prog_name));
21722107
if (err < 0)
2173-
goto free_prog;
2108+
goto free_prog_sec;
21742109

21752110
/* run eBPF verifier */
21762111
err = bpf_check(&prog, attr, uattr);
@@ -2215,11 +2150,10 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
22152150
*/
22162151
__bpf_prog_put_noref(prog, prog->aux->func_cnt);
22172152
return err;
2218-
free_prog:
2219-
bpf_prog_uncharge_memlock(prog);
22202153
free_prog_sec:
2154+
free_uid(prog->aux->user);
22212155
security_bpf_prog_free(prog->aux);
2222-
free_prog_nouncharge:
2156+
free_prog:
22232157
bpf_prog_free(prog);
22242158
return err;
22252159
}

0 commit comments

Comments
 (0)