Lines Matching refs:pinst
106 struct padata_instance *pinst = ps->pinst; in padata_do_parallel() local
116 if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID) in padata_do_parallel()
134 if ((pinst->flags & PADATA_RESET)) in padata_do_parallel()
154 queue_work(pinst->parallel_wq, &queue->work); in padata_do_parallel()
216 struct padata_instance *pinst = pd->ps->pinst; in padata_reorder() local
253 queue_work_on(cb_cpu, pinst->serial_wq, &squeue->work); in padata_reorder()
271 queue_work(pinst->serial_wq, &pd->reorder_work); in padata_reorder()
353 static int padata_setup_cpumasks(struct padata_instance *pinst) in padata_setup_cpumasks() argument
363 cpumask_copy(attrs->cpumask, pinst->cpumask.pcpu); in padata_setup_cpumasks()
364 err = apply_workqueue_attrs(pinst->parallel_wq, attrs); in padata_setup_cpumasks()
431 struct padata_instance *pinst = ps->pinst; in padata_alloc_pd() local
436 cbcpumask = pinst->rcpumask.cbcpu; in padata_alloc_pd()
437 pcpumask = pinst->rcpumask.pcpu; in padata_alloc_pd()
485 static void __padata_start(struct padata_instance *pinst) in __padata_start() argument
487 pinst->flags |= PADATA_INIT; in __padata_start()
490 static void __padata_stop(struct padata_instance *pinst) in __padata_stop() argument
492 if (!(pinst->flags & PADATA_INIT)) in __padata_stop()
495 pinst->flags &= ~PADATA_INIT; in __padata_stop()
515 static int padata_replace(struct padata_instance *pinst) in padata_replace() argument
521 pinst->flags |= PADATA_RESET; in padata_replace()
523 cpumask_copy(pinst->omask, pinst->rcpumask.pcpu); in padata_replace()
524 cpumask_and(pinst->rcpumask.pcpu, pinst->cpumask.pcpu, in padata_replace()
526 if (!cpumask_equal(pinst->omask, pinst->rcpumask.pcpu)) in padata_replace()
529 cpumask_copy(pinst->omask, pinst->rcpumask.cbcpu); in padata_replace()
530 cpumask_and(pinst->rcpumask.cbcpu, pinst->cpumask.cbcpu, in padata_replace()
532 if (!cpumask_equal(pinst->omask, pinst->rcpumask.cbcpu)) in padata_replace()
535 list_for_each_entry(ps, &pinst->pslist, list) { in padata_replace()
543 list_for_each_entry_continue_reverse(ps, &pinst->pslist, list) in padata_replace()
548 blocking_notifier_call_chain(&pinst->cpumask_change_notifier, in padata_replace()
550 &pinst->cpumask); in padata_replace()
552 pinst->flags &= ~PADATA_RESET; in padata_replace()
564 int padata_register_cpumask_notifier(struct padata_instance *pinst, in padata_register_cpumask_notifier() argument
567 return blocking_notifier_chain_register(&pinst->cpumask_change_notifier, in padata_register_cpumask_notifier()
579 int padata_unregister_cpumask_notifier(struct padata_instance *pinst, in padata_unregister_cpumask_notifier() argument
583 &pinst->cpumask_change_notifier, in padata_unregister_cpumask_notifier()
590 static bool padata_validate_cpumask(struct padata_instance *pinst, in padata_validate_cpumask() argument
594 pinst->flags |= PADATA_INVALID; in padata_validate_cpumask()
598 pinst->flags &= ~PADATA_INVALID; in padata_validate_cpumask()
602 static int __padata_set_cpumasks(struct padata_instance *pinst, in __padata_set_cpumasks() argument
609 valid = padata_validate_cpumask(pinst, pcpumask); in __padata_set_cpumasks()
611 __padata_stop(pinst); in __padata_set_cpumasks()
615 valid = padata_validate_cpumask(pinst, cbcpumask); in __padata_set_cpumasks()
617 __padata_stop(pinst); in __padata_set_cpumasks()
620 cpumask_copy(pinst->cpumask.pcpu, pcpumask); in __padata_set_cpumasks()
621 cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); in __padata_set_cpumasks()
623 err = padata_setup_cpumasks(pinst) ?: padata_replace(pinst); in __padata_set_cpumasks()
626 __padata_start(pinst); in __padata_set_cpumasks()
640 int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, in padata_set_cpumask() argument
647 mutex_lock(&pinst->lock); in padata_set_cpumask()
651 serial_mask = pinst->cpumask.cbcpu; in padata_set_cpumask()
655 parallel_mask = pinst->cpumask.pcpu; in padata_set_cpumask()
662 err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); in padata_set_cpumask()
665 mutex_unlock(&pinst->lock); in padata_set_cpumask()
677 int padata_start(struct padata_instance *pinst) in padata_start() argument
681 mutex_lock(&pinst->lock); in padata_start()
683 if (pinst->flags & PADATA_INVALID) in padata_start()
686 __padata_start(pinst); in padata_start()
688 mutex_unlock(&pinst->lock); in padata_start()
699 void padata_stop(struct padata_instance *pinst) in padata_stop() argument
701 mutex_lock(&pinst->lock); in padata_stop()
702 __padata_stop(pinst); in padata_stop()
703 mutex_unlock(&pinst->lock); in padata_stop()
709 static int __padata_add_cpu(struct padata_instance *pinst, int cpu) in __padata_add_cpu() argument
714 err = padata_replace(pinst); in __padata_add_cpu()
716 if (padata_validate_cpumask(pinst, pinst->cpumask.pcpu) && in __padata_add_cpu()
717 padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) in __padata_add_cpu()
718 __padata_start(pinst); in __padata_add_cpu()
724 static int __padata_remove_cpu(struct padata_instance *pinst, int cpu) in __padata_remove_cpu() argument
729 if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) || in __padata_remove_cpu()
730 !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu)) in __padata_remove_cpu()
731 __padata_stop(pinst); in __padata_remove_cpu()
733 err = padata_replace(pinst); in __padata_remove_cpu()
750 int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask) in padata_remove_cpu() argument
757 mutex_lock(&pinst->lock); in padata_remove_cpu()
761 cpumask_clear_cpu(cpu, pinst->cpumask.cbcpu); in padata_remove_cpu()
763 cpumask_clear_cpu(cpu, pinst->cpumask.pcpu); in padata_remove_cpu()
765 err = __padata_remove_cpu(pinst, cpu); in padata_remove_cpu()
768 mutex_unlock(&pinst->lock); in padata_remove_cpu()
774 static inline int pinst_has_cpu(struct padata_instance *pinst, int cpu) in pinst_has_cpu() argument
776 return cpumask_test_cpu(cpu, pinst->cpumask.pcpu) || in pinst_has_cpu()
777 cpumask_test_cpu(cpu, pinst->cpumask.cbcpu); in pinst_has_cpu()
782 struct padata_instance *pinst; in padata_cpu_online() local
785 pinst = hlist_entry_safe(node, struct padata_instance, cpu_online_node); in padata_cpu_online()
786 if (!pinst_has_cpu(pinst, cpu)) in padata_cpu_online()
789 mutex_lock(&pinst->lock); in padata_cpu_online()
790 ret = __padata_add_cpu(pinst, cpu); in padata_cpu_online()
791 mutex_unlock(&pinst->lock); in padata_cpu_online()
797 struct padata_instance *pinst; in padata_cpu_dead() local
800 pinst = hlist_entry_safe(node, struct padata_instance, cpu_dead_node); in padata_cpu_dead()
801 if (!pinst_has_cpu(pinst, cpu)) in padata_cpu_dead()
804 mutex_lock(&pinst->lock); in padata_cpu_dead()
805 ret = __padata_remove_cpu(pinst, cpu); in padata_cpu_dead()
806 mutex_unlock(&pinst->lock); in padata_cpu_dead()
813 static void __padata_free(struct padata_instance *pinst) in __padata_free() argument
817 &pinst->cpu_dead_node); in __padata_free()
818 cpuhp_state_remove_instance_nocalls(hp_online, &pinst->cpu_online_node); in __padata_free()
821 WARN_ON(!list_empty(&pinst->pslist)); in __padata_free()
823 padata_stop(pinst); in __padata_free()
824 free_cpumask_var(pinst->omask); in __padata_free()
825 free_cpumask_var(pinst->rcpumask.cbcpu); in __padata_free()
826 free_cpumask_var(pinst->rcpumask.pcpu); in __padata_free()
827 free_cpumask_var(pinst->cpumask.pcpu); in __padata_free()
828 free_cpumask_var(pinst->cpumask.cbcpu); in __padata_free()
829 destroy_workqueue(pinst->serial_wq); in __padata_free()
830 destroy_workqueue(pinst->parallel_wq); in __padata_free()
831 kfree(pinst); in __padata_free()
841 struct padata_instance *pinst = kobj2pinst(kobj); in padata_sysfs_release() local
842 __padata_free(pinst); in padata_sysfs_release()
852 static ssize_t show_cpumask(struct padata_instance *pinst, in show_cpumask() argument
858 mutex_lock(&pinst->lock); in show_cpumask()
860 cpumask = pinst->cpumask.cbcpu; in show_cpumask()
862 cpumask = pinst->cpumask.pcpu; in show_cpumask()
866 mutex_unlock(&pinst->lock); in show_cpumask()
870 static ssize_t store_cpumask(struct padata_instance *pinst, in store_cpumask() argument
888 ret = padata_set_cpumask(pinst, mask_type, new_cpumask); in store_cpumask()
922 struct padata_instance *pinst; in padata_sysfs_show() local
926 pinst = kobj2pinst(kobj); in padata_sysfs_show()
929 ret = pentry->show(pinst, attr, buf); in padata_sysfs_show()
937 struct padata_instance *pinst; in padata_sysfs_store() local
941 pinst = kobj2pinst(kobj); in padata_sysfs_store()
944 ret = pentry->store(pinst, attr, buf, count); in padata_sysfs_store()
972 struct padata_instance *pinst; in padata_alloc() local
974 pinst = kzalloc(sizeof(struct padata_instance), GFP_KERNEL); in padata_alloc()
975 if (!pinst) in padata_alloc()
978 pinst->parallel_wq = alloc_workqueue("%s_parallel", WQ_UNBOUND, 0, in padata_alloc()
980 if (!pinst->parallel_wq) in padata_alloc()
985 pinst->serial_wq = alloc_workqueue("%s_serial", WQ_MEM_RECLAIM | in padata_alloc()
987 if (!pinst->serial_wq) in padata_alloc()
990 if (!alloc_cpumask_var(&pinst->cpumask.pcpu, GFP_KERNEL)) in padata_alloc()
992 if (!alloc_cpumask_var(&pinst->cpumask.cbcpu, GFP_KERNEL)) { in padata_alloc()
993 free_cpumask_var(pinst->cpumask.pcpu); in padata_alloc()
996 if (!padata_validate_cpumask(pinst, pcpumask) || in padata_alloc()
997 !padata_validate_cpumask(pinst, cbcpumask)) in padata_alloc()
1000 if (!alloc_cpumask_var(&pinst->rcpumask.pcpu, GFP_KERNEL)) in padata_alloc()
1002 if (!alloc_cpumask_var(&pinst->rcpumask.cbcpu, GFP_KERNEL)) in padata_alloc()
1004 if (!alloc_cpumask_var(&pinst->omask, GFP_KERNEL)) in padata_alloc()
1007 INIT_LIST_HEAD(&pinst->pslist); in padata_alloc()
1009 cpumask_copy(pinst->cpumask.pcpu, pcpumask); in padata_alloc()
1010 cpumask_copy(pinst->cpumask.cbcpu, cbcpumask); in padata_alloc()
1011 cpumask_and(pinst->rcpumask.pcpu, pcpumask, cpu_online_mask); in padata_alloc()
1012 cpumask_and(pinst->rcpumask.cbcpu, cbcpumask, cpu_online_mask); in padata_alloc()
1014 if (padata_setup_cpumasks(pinst)) in padata_alloc()
1017 pinst->flags = 0; in padata_alloc()
1019 BLOCKING_INIT_NOTIFIER_HEAD(&pinst->cpumask_change_notifier); in padata_alloc()
1020 kobject_init(&pinst->kobj, &padata_attr_type); in padata_alloc()
1021 mutex_init(&pinst->lock); in padata_alloc()
1025 &pinst->cpu_online_node); in padata_alloc()
1027 &pinst->cpu_dead_node); in padata_alloc()
1032 return pinst; in padata_alloc()
1035 free_cpumask_var(pinst->omask); in padata_alloc()
1037 free_cpumask_var(pinst->rcpumask.cbcpu); in padata_alloc()
1039 free_cpumask_var(pinst->rcpumask.pcpu); in padata_alloc()
1041 free_cpumask_var(pinst->cpumask.pcpu); in padata_alloc()
1042 free_cpumask_var(pinst->cpumask.cbcpu); in padata_alloc()
1044 destroy_workqueue(pinst->serial_wq); in padata_alloc()
1047 destroy_workqueue(pinst->parallel_wq); in padata_alloc()
1049 kfree(pinst); in padata_alloc()
1072 void padata_free(struct padata_instance *pinst) in padata_free() argument
1074 kobject_put(&pinst->kobj); in padata_free()
1083 struct padata_shell *padata_alloc_shell(struct padata_instance *pinst) in padata_alloc_shell() argument
1092 ps->pinst = pinst; in padata_alloc_shell()
1101 mutex_lock(&pinst->lock); in padata_alloc_shell()
1103 list_add(&ps->list, &pinst->pslist); in padata_alloc_shell()
1104 mutex_unlock(&pinst->lock); in padata_alloc_shell()
1122 struct padata_instance *pinst = ps->pinst; in padata_free_shell() local
1124 mutex_lock(&pinst->lock); in padata_free_shell()
1127 mutex_unlock(&pinst->lock); in padata_free_shell()