aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-03-11 14:35:16 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2022-03-11 14:35:16 +0200
commit68a0e85104c2f6b7b91d26b9d6592ba7efa545f6 (patch)
treeaa7dd632085c036dbcd9e7cdf8f1d5e443be1467
parent4d0e647f17560d968e8a0243f2783627ca632db0 (diff)
downloadhid-tmff2-68a0e85104c2f6b7b91d26b9d6592ba7efa545f6.tar.gz
hid-tmff2-68a0e85104c2f6b7b91d26b9d6592ba7efa545f6.zip
add locks around work handler
-rw-r--r--hid-tmt300rs.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/hid-tmt300rs.c b/hid-tmt300rs.c
index 5bbf295..4a73d60 100644
--- a/hid-tmt300rs.c
+++ b/hid-tmt300rs.c
@@ -855,10 +855,12 @@ static void t300rs_work_handler(struct work_struct *w)
struct t300rs_device_entry *t300rs = container_of(dw, struct t300rs_device_entry, work);
struct t300rs_effect_state *state;
int max_count = 0, effect_id, ret;
+ unsigned long jiffies_now;
for (effect_id = 0; effect_id < T300RS_MAX_EFFECTS; ++effect_id) {
- unsigned long jiffies_now = JIFFIES2MS(jiffies);
+ spin_lock(&t300rs->lock);
+ jiffies_now = JIFFIES2MS(jiffies);
state = &t300rs->states[effect_id];
if (test_bit(FF_EFFECT_PLAYING, &state->flags) && state->effect.replay.length) {
@@ -927,6 +929,8 @@ static void t300rs_work_handler(struct work_struct *w)
if (state->count > max_count)
max_count = state->count;
+
+ spin_unlock(&t300rs->lock);
}
if (max_count)
@@ -951,7 +955,7 @@ static int t300rs_upload(struct input_dev *dev,
state = &t300rs->states[effect->id];
- spin_lock_irqsave(&t300rs->lock, t300rs->lock_flags);
+ spin_lock(&t300rs->lock);
state->effect = *effect;
@@ -964,7 +968,7 @@ static int t300rs_upload(struct input_dev *dev,
__set_bit(FF_EFFECT_QUEUE_UPLOAD, &state->flags);
}
- spin_unlock_irqrestore(&t300rs->lock, t300rs->lock_flags);
+ spin_unlock(&t300rs->lock);
return 0;
}
@@ -986,7 +990,7 @@ static int t300rs_play(struct input_dev *dev, int effect_id, int value)
if (&state->effect == 0)
return 0;
- spin_lock_irqsave(&t300rs->lock, t300rs->lock_flags);
+ spin_lock(&t300rs->lock);
if (value > 0) {
state->count = value;
@@ -1000,7 +1004,7 @@ static int t300rs_play(struct input_dev *dev, int effect_id, int value)
__set_bit(FF_EFFECT_QUEUE_STOP, &state->flags);
}
- spin_unlock_irqrestore(&t300rs->lock, t300rs->lock_flags);
+ spin_unlock(&t300rs->lock);
if (!delayed_work_pending(&t300rs->work))
schedule_delayed_work(&t300rs->work, 0);