Loading kernel/padata.c +20 −7 Original line number Diff line number Diff line Loading @@ -47,6 +47,22 @@ struct padata_mt_job_state { static void padata_free_pd(struct parallel_data *pd); static void __init padata_mt_helper(struct work_struct *work); static inline void padata_get_pd(struct parallel_data *pd) { refcount_inc(&pd->refcnt); } static inline void padata_put_pd_cnt(struct parallel_data *pd, int cnt) { if (refcount_sub_and_test(cnt, &pd->refcnt)) padata_free_pd(pd); } static inline void padata_put_pd(struct parallel_data *pd) { padata_put_pd_cnt(pd, 1); } static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) { int cpu, target_cpu; Loading Loading @@ -206,7 +222,7 @@ int padata_do_parallel(struct padata_shell *ps, if ((pinst->flags & PADATA_RESET)) goto out; refcount_inc(&pd->refcnt); padata_get_pd(pd); padata->pd = pd; padata->cb_cpu = *cb_cpu; Loading Loading @@ -380,8 +396,7 @@ static void padata_serial_worker(struct work_struct *serial_work) } local_bh_enable(); if (refcount_sub_and_test(cnt, &pd->refcnt)) padata_free_pd(pd); padata_put_pd_cnt(pd, cnt); } /** Loading Loading @@ -681,8 +696,7 @@ static int padata_replace(struct padata_instance *pinst) synchronize_rcu(); list_for_each_entry_continue_reverse(ps, &pinst->pslist, list) if (refcount_dec_and_test(&ps->opd->refcnt)) padata_free_pd(ps->opd); padata_put_pd(ps->opd); pinst->flags &= ~PADATA_RESET; Loading Loading @@ -1124,8 +1138,7 @@ void padata_free_shell(struct padata_shell *ps) mutex_lock(&ps->pinst->lock); list_del(&ps->list); pd = rcu_dereference_protected(ps->pd, 1); if (refcount_dec_and_test(&pd->refcnt)) padata_free_pd(pd); padata_put_pd(pd); mutex_unlock(&ps->pinst->lock); kfree(ps); Loading Loading
kernel/padata.c +20 −7 Original line number Diff line number Diff line Loading @@ -47,6 +47,22 @@ struct padata_mt_job_state { static void padata_free_pd(struct parallel_data *pd); static void __init padata_mt_helper(struct work_struct *work); static inline void padata_get_pd(struct parallel_data *pd) { refcount_inc(&pd->refcnt); } static inline void padata_put_pd_cnt(struct parallel_data *pd, int cnt) { if (refcount_sub_and_test(cnt, &pd->refcnt)) padata_free_pd(pd); } static inline void padata_put_pd(struct parallel_data *pd) { padata_put_pd_cnt(pd, 1); } static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) { int cpu, target_cpu; Loading Loading @@ -206,7 +222,7 @@ int padata_do_parallel(struct padata_shell *ps, if ((pinst->flags & PADATA_RESET)) goto out; refcount_inc(&pd->refcnt); padata_get_pd(pd); padata->pd = pd; padata->cb_cpu = *cb_cpu; Loading Loading @@ -380,8 +396,7 @@ static void padata_serial_worker(struct work_struct *serial_work) } local_bh_enable(); if (refcount_sub_and_test(cnt, &pd->refcnt)) padata_free_pd(pd); padata_put_pd_cnt(pd, cnt); } /** Loading Loading @@ -681,8 +696,7 @@ static int padata_replace(struct padata_instance *pinst) synchronize_rcu(); list_for_each_entry_continue_reverse(ps, &pinst->pslist, list) if (refcount_dec_and_test(&ps->opd->refcnt)) padata_free_pd(ps->opd); padata_put_pd(ps->opd); pinst->flags &= ~PADATA_RESET; Loading Loading @@ -1124,8 +1138,7 @@ void padata_free_shell(struct padata_shell *ps) mutex_lock(&ps->pinst->lock); list_del(&ps->list); pd = rcu_dereference_protected(ps->pd, 1); if (refcount_dec_and_test(&pd->refcnt)) padata_free_pd(pd); padata_put_pd(pd); mutex_unlock(&ps->pinst->lock); kfree(ps); Loading