File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -517,20 +517,31 @@ static struct dser_reset_gen dser_reset_gens[MAX_DSER_NUM];
517517static 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
536547static inline atomic_t * ds5_get_reset_gen (struct ds5 * state )
You can’t perform that action at this time.
0 commit comments