@@ -342,23 +342,6 @@ void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr)
342
342
map -> numa_node = bpf_map_attr_numa_node (attr );
343
343
}
344
344
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
-
362
345
static int bpf_map_alloc_id (struct bpf_map * map )
363
346
{
364
347
int id ;
@@ -1594,51 +1577,6 @@ static void bpf_audit_prog(const struct bpf_prog *prog, unsigned int op)
1594
1577
audit_log_end (ab );
1595
1578
}
1596
1579
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
-
1642
1580
static int bpf_prog_alloc_id (struct bpf_prog * prog )
1643
1581
{
1644
1582
int id ;
@@ -1688,7 +1626,7 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)
1688
1626
1689
1627
kvfree (aux -> func_info );
1690
1628
kfree (aux -> func_info_aux );
1691
- bpf_prog_uncharge_memlock (aux -> prog );
1629
+ free_uid (aux -> user );
1692
1630
security_bpf_prog_free (aux );
1693
1631
bpf_prog_free (aux -> prog );
1694
1632
}
@@ -2126,7 +2064,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
2126
2064
dst_prog = bpf_prog_get (attr -> attach_prog_fd );
2127
2065
if (IS_ERR (dst_prog )) {
2128
2066
err = PTR_ERR (dst_prog );
2129
- goto free_prog_nouncharge ;
2067
+ goto free_prog ;
2130
2068
}
2131
2069
prog -> aux -> dst_prog = dst_prog ;
2132
2070
}
@@ -2136,18 +2074,15 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
2136
2074
2137
2075
err = security_bpf_prog_alloc (prog -> aux );
2138
2076
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 ;
2144
2078
2079
+ prog -> aux -> user = get_current_user ();
2145
2080
prog -> len = attr -> insn_cnt ;
2146
2081
2147
2082
err = - EFAULT ;
2148
2083
if (copy_from_user (prog -> insns , u64_to_user_ptr (attr -> insns ),
2149
2084
bpf_prog_insn_size (prog )) != 0 )
2150
- goto free_prog ;
2085
+ goto free_prog_sec ;
2151
2086
2152
2087
prog -> orig_prog = NULL ;
2153
2088
prog -> jited = 0 ;
@@ -2158,19 +2093,19 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
2158
2093
if (bpf_prog_is_dev_bound (prog -> aux )) {
2159
2094
err = bpf_prog_offload_init (prog , attr );
2160
2095
if (err )
2161
- goto free_prog ;
2096
+ goto free_prog_sec ;
2162
2097
}
2163
2098
2164
2099
/* find program type: socket_filter vs tracing_filter */
2165
2100
err = find_prog_type (type , prog );
2166
2101
if (err < 0 )
2167
- goto free_prog ;
2102
+ goto free_prog_sec ;
2168
2103
2169
2104
prog -> aux -> load_time = ktime_get_boottime_ns ();
2170
2105
err = bpf_obj_name_cpy (prog -> aux -> name , attr -> prog_name ,
2171
2106
sizeof (attr -> prog_name ));
2172
2107
if (err < 0 )
2173
- goto free_prog ;
2108
+ goto free_prog_sec ;
2174
2109
2175
2110
/* run eBPF verifier */
2176
2111
err = bpf_check (& prog , attr , uattr );
@@ -2215,11 +2150,10 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
2215
2150
*/
2216
2151
__bpf_prog_put_noref (prog , prog -> aux -> func_cnt );
2217
2152
return err ;
2218
- free_prog :
2219
- bpf_prog_uncharge_memlock (prog );
2220
2153
free_prog_sec :
2154
+ free_uid (prog -> aux -> user );
2221
2155
security_bpf_prog_free (prog -> aux );
2222
- free_prog_nouncharge :
2156
+ free_prog :
2223
2157
bpf_prog_free (prog );
2224
2158
return err ;
2225
2159
}
0 commit comments