Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'char-misc-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
"Here are some small char/misc driver fixes for 5.14-rc5.

They resolve a few regressions that people reported:

- acrn driver fix

- fpga driver fix

- interconnect tiny driver fixes

All have been in linux-next for a while with no reported issues"

* tag 'char-misc-5.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
interconnect: Fix undersized devress_alloc allocation
interconnect: qcom: icc-rpmh: Add BCMs to commit list in pre_aggregate
interconnect: qcom: icc-rpmh: Ensure floor BW is enforced for all nodes
fpga: dfl: fme: Fix cpu hotplug issue in performance reporting
virt: acrn: Do hcall_destroy_vm() before resource release
interconnect: Always call pre_aggregate before aggregate
interconnect: Zero initial BW after sync-state

+28 -21
+2
drivers/fpga/dfl-fme-perf.c
··· 953 953 return 0; 954 954 955 955 priv->cpu = target; 956 + perf_pmu_migrate_context(&priv->pmu, cpu, target); 957 + 956 958 return 0; 957 959 } 958 960
+8 -1
drivers/interconnect/core.c
··· 403 403 { 404 404 struct icc_path **ptr, *path; 405 405 406 - ptr = devres_alloc(devm_icc_release, sizeof(**ptr), GFP_KERNEL); 406 + ptr = devres_alloc(devm_icc_release, sizeof(*ptr), GFP_KERNEL); 407 407 if (!ptr) 408 408 return ERR_PTR(-ENOMEM); 409 409 ··· 973 973 } 974 974 node->avg_bw = node->init_avg; 975 975 node->peak_bw = node->init_peak; 976 + 977 + if (provider->pre_aggregate) 978 + provider->pre_aggregate(node); 979 + 976 980 if (provider->aggregate) 977 981 provider->aggregate(node, 0, node->init_avg, node->init_peak, 978 982 &node->avg_bw, &node->peak_bw); 983 + 979 984 provider->set(node, node); 980 985 node->avg_bw = 0; 981 986 node->peak_bw = 0; ··· 1111 1106 dev_dbg(p->dev, "interconnect provider is in synced state\n"); 1112 1107 list_for_each_entry(n, &p->nodes, node_list) { 1113 1108 if (n->init_avg || n->init_peak) { 1109 + n->init_avg = 0; 1110 + n->init_peak = 0; 1114 1111 aggregate_requests(n); 1115 1112 p->set(n, n); 1116 1113 }
+10 -12
drivers/interconnect/qcom/icc-rpmh.c
··· 20 20 { 21 21 size_t i; 22 22 struct qcom_icc_node *qn; 23 + struct qcom_icc_provider *qp; 23 24 24 25 qn = node->data; 26 + qp = to_qcom_provider(node->provider); 25 27 26 28 for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 27 29 qn->sum_avg[i] = 0; 28 30 qn->max_peak[i] = 0; 29 31 } 32 + 33 + for (i = 0; i < qn->num_bcms; i++) 34 + qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); 30 35 } 31 36 EXPORT_SYMBOL_GPL(qcom_icc_pre_aggregate); 32 37 ··· 49 44 { 50 45 size_t i; 51 46 struct qcom_icc_node *qn; 52 - struct qcom_icc_provider *qp; 53 47 54 48 qn = node->data; 55 - qp = to_qcom_provider(node->provider); 56 49 57 50 if (!tag) 58 51 tag = QCOM_ICC_TAG_ALWAYS; ··· 60 57 qn->sum_avg[i] += avg_bw; 61 58 qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); 62 59 } 60 + 61 + if (node->init_avg || node->init_peak) { 62 + qn->sum_avg[i] = max_t(u64, qn->sum_avg[i], node->init_avg); 63 + qn->max_peak[i] = max_t(u64, qn->max_peak[i], node->init_peak); 64 + } 63 65 } 64 66 65 67 *agg_avg += avg_bw; 66 68 *agg_peak = max_t(u32, *agg_peak, peak_bw); 67 - 68 - for (i = 0; i < qn->num_bcms; i++) 69 - qcom_icc_bcm_voter_add(qp->voter, qn->bcms[i]); 70 69 71 70 return 0; 72 71 } ··· 84 79 int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 85 80 { 86 81 struct qcom_icc_provider *qp; 87 - struct qcom_icc_node *qn; 88 82 struct icc_node *node; 89 83 90 84 if (!src) ··· 92 88 node = src; 93 89 94 90 qp = to_qcom_provider(node->provider); 95 - qn = node->data; 96 - 97 - qn->sum_avg[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->sum_avg[QCOM_ICC_BUCKET_AMC], 98 - node->avg_bw); 99 - qn->max_peak[QCOM_ICC_BUCKET_AMC] = max_t(u64, qn->max_peak[QCOM_ICC_BUCKET_AMC], 100 - node->peak_bw); 101 91 102 92 qcom_icc_bcm_voter_commit(qp->voter); 103 93
+8 -8
drivers/virt/acrn/vm.c
··· 64 64 test_and_set_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags)) 65 65 return 0; 66 66 67 + ret = hcall_destroy_vm(vm->vmid); 68 + if (ret < 0) { 69 + dev_err(acrn_dev.this_device, 70 + "Failed to destroy VM %u\n", vm->vmid); 71 + clear_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags); 72 + return ret; 73 + } 74 + 67 75 /* Remove from global VM list */ 68 76 write_lock_bh(&acrn_vm_list_lock); 69 77 list_del_init(&vm->list); ··· 84 76 if (vm->monitor_page) { 85 77 put_page(vm->monitor_page); 86 78 vm->monitor_page = NULL; 87 - } 88 - 89 - ret = hcall_destroy_vm(vm->vmid); 90 - if (ret < 0) { 91 - dev_err(acrn_dev.this_device, 92 - "Failed to destroy VM %u\n", vm->vmid); 93 - clear_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags); 94 - return ret; 95 79 } 96 80 97 81 acrn_vm_all_ram_unmap(vm);