From 3b5c20d784c1d2da3d5b4b22bb0b878f0c9b20a0 Mon Sep 17 00:00:00 2001 From: Arun Kumar Neelakantam Date: Mon, 1 Apr 2019 15:26:54 +0530 Subject: [PATCH] net: qrtr: Make qrtr rx threads as RT priorities To support high priority clients like sensor use cases in all system conditions elevating the router reader threads to RT priorities based on configuration. Change-Id: I6f46097f6678f2e00c3ec8872b208d773c377224 Signed-off-by: Arun Kumar Neelakantam --- net/qrtr/qrtr.c | 8 +++++++- net/qrtr/qrtr.h | 3 ++- net/qrtr/smd.c | 7 +++++-- net/qrtr/tun.c | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 44bba1f6deb0..aa113bd154e2 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -15,6 +15,7 @@ #include #include +#include #include "qrtr.h" @@ -843,13 +844,16 @@ static void qrtr_node_rx_work(struct kthread_work *work) * qrtr_endpoint_register() - register a new endpoint * @ep: endpoint to register * @nid: desired node id; may be QRTR_EP_NID_AUTO for auto-assignment + * @rt: flag to notify real time low latency endpoint * Return: 0 on success; negative error code on failure * * The specified endpoint must have the xmit function pointer set on call. */ -int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id) +int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id, + bool rt) { struct qrtr_node *node; + struct sched_param param = {.sched_priority = 1}; if (!ep || !ep->xmit) return -EINVAL; @@ -872,6 +876,8 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id) kfree(node); return -ENOMEM; } + if (rt) + sched_setscheduler(node->task, SCHED_FIFO, ¶m); mutex_init(&node->qrtr_tx_lock); INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL); diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index f9aede45fdc5..6a2cccb1296e 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -26,7 +26,8 @@ struct qrtr_endpoint { struct qrtr_node *node; }; -int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id); +int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int net_id, + bool rt); void qrtr_endpoint_unregister(struct qrtr_endpoint *ep); diff --git a/net/qrtr/smd.c b/net/qrtr/smd.c index bf0bed8a8cf7..df9db28fa9cf 100644 --- a/net/qrtr/smd.c +++ b/net/qrtr/smd.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015, Sony Mobile Communications Inc. - * Copyright (c) 2013, 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved. */ #include @@ -61,6 +61,7 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) { struct qrtr_smd_dev *qdev; u32 net_id; + bool rt; int rc; qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL); @@ -75,7 +76,9 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) if (rc < 0) net_id = QRTR_EP_NET_ID_AUTO; - rc = qrtr_endpoint_register(&qdev->ep, net_id); + rt = of_property_read_bool(rpdev->dev.of_node, "qcom,low-latency"); + + rc = qrtr_endpoint_register(&qdev->ep, net_id, rt); if (rc) return rc; diff --git a/net/qrtr/tun.c b/net/qrtr/tun.c index 39fed2056617..d317c5c00961 100644 --- a/net/qrtr/tun.c +++ b/net/qrtr/tun.c @@ -43,7 +43,7 @@ static int qrtr_tun_open(struct inode *inode, struct file *filp) filp->private_data = tun; - return qrtr_endpoint_register(&tun->ep, QRTR_EP_NET_ID_AUTO); + return qrtr_endpoint_register(&tun->ep, QRTR_EP_NET_ID_AUTO, 0); } static ssize_t qrtr_tun_read_iter(struct kiocb *iocb, struct iov_iter *to)