diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index 865f796a0d71..41d24d412f5d 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -29,8 +29,9 @@ static struct { struct socket *sock; struct sockaddr_qrtr bcast_sq; struct list_head lookups; - struct workqueue_struct *workqueue; - struct work_struct work; + struct kthread_worker kworker; + struct kthread_work work; + struct task_struct *task; int local_node; } qrtr_ns; @@ -628,7 +629,7 @@ static void ns_log_msg(const struct qrtr_ctrl_pkt *pkt, le32_to_cpu(pkt->server.instance)); } -static void qrtr_ns_worker(struct work_struct *work) +static void qrtr_ns_worker(struct kthread_work *work) { const struct qrtr_ctrl_pkt *pkt; size_t recv_buf_size = 4096; @@ -724,7 +725,7 @@ static void qrtr_ns_worker(struct work_struct *work) static void qrtr_ns_data_ready(struct sock *sk) { - queue_work(qrtr_ns.workqueue, &qrtr_ns.work); + kthread_queue_work(&qrtr_ns.kworker, &qrtr_ns.work); } void qrtr_ns_init(void) @@ -734,7 +735,8 @@ void qrtr_ns_init(void) int ret; INIT_LIST_HEAD(&qrtr_ns.lookups); - INIT_WORK(&qrtr_ns.work, qrtr_ns_worker); + kthread_init_worker(&qrtr_ns.kworker); + kthread_init_work(&qrtr_ns.work, qrtr_ns_worker); ns_ilc = ipc_log_context_create(NS_LOG_PAGE_CNT, "qrtr_ns", 0); @@ -749,9 +751,13 @@ void qrtr_ns_init(void) goto err_sock; } - qrtr_ns.workqueue = alloc_workqueue("qrtr_ns_handler", WQ_UNBOUND, 1); - if (!qrtr_ns.workqueue) + qrtr_ns.task = kthread_run(kthread_worker_fn, &qrtr_ns.kworker, + "qrtr_ns"); + if (IS_ERR(qrtr_ns.task)) { + pr_err("failed to spawn worker thread %ld\n", + PTR_ERR(qrtr_ns.task)); goto err_sock; + } qrtr_ns.sock->sk->sk_data_ready = qrtr_ns_data_ready; @@ -777,7 +783,7 @@ void qrtr_ns_init(void) return; err_wq: - destroy_workqueue(qrtr_ns.workqueue); + kthread_stop(qrtr_ns.task); err_sock: sock_release(qrtr_ns.sock); } @@ -785,8 +791,8 @@ EXPORT_SYMBOL_GPL(qrtr_ns_init); void qrtr_ns_remove(void) { - cancel_work_sync(&qrtr_ns.work); - destroy_workqueue(qrtr_ns.workqueue); + kthread_flush_worker(&qrtr_ns.kworker); + kthread_stop(qrtr_ns.task); sock_release(qrtr_ns.sock); } EXPORT_SYMBOL_GPL(qrtr_ns_remove);