rpmsg: glink: Add option to affine resources to CPUs

On certain systems, all resources for a specific usecase may be pinned
to a specific cpu set to meet power and performance requirements. Add
support to define a cpu set for the irq and rx thread in device tree.
This change does not include any hotplug support.

Change-Id: I0e18e3cb1880886dddf20ce0e2744e7af3b8b553
Signed-off-by: Chris Lew <clew@codeaurora.org>
This commit is contained in:
Chris Lew 2018-08-29 17:53:41 -07:00 committed by Gerrit - the friendly Code Review server
parent 535ff8c1f8
commit 245c259be8

View File

@ -123,6 +123,7 @@ struct qcom_glink {
struct kthread_worker kworker;
struct task_struct *task;
struct cpumask cpu_mask;
struct work_struct rx_work;
spinlock_t rx_lock;
@ -1945,6 +1946,22 @@ static int qcom_glink_create_chrdev(struct qcom_glink *glink)
return rpmsg_ctrldev_register_device(rpdev);
}
static void qcom_glink_set_affinity(struct qcom_glink *glink, u32 *arr,
size_t size)
{
int i;
cpumask_clear(&glink->cpu_mask);
for (i = 0; i < size; i++) {
if (arr[i] < num_possible_cpus())
cpumask_set_cpu(arr[i], &glink->cpu_mask);
}
if (irq_set_affinity_hint(glink->irq, &glink->cpu_mask))
dev_err(glink->dev, "failed to set irq affinity\n");
if (set_cpus_allowed_ptr(glink->task, &glink->cpu_mask))
dev_err(glink->dev, "failed to set task affinity\n");
}
struct qcom_glink *qcom_glink_native_probe(struct device *dev,
unsigned long features,
struct qcom_glink_pipe *rx,
@ -2013,6 +2030,8 @@ EXPORT_SYMBOL(qcom_glink_native_probe);
int qcom_glink_native_start(struct qcom_glink *glink)
{
struct device *dev = glink->dev;
u32 *arr;
int size;
int irq;
int ret;
@ -2032,6 +2051,18 @@ int qcom_glink_native_start(struct qcom_glink *glink)
glink->irq = irq;
size = of_property_count_u32_elems(dev->of_node, "cpu-affinity");
if (size > 0) {
arr = kmalloc_array(size, sizeof(u32), GFP_KERNEL);
if (!arr)
return -ENOMEM;
ret = of_property_read_u32_array(dev->of_node, "cpu-affinity",
arr, size);
if (!ret)
qcom_glink_set_affinity(glink, arr, size);
kfree(arr);
}
ret = qcom_glink_send_version(glink);
if (ret)
return ret;