@@ -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-
362345static 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-
16421580static 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 );
22202153free_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