Skip to content

Commit

Permalink
NFC: Use system_nrt_wq instead of custom ones
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Samuel Ortiz <[email protected]>
  • Loading branch information
htejun authored and Samuel Ortiz committed Sep 24, 2012
1 parent 5db327f commit 474fee3
Show file tree
Hide file tree
Showing 9 changed files with 26 additions and 122 deletions.
2 changes: 0 additions & 2 deletions include/net/nfc/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,13 @@ struct nfc_hci_dev {

struct list_head msg_tx_queue;

struct workqueue_struct *msg_tx_wq;
struct work_struct msg_tx_work;

struct timer_list cmd_timer;
struct hci_msg *cmd_pending_msg;

struct sk_buff_head rx_hcp_frags;

struct workqueue_struct *msg_rx_wq;
struct work_struct msg_rx_work;

struct sk_buff_head msg_rx_queue;
Expand Down
1 change: 0 additions & 1 deletion include/net/nfc/nfc.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ struct nfc_dev {
int tx_tailroom;

struct timer_list check_pres_timer;
struct workqueue_struct *check_pres_wq;
struct work_struct check_pres_work;

struct nfc_ops *ops;
Expand Down
1 change: 0 additions & 1 deletion include/net/nfc/shdlc.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ struct nfc_shdlc {

struct sk_buff_head ack_pending_q;

struct workqueue_struct *sm_wq;
struct work_struct sm_work;

struct nfc_shdlc_ops *ops;
Expand Down
13 changes: 2 additions & 11 deletions net/nfc/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ static void nfc_release(struct device *d)

if (dev->ops->check_presence) {
del_timer_sync(&dev->check_pres_timer);
destroy_workqueue(dev->check_pres_wq);
cancel_work_sync(&dev->check_pres_work);
}

nfc_genl_data_exit(&dev->genl_data);
Expand Down Expand Up @@ -715,7 +715,7 @@ static void nfc_check_pres_timeout(unsigned long data)
{
struct nfc_dev *dev = (struct nfc_dev *)data;

queue_work(dev->check_pres_wq, &dev->check_pres_work);
queue_work(system_nrt_wq, &dev->check_pres_work);
}

struct class nfc_class = {
Expand Down Expand Up @@ -784,20 +784,11 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
dev->targets_generation = 1;

if (ops->check_presence) {
char name[32];
init_timer(&dev->check_pres_timer);
dev->check_pres_timer.data = (unsigned long)dev;
dev->check_pres_timer.function = nfc_check_pres_timeout;

INIT_WORK(&dev->check_pres_work, nfc_check_pres_work);
snprintf(name, sizeof(name), "nfc%d_check_pres_wq", dev->idx);
dev->check_pres_wq = alloc_workqueue(name, WQ_NON_REENTRANT |
WQ_UNBOUND |
WQ_MEM_RECLAIM, 1);
if (dev->check_pres_wq == NULL) {
kfree(dev);
return NULL;
}
}

return dev;
Expand Down
42 changes: 6 additions & 36 deletions net/nfc/hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion net/nfc/hci/hcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
27 changes: 9 additions & 18 deletions net/nfc/hci/shdlc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand All @@ -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);
}

/*
Expand All @@ -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);

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -904,9 +898,6 @@ struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
nfc_hci_free_device(shdlc->hdev);

err_allocdev:
destroy_workqueue(shdlc->sm_wq);

err_allocwq:
kfree(shdlc);

return NULL;
Expand All @@ -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);
Expand Down
Loading

0 comments on commit 474fee3

Please sign in to comment.