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: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
This commit is contained in:
parent
de76b1d333
commit
e316aa6e54
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
|
|
Loading…
Reference in New Issue