NFC: Use system_nrt_wq instead of custom ones
NFC is using a number of custom ordered workqueues w/ WQ_MEM_RECLAIM. WQ_MEM_RECLAIM is unnecessary unless NFC is gonna be used as transport for storage device, and all use cases match one work item to one ordered workqueue - IOW, there's no actual ordering going on at all and using system_nrt_wq gives the same behavior. There's nothing to be gained by using custom workqueues. Use system_nrt_wq instead and drop all the custom ones. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
@@ -141,7 +141,7 @@ static void __nfc_hci_cmd_completion(struct nfc_hci_dev *hdev, int err,
|
||||
kfree(hdev->cmd_pending_msg);
|
||||
hdev->cmd_pending_msg = NULL;
|
||||
|
||||
queue_work(hdev->msg_tx_wq, &hdev->msg_tx_work);
|
||||
queue_work(system_nrt_wq, &hdev->msg_tx_work);
|
||||
}
|
||||
|
||||
void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result,
|
||||
@@ -326,7 +326,7 @@ static void nfc_hci_cmd_timeout(unsigned long data)
|
||||
{
|
||||
struct nfc_hci_dev *hdev = (struct nfc_hci_dev *)data;
|
||||
|
||||
queue_work(hdev->msg_tx_wq, &hdev->msg_tx_work);
|
||||
queue_work(system_nrt_wq, &hdev->msg_tx_work);
|
||||
}
|
||||
|
||||
static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count,
|
||||
@@ -659,23 +659,11 @@ EXPORT_SYMBOL(nfc_hci_free_device);
|
||||
|
||||
int nfc_hci_register_device(struct nfc_hci_dev *hdev)
|
||||
{
|
||||
struct device *dev = &hdev->ndev->dev;
|
||||
const char *devname = dev_name(dev);
|
||||
char name[32];
|
||||
int r = 0;
|
||||
|
||||
mutex_init(&hdev->msg_tx_mutex);
|
||||
|
||||
INIT_LIST_HEAD(&hdev->msg_tx_queue);
|
||||
|
||||
INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work);
|
||||
snprintf(name, sizeof(name), "%s_hci_msg_tx_wq", devname);
|
||||
hdev->msg_tx_wq = alloc_workqueue(name, WQ_NON_REENTRANT | WQ_UNBOUND |
|
||||
WQ_MEM_RECLAIM, 1);
|
||||
if (hdev->msg_tx_wq == NULL) {
|
||||
r = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
init_timer(&hdev->cmd_timer);
|
||||
hdev->cmd_timer.data = (unsigned long)hdev;
|
||||
@@ -684,27 +672,10 @@ int nfc_hci_register_device(struct nfc_hci_dev *hdev)
|
||||
skb_queue_head_init(&hdev->rx_hcp_frags);
|
||||
|
||||
INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work);
|
||||
snprintf(name, sizeof(name), "%s_hci_msg_rx_wq", devname);
|
||||
hdev->msg_rx_wq = alloc_workqueue(name, WQ_NON_REENTRANT | WQ_UNBOUND |
|
||||
WQ_MEM_RECLAIM, 1);
|
||||
if (hdev->msg_rx_wq == NULL) {
|
||||
r = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
skb_queue_head_init(&hdev->msg_rx_queue);
|
||||
|
||||
r = nfc_register_device(hdev->ndev);
|
||||
|
||||
exit:
|
||||
if (r < 0) {
|
||||
if (hdev->msg_tx_wq)
|
||||
destroy_workqueue(hdev->msg_tx_wq);
|
||||
if (hdev->msg_rx_wq)
|
||||
destroy_workqueue(hdev->msg_rx_wq);
|
||||
}
|
||||
|
||||
return r;
|
||||
return nfc_register_device(hdev->ndev);
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_hci_register_device);
|
||||
|
||||
@@ -725,9 +696,8 @@ void nfc_hci_unregister_device(struct nfc_hci_dev *hdev)
|
||||
|
||||
nfc_unregister_device(hdev->ndev);
|
||||
|
||||
destroy_workqueue(hdev->msg_tx_wq);
|
||||
|
||||
destroy_workqueue(hdev->msg_rx_wq);
|
||||
cancel_work_sync(&hdev->msg_tx_work);
|
||||
cancel_work_sync(&hdev->msg_rx_work);
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_hci_unregister_device);
|
||||
|
||||
@@ -827,7 +797,7 @@ void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb)
|
||||
nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, hcp_skb);
|
||||
} else {
|
||||
skb_queue_tail(&hdev->msg_rx_queue, hcp_skb);
|
||||
queue_work(hdev->msg_rx_wq, &hdev->msg_rx_work);
|
||||
queue_work(system_nrt_wq, &hdev->msg_rx_work);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_hci_recv_frame);
|
||||
|
@@ -108,7 +108,7 @@ int nfc_hci_hcp_message_tx(struct nfc_hci_dev *hdev, u8 pipe,
|
||||
list_add_tail(&cmd->msg_l, &hdev->msg_tx_queue);
|
||||
mutex_unlock(&hdev->msg_tx_mutex);
|
||||
|
||||
queue_work(hdev->msg_tx_wq, &hdev->msg_tx_work);
|
||||
queue_work(system_nrt_wq, &hdev->msg_tx_work);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@@ -540,7 +540,7 @@ static void nfc_shdlc_connect_timeout(unsigned long data)
|
||||
|
||||
pr_debug("\n");
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
|
||||
static void nfc_shdlc_t1_timeout(unsigned long data)
|
||||
@@ -549,7 +549,7 @@ static void nfc_shdlc_t1_timeout(unsigned long data)
|
||||
|
||||
pr_debug("SoftIRQ: need to send ack\n");
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
|
||||
static void nfc_shdlc_t2_timeout(unsigned long data)
|
||||
@@ -558,7 +558,7 @@ static void nfc_shdlc_t2_timeout(unsigned long data)
|
||||
|
||||
pr_debug("SoftIRQ: need to retransmit\n");
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
|
||||
static void nfc_shdlc_sm_work(struct work_struct *work)
|
||||
@@ -598,7 +598,7 @@ static void nfc_shdlc_sm_work(struct work_struct *work)
|
||||
case SHDLC_NEGOCIATING:
|
||||
if (timer_pending(&shdlc->connect_timer) == 0) {
|
||||
shdlc->state = SHDLC_CONNECTING;
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
|
||||
nfc_shdlc_handle_rcv_queue(shdlc);
|
||||
@@ -662,7 +662,7 @@ static int nfc_shdlc_connect(struct nfc_shdlc *shdlc)
|
||||
|
||||
mutex_unlock(&shdlc->state_mutex);
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
|
||||
wait_event(connect_wq, shdlc->connect_result != 1);
|
||||
|
||||
@@ -679,7 +679,7 @@ static void nfc_shdlc_disconnect(struct nfc_shdlc *shdlc)
|
||||
|
||||
mutex_unlock(&shdlc->state_mutex);
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -697,7 +697,7 @@ void nfc_shdlc_recv_frame(struct nfc_shdlc *shdlc, struct sk_buff *skb)
|
||||
skb_queue_tail(&shdlc->rcv_q, skb);
|
||||
}
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_shdlc_recv_frame);
|
||||
|
||||
@@ -754,7 +754,7 @@ static int nfc_shdlc_xmit(struct nfc_hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
skb_queue_tail(&shdlc->send_q, skb);
|
||||
|
||||
queue_work(shdlc->sm_wq, &shdlc->sm_work);
|
||||
queue_work(system_nrt_wq, &shdlc->sm_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -843,7 +843,6 @@ struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
|
||||
{
|
||||
struct nfc_shdlc *shdlc;
|
||||
int r;
|
||||
char name[32];
|
||||
|
||||
if (ops->xmit == NULL)
|
||||
return NULL;
|
||||
@@ -876,11 +875,6 @@ struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
|
||||
skb_queue_head_init(&shdlc->ack_pending_q);
|
||||
|
||||
INIT_WORK(&shdlc->sm_work, nfc_shdlc_sm_work);
|
||||
snprintf(name, sizeof(name), "%s_shdlc_sm_wq", devname);
|
||||
shdlc->sm_wq = alloc_workqueue(name, WQ_NON_REENTRANT | WQ_UNBOUND |
|
||||
WQ_MEM_RECLAIM, 1);
|
||||
if (shdlc->sm_wq == NULL)
|
||||
goto err_allocwq;
|
||||
|
||||
shdlc->client_headroom = tx_headroom;
|
||||
shdlc->client_tailroom = tx_tailroom;
|
||||
@@ -904,9 +898,6 @@ err_regdev:
|
||||
nfc_hci_free_device(shdlc->hdev);
|
||||
|
||||
err_allocdev:
|
||||
destroy_workqueue(shdlc->sm_wq);
|
||||
|
||||
err_allocwq:
|
||||
kfree(shdlc);
|
||||
|
||||
return NULL;
|
||||
@@ -920,7 +911,7 @@ void nfc_shdlc_free(struct nfc_shdlc *shdlc)
|
||||
nfc_hci_unregister_device(shdlc->hdev);
|
||||
nfc_hci_free_device(shdlc->hdev);
|
||||
|
||||
destroy_workqueue(shdlc->sm_wq);
|
||||
cancel_work_sync(&shdlc->sm_work);
|
||||
|
||||
skb_queue_purge(&shdlc->rcv_q);
|
||||
skb_queue_purge(&shdlc->send_q);
|
||||
|
Reference in New Issue
Block a user