Lines Matching refs:pinst

67 	struct padata_instance *pinst;  in padata_parallel_worker()  local
74 pinst = pd->pinst; in padata_parallel_worker()
106 int padata_do_parallel(struct padata_instance *pinst, in padata_do_parallel() argument
115 pd = rcu_dereference_bh(pinst->pd); in padata_do_parallel()
118 if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID) in padata_do_parallel()
125 if ((pinst->flags & PADATA_RESET)) in padata_do_parallel()
143 queue_work_on(target_cpu, pinst->wq, &queue->work); in padata_do_parallel()
221 struct padata_instance *pinst = pd->pinst; in padata_reorder() local
266 queue_work_on(cb_cpu, pinst->wq, &squeue->work); in padata_reorder()
277 && !(pinst->flags & PADATA_RESET)) in padata_reorder()
408 static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, in padata_alloc_pd() argument
434 pd->pinst = pinst; in padata_alloc_pd()
483 static void __padata_start(struct padata_instance *pinst) in __padata_start() argument
485 pinst->flags |= PADATA_INIT; in __padata_start()
488 static void __padata_stop(struct padata_instance *pinst) in __padata_stop() argument
490 if (!(pinst->flags & PADATA_INIT)) in __padata_stop()
493 pinst->flags &= ~PADATA_INIT; in __padata_stop()
498 padata_flush_queues(pinst->pd); in __padata_stop()
503 static void padata_replace(struct padata_instance *pinst, in padata_replace() argument
506 struct parallel_data *pd_old = pinst->pd; in padata_replace()
509 pinst->flags |= PADATA_RESET; in padata_replace()
511 rcu_assign_pointer(pinst->pd, pd_new); in padata_replace()
524 blocking_notifier_call_chain(&pinst->cpumask_change_notifier, in padata_replace()
528 pinst->flags &= ~PADATA_RESET; in padata_replace()
538 int padata_register_cpumask_notifier(struct padata_instance *pinst, in padata_register_cpumask_notifier() argument
541 return blocking_notifier_chain_register(&pinst->cpumask_change_notifier, in padata_register_cpumask_notifier()
553 int padata_unregister_cpumask_notifier(struct padata_instance *pinst, in padata_unregister_cpumask_notifier() argument
557 &pinst->cpumask_change_notifier, in padata_unregister_cpumask_notifier()
564 static bool padata_validate_cpumask(struct padata_instance *pinst, in padata_validate_cpumask() argument
568 pinst->flags |= PADATA_INVALID; in padata_validate_cpumask()
572 pinst->flags &= ~PADATA_INVALID; in padata_validate_cpumask()
576 static int __padata_set_cpumasks(struct padata_instance *pinst, in __padata_set_cpumasks() argument
583 valid = padata_validate_cpumask(pinst, pcpumask); in __padata_set_cpumasks()
585 __padata_stop(pinst); in __padata_set_cpumasks()
589 valid = padata_validate_cpumask(pinst, cbcpumask); in __padata_set_cpumasks()
591 __padata_stop(pinst); in __padata_set_cpumasks()
594 pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); in __padata_set_cpumasks()
598 cpumask_copy(pinst->cpumask.pcpu, pcpumask); in __padata_set_cpumasks()
599 cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); in __padata_set_cpumasks()
601 padata_replace(pinst, pd); in __padata_set_cpumasks()
604 __padata_start(pinst); in __padata_set_cpumasks()
618 int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask, in padata_set_cpumasks() argument
623 mutex_lock(&pinst->lock); in padata_set_cpumasks()
626 err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask); in padata_set_cpumasks()
629 mutex_unlock(&pinst->lock); in padata_set_cpumasks()
645 int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, in padata_set_cpumask() argument
651 mutex_lock(&pinst->lock); in padata_set_cpumask()
656 serial_mask = pinst->cpumask.cbcpu; in padata_set_cpumask()
660 parallel_mask = pinst->cpumask.pcpu; in padata_set_cpumask()
667 err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); in padata_set_cpumask()
671 mutex_unlock(&pinst->lock); in padata_set_cpumask()
677 static int __padata_add_cpu(struct padata_instance *pinst, int cpu) in __padata_add_cpu() argument
682 pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, in __padata_add_cpu()
683 pinst->cpumask.cbcpu); in __padata_add_cpu()
687 padata_replace(pinst, pd); in __padata_add_cpu()
689 if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) && in __padata_add_cpu()
690 padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) in __padata_add_cpu()
691 __padata_start(pinst); in __padata_add_cpu()
709 int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask) in padata_add_cpu() argument
716 mutex_lock(&pinst->lock); in padata_add_cpu()
720 cpumask_set_cpu(cpu, pinst->cpumask.cbcpu); in padata_add_cpu()
722 cpumask_set_cpu(cpu, pinst->cpumask.pcpu); in padata_add_cpu()
724 err = __padata_add_cpu(pinst, cpu); in padata_add_cpu()
727 mutex_unlock(&pinst->lock); in padata_add_cpu()
733 static int __padata_remove_cpu(struct padata_instance *pinst, int cpu) in __padata_remove_cpu() argument
739 if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) || in __padata_remove_cpu()
740 !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) in __padata_remove_cpu()
741 __padata_stop(pinst); in __padata_remove_cpu()
743 pd = padata_alloc_pd(pinst, pinst->cpumask.pcpu, in __padata_remove_cpu()
744 pinst->cpumask.cbcpu); in __padata_remove_cpu()
748 padata_replace(pinst, pd); in __padata_remove_cpu()
768 int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask) in padata_remove_cpu() argument
775 mutex_lock(&pinst->lock); in padata_remove_cpu()
779 cpumask_clear_cpu(cpu, pinst->cpumask.cbcpu); in padata_remove_cpu()
781 cpumask_clear_cpu(cpu, pinst->cpumask.pcpu); in padata_remove_cpu()
783 err = __padata_remove_cpu(pinst, cpu); in padata_remove_cpu()
786 mutex_unlock(&pinst->lock); in padata_remove_cpu()
797 int padata_start(struct padata_instance *pinst) in padata_start() argument
801 mutex_lock(&pinst->lock); in padata_start()
803 if (pinst->flags & PADATA_INVALID) in padata_start()
806 __padata_start(pinst); in padata_start()
808 mutex_unlock(&pinst->lock); in padata_start()
819 void padata_stop(struct padata_instance *pinst) in padata_stop() argument
821 mutex_lock(&pinst->lock); in padata_stop()
822 __padata_stop(pinst); in padata_stop()
823 mutex_unlock(&pinst->lock); in padata_stop()
829 static inline int pinst_has_cpu(struct padata_instance *pinst, int cpu) in pinst_has_cpu() argument
831 return cpumask_test_cpu(cpu, pinst->cpumask.pcpu) || in pinst_has_cpu()
832 cpumask_test_cpu(cpu, pinst->cpumask.cbcpu); in pinst_has_cpu()
840 struct padata_instance *pinst; in padata_cpu_callback() local
843 pinst = container_of(nfb, struct padata_instance, cpu_notifier); in padata_cpu_callback()
850 if (!pinst_has_cpu(pinst, cpu)) in padata_cpu_callback()
852 mutex_lock(&pinst->lock); in padata_cpu_callback()
853 err = __padata_add_cpu(pinst, cpu); in padata_cpu_callback()
854 mutex_unlock(&pinst->lock); in padata_cpu_callback()
863 if (!pinst_has_cpu(pinst, cpu)) in padata_cpu_callback()
865 mutex_lock(&pinst->lock); in padata_cpu_callback()
866 err = __padata_remove_cpu(pinst, cpu); in padata_cpu_callback()
867 mutex_unlock(&pinst->lock); in padata_cpu_callback()
877 static void __padata_free(struct padata_instance *pinst) in __padata_free() argument
880 unregister_hotcpu_notifier(&pinst->cpu_notifier); in __padata_free()
883 padata_stop(pinst); in __padata_free()
884 padata_free_pd(pinst->pd); in __padata_free()
885 free_cpumask_var(pinst->cpumask.pcpu); in __padata_free()
886 free_cpumask_var(pinst->cpumask.cbcpu); in __padata_free()
887 kfree(pinst); in __padata_free()
897 struct padata_instance *pinst = kobj2pinst(kobj); in padata_sysfs_release() local
898 __padata_free(pinst); in padata_sysfs_release()
908 static ssize_t show_cpumask(struct padata_instance *pinst, in show_cpumask() argument
914 mutex_lock(&pinst->lock); in show_cpumask()
916 cpumask = pinst->cpumask.cbcpu; in show_cpumask()
918 cpumask = pinst->cpumask.pcpu; in show_cpumask()
922 mutex_unlock(&pinst->lock); in show_cpumask()
926 static ssize_t store_cpumask(struct padata_instance *pinst, in store_cpumask() argument
944 ret = padata_set_cpumask(pinst, mask_type, new_cpumask); in store_cpumask()
977 struct padata_instance *pinst; in padata_sysfs_show() local
981 pinst = kobj2pinst(kobj); in padata_sysfs_show()
984 ret = pentry->show(pinst, attr, buf); in padata_sysfs_show()
992 struct padata_instance *pinst; in padata_sysfs_store() local
996 pinst = kobj2pinst(kobj); in padata_sysfs_store()
999 ret = pentry->store(pinst, attr, buf, count); in padata_sysfs_store()
1040 struct padata_instance *pinst; in padata_alloc() local
1043 pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL); in padata_alloc()
1044 if (!pinst) in padata_alloc()
1048 if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL)) in padata_alloc()
1050 if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) { in padata_alloc()
1051 free_cpumask_var(pinst->cpumask.pcpu); in padata_alloc()
1054 if (!padata_validate_cpumask(pinst, pcpumask) || in padata_alloc()
1055 !padata_validate_cpumask(pinst, cbcpumask)) in padata_alloc()
1058 pd = padata_alloc_pd(pinst, pcpumask, cbcpumask); in padata_alloc()
1062 rcu_assign_pointer(pinst->pd, pd); in padata_alloc()
1064 pinst->wq = wq; in padata_alloc()
1066 cpumask_copy(pinst->cpumask.pcpu, pcpumask); in padata_alloc()
1067 cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); in padata_alloc()
1069 pinst->flags = 0; in padata_alloc()
1073 BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier); in padata_alloc()
1074 kobject_init(&pinst->kobj, &padata_attr_type); in padata_alloc()
1075 mutex_init(&pinst->lock); in padata_alloc()
1078 pinst->cpu_notifier.notifier_call = padata_cpu_callback; in padata_alloc()
1079 pinst->cpu_notifier.priority = 0; in padata_alloc()
1080 register_hotcpu_notifier(&pinst->cpu_notifier); in padata_alloc()
1083 return pinst; in padata_alloc()
1086 free_cpumask_var(pinst->cpumask.pcpu); in padata_alloc()
1087 free_cpumask_var(pinst->cpumask.cbcpu); in padata_alloc()
1089 kfree(pinst); in padata_alloc()
1101 void padata_free(struct padata_instance *pinst) in padata_free() argument
1103 kobject_put(&pinst->kobj); in padata_free()