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)