mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -04:00
Linux 5.4-rc6
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAl2/T6oeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGB7kH/2asrl7RylHPQfsI pkjPPq32MHLq6Zmr8y0N0hyJCm1Dxu8qCIktqrEV5vsbKdv5pb8EMdQRlhJUtR8e TZdYDGHiL0sFb2HYiEvL0qD9BNeI+Kftw/kUffVXRzyMWex/f5S6mW5QNTuv9SQT Zfa+sXreFPCCyd3jhQFRyguogaCXBmTYvO6glmc96Yi4nA1URtIxNXhXumoklElF 8Ka7UqtoJk2nPns+oV9I5xohghgJHHjA3A96WURku1UdO9dRoHiyS05RjnijBxsk ffenk09qbGvnvvgP93Q23CoTO8ndIm12ZL8C9jX49CS21j5SVG0PLPhS08f70vEf h5K/OtE= =nmDP -----END PGP SIGNATURE----- Merge 5.4-rc6 into android-mainline Linux 5.4-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I211f7159a46cf2a3dbb18afe56777cae1c13ac73
This commit is contained in:
commit
2a71bdee3f
429 changed files with 3954 additions and 2194 deletions
|
|
@ -502,7 +502,7 @@ int bpf_remove_insns(struct bpf_prog *prog, u32 off, u32 cnt)
|
|||
return WARN_ON_ONCE(bpf_adj_branches(prog, off, off + cnt, off, false));
|
||||
}
|
||||
|
||||
void bpf_prog_kallsyms_del_subprogs(struct bpf_prog *fp)
|
||||
static void bpf_prog_kallsyms_del_subprogs(struct bpf_prog *fp)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)
|
|||
|
||||
if (!dtab->n_buckets) /* Overflow check */
|
||||
return -EINVAL;
|
||||
cost += sizeof(struct hlist_head) * dtab->n_buckets;
|
||||
cost += (u64) sizeof(struct hlist_head) * dtab->n_buckets;
|
||||
}
|
||||
|
||||
/* if map size is larger than memlock limit, reject it */
|
||||
|
|
@ -719,6 +719,32 @@ const struct bpf_map_ops dev_map_hash_ops = {
|
|||
.map_check_btf = map_check_no_btf,
|
||||
};
|
||||
|
||||
static void dev_map_hash_remove_netdev(struct bpf_dtab *dtab,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 i;
|
||||
|
||||
spin_lock_irqsave(&dtab->index_lock, flags);
|
||||
for (i = 0; i < dtab->n_buckets; i++) {
|
||||
struct bpf_dtab_netdev *dev;
|
||||
struct hlist_head *head;
|
||||
struct hlist_node *next;
|
||||
|
||||
head = dev_map_index_hash(dtab, i);
|
||||
|
||||
hlist_for_each_entry_safe(dev, next, head, index_hlist) {
|
||||
if (netdev != dev->dev)
|
||||
continue;
|
||||
|
||||
dtab->items--;
|
||||
hlist_del_rcu(&dev->index_hlist);
|
||||
call_rcu(&dev->rcu, __dev_map_entry_free);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&dtab->index_lock, flags);
|
||||
}
|
||||
|
||||
static int dev_map_notification(struct notifier_block *notifier,
|
||||
ulong event, void *ptr)
|
||||
{
|
||||
|
|
@ -735,6 +761,11 @@ static int dev_map_notification(struct notifier_block *notifier,
|
|||
*/
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(dtab, &dev_map_list, list) {
|
||||
if (dtab->map.map_type == BPF_MAP_TYPE_DEVMAP_HASH) {
|
||||
dev_map_hash_remove_netdev(dtab, netdev);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < dtab->map.max_entries; i++) {
|
||||
struct bpf_dtab_netdev *dev, *odev;
|
||||
|
||||
|
|
|
|||
|
|
@ -1326,24 +1326,32 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)
|
|||
{
|
||||
struct bpf_prog_aux *aux = container_of(rcu, struct bpf_prog_aux, rcu);
|
||||
|
||||
kvfree(aux->func_info);
|
||||
free_used_maps(aux);
|
||||
bpf_prog_uncharge_memlock(aux->prog);
|
||||
security_bpf_prog_free(aux);
|
||||
bpf_prog_free(aux->prog);
|
||||
}
|
||||
|
||||
static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred)
|
||||
{
|
||||
bpf_prog_kallsyms_del_all(prog);
|
||||
btf_put(prog->aux->btf);
|
||||
bpf_prog_free_linfo(prog);
|
||||
|
||||
if (deferred)
|
||||
call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu);
|
||||
else
|
||||
__bpf_prog_put_rcu(&prog->aux->rcu);
|
||||
}
|
||||
|
||||
static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock)
|
||||
{
|
||||
if (atomic_dec_and_test(&prog->aux->refcnt)) {
|
||||
perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_UNLOAD, 0);
|
||||
/* bpf_prog_free_id() must be called first */
|
||||
bpf_prog_free_id(prog, do_idr_lock);
|
||||
bpf_prog_kallsyms_del_all(prog);
|
||||
btf_put(prog->aux->btf);
|
||||
kvfree(prog->aux->func_info);
|
||||
bpf_prog_free_linfo(prog);
|
||||
|
||||
call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu);
|
||||
__bpf_prog_put_noref(prog, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1741,11 +1749,12 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
|
|||
return err;
|
||||
|
||||
free_used_maps:
|
||||
bpf_prog_free_linfo(prog);
|
||||
kvfree(prog->aux->func_info);
|
||||
btf_put(prog->aux->btf);
|
||||
bpf_prog_kallsyms_del_subprogs(prog);
|
||||
free_used_maps(prog->aux);
|
||||
/* In case we have subprogs, we need to wait for a grace
|
||||
* period before we can tear down JIT memory since symbols
|
||||
* are already exposed under kallsyms.
|
||||
*/
|
||||
__bpf_prog_put_noref(prog, prog->aux->func_cnt);
|
||||
return err;
|
||||
free_prog:
|
||||
bpf_prog_uncharge_memlock(prog);
|
||||
free_prog_sec:
|
||||
|
|
|
|||
|
|
@ -798,7 +798,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
|||
cpumask_subset(cp->cpus_allowed, top_cpuset.effective_cpus))
|
||||
continue;
|
||||
|
||||
if (is_sched_load_balance(cp))
|
||||
if (is_sched_load_balance(cp) &&
|
||||
!cpumask_empty(cp->effective_cpus))
|
||||
csa[csn++] = cp;
|
||||
|
||||
/* skip @cp's subtree if not a partition root */
|
||||
|
|
|
|||
|
|
@ -10640,7 +10640,7 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,
|
|||
|
||||
attr->size = size;
|
||||
|
||||
if (attr->__reserved_1)
|
||||
if (attr->__reserved_1 || attr->__reserved_2)
|
||||
return -EINVAL;
|
||||
|
||||
if (attr->sample_type & ~(PERF_SAMPLE_MAX-1))
|
||||
|
|
|
|||
|
|
@ -1951,13 +1951,16 @@ next_level:
|
|||
static int
|
||||
build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *attr)
|
||||
{
|
||||
enum s_alloc alloc_state;
|
||||
enum s_alloc alloc_state = sa_none;
|
||||
struct sched_domain *sd;
|
||||
struct s_data d;
|
||||
int i, ret = -ENOMEM;
|
||||
struct sched_domain_topology_level *tl_asym;
|
||||
bool has_asym = false;
|
||||
|
||||
if (WARN_ON(cpumask_empty(cpu_map)))
|
||||
goto error;
|
||||
|
||||
alloc_state = __visit_domain_allocation_hell(&d, cpu_map);
|
||||
if (alloc_state != sa_rootdomain)
|
||||
goto error;
|
||||
|
|
@ -2022,7 +2025,7 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att
|
|||
rcu_read_unlock();
|
||||
|
||||
if (has_asym)
|
||||
static_branch_enable_cpuslocked(&sched_asym_cpucapacity);
|
||||
static_branch_inc_cpuslocked(&sched_asym_cpucapacity);
|
||||
|
||||
ret = 0;
|
||||
error:
|
||||
|
|
@ -2112,8 +2115,12 @@ int sched_init_domains(const struct cpumask *cpu_map)
|
|||
*/
|
||||
static void detach_destroy_domains(const struct cpumask *cpu_map)
|
||||
{
|
||||
unsigned int cpu = cpumask_any(cpu_map);
|
||||
int i;
|
||||
|
||||
if (rcu_access_pointer(per_cpu(sd_asym_cpucapacity, cpu)))
|
||||
static_branch_dec_cpuslocked(&sched_asym_cpucapacity);
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_cpu(i, cpu_map)
|
||||
cpu_attach_domain(NULL, &def_root_domain, i);
|
||||
|
|
|
|||
Loading…
Reference in a new issue