Skip to content

Commit 7aa68c0

Browse files
Nikolai-LCopilot
andauthored
Protecting dser_reset_gens with a lock (Copilot)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 2726ce1 commit 7aa68c0

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

kernel/realsense/d4xx.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -517,20 +517,31 @@ static struct dser_reset_gen dser_reset_gens[MAX_DSER_NUM];
517517
static atomic_t *ds5_get_reset_gen(struct ds5 *state)
518518
{
519519
int i;
520+
int free_idx = -1;
521+
atomic_t *gen = &ds5_reset_gen;
520522

521523
if (state->dser_dev) {
524+
mutex_lock(&serdes_lock__);
522525
for (i = 0; i < MAX_DSER_NUM; i++) {
523-
if (dser_reset_gens[i].dser_dev == state->dser_dev)
524-
return &dser_reset_gens[i].gen;
525-
if (!dser_reset_gens[i].dser_dev) {
526-
dser_reset_gens[i].dser_dev = state->dser_dev;
527-
atomic_set(&dser_reset_gens[i].gen, 0);
528-
return &dser_reset_gens[i].gen;
526+
if (dser_reset_gens[i].dser_dev == state->dser_dev) {
527+
gen = &dser_reset_gens[i].gen;
528+
goto out_unlock;
529529
}
530+
if (!dser_reset_gens[i].dser_dev && free_idx < 0)
531+
free_idx = i;
532+
}
533+
534+
if (free_idx >= 0) {
535+
dser_reset_gens[free_idx].dser_dev = state->dser_dev;
536+
atomic_set(&dser_reset_gens[free_idx].gen, 0);
537+
gen = &dser_reset_gens[free_idx].gen;
530538
}
539+
out_unlock:
540+
mutex_unlock(&serdes_lock__);
531541
}
542+
532543
/* Fallback: table full or no deserializer */
533-
return &ds5_reset_gen;
544+
return gen;
534545
}
535546
#else
536547
static inline atomic_t *ds5_get_reset_gen(struct ds5 *state)

0 commit comments

Comments
 (0)