Commit e316aa6e authored by Hans de Goede's avatar Hans de Goede Committed by Benjamin Tissoires

HID: logitech-dj: remove false-positive error on double queueing of delayed-work

The various functions queueing work-items do not check there already is a
work-item queued before calling schedule_work(), as such they may race
with each-other and with the re-queuing done by the delayedwork_callback
itself.

This is fine as the delayedwork_callback simply is a nop if scheduled once
too much. I've actually seen the false-positive hid_err for this trigger
in practice, so lets remove it.

While at it also remove the somewhat overzealous debugging around the
schedule_work() calls.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
parent de76b1d3
...@@ -727,17 +727,12 @@ static void delayedwork_callback(struct work_struct *work) ...@@ -727,17 +727,12 @@ static void delayedwork_callback(struct work_struct *work)
count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
if (count != sizeof(workitem)) { if (count != sizeof(workitem)) {
hid_err(djrcv_dev->hidpp, "delayedwork queued without workitems available\n");
spin_unlock_irqrestore(&djrcv_dev->lock, flags); spin_unlock_irqrestore(&djrcv_dev->lock, flags);
return; return;
} }
if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) { if (!kfifo_is_empty(&djrcv_dev->notif_fifo))
if (schedule_work(&djrcv_dev->work) == 0) { schedule_work(&djrcv_dev->work);
dbg_hid("%s: did not schedule the work item, was "
"already queued\n", __func__);
}
}
spin_unlock_irqrestore(&djrcv_dev->lock, flags); spin_unlock_irqrestore(&djrcv_dev->lock, flags);
...@@ -819,11 +814,7 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev, ...@@ -819,11 +814,7 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
} }
kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
schedule_work(&djrcv_dev->work);
if (schedule_work(&djrcv_dev->work) == 0) {
dbg_hid("%s: did not schedule the work item, was already "
"queued\n", __func__);
}
} }
static void logi_hidpp_dev_conn_notif_equad(struct hidpp_event *hidpp_report, static void logi_hidpp_dev_conn_notif_equad(struct hidpp_event *hidpp_report,
...@@ -933,13 +924,8 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev, ...@@ -933,13 +924,8 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
device_type, hidpp_report->params[HIDPP_PARAM_PROTO_TYPE], device_type, hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
hidpp_report->device_index); hidpp_report->device_index);
kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
schedule_work(&djrcv_dev->work);
if (schedule_work(&djrcv_dev->work) == 0) {
dbg_hid("%s: did not schedule the work item, was already queued\n",
__func__);
}
} }
static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment