Lines Matching refs:part
16 * partition This part detects the presence/absence of other
20 * channel This part manages the channels and sends/receives
68 .init_name = "", /* set to "part" at xpc_init() time */
169 struct xpc_partition *part = from_timer(part, t, disengage_timer);
171 DBUG_ON(time_is_after_jiffies(part->disengage_timeout));
173 xpc_partition_disengaged_from_timer(part);
175 DBUG_ON(part->disengage_timeout != 0);
176 DBUG_ON(xpc_arch_ops.partition_engaged(XPC_PARTID(part)));
218 struct xpc_partition *part;
230 part = &xpc_partitions[partid];
232 if (part->act_state == XPC_P_AS_INACTIVE ||
233 part->act_state == XPC_P_AS_DEACTIVATING) {
237 ret = xpc_arch_ops.get_remote_heartbeat(part);
239 XPC_DEACTIVATE_PARTITION(part, ret);
331 xpc_channel_mgr(struct xpc_partition *part)
333 while (part->act_state != XPC_P_AS_DEACTIVATING ||
334 atomic_read(&part->nchannels_active) > 0 ||
335 !xpc_partition_disengaged(part)) {
337 xpc_process_sent_chctl_flags(part);
352 atomic_dec(&part->channel_mgr_requests);
353 (void)wait_event_interruptible(part->channel_mgr_wq,
354 (atomic_read(&part->channel_mgr_requests) > 0 ||
355 part->chctl.all_flags != 0 ||
356 (part->act_state == XPC_P_AS_DEACTIVATING &&
357 atomic_read(&part->nchannels_active) == 0 &&
358 xpc_partition_disengaged(part))));
359 atomic_set(&part->channel_mgr_requests, 1);
392 xpc_setup_ch_structures(struct xpc_partition *part)
397 short partid = XPC_PARTID(part);
403 DBUG_ON(part->channels != NULL);
404 part->channels = kcalloc(XPC_MAX_NCHANNELS,
407 if (part->channels == NULL) {
414 part->remote_openclose_args =
416 GFP_KERNEL, &part->
418 if (part->remote_openclose_args == NULL) {
424 part->chctl.all_flags = 0;
425 spin_lock_init(&part->chctl_lock);
427 atomic_set(&part->channel_mgr_requests, 1);
428 init_waitqueue_head(&part->channel_mgr_wq);
430 part->nchannels = XPC_MAX_NCHANNELS;
432 atomic_set(&part->nchannels_active, 0);
433 atomic_set(&part->nchannels_engaged, 0);
435 for (ch_number = 0; ch_number < part->nchannels; ch_number++) {
436 ch = &part->channels[ch_number];
457 ret = xpc_arch_ops.setup_ch_structures(part);
465 part->setup_state = XPC_P_SS_SETUP;
471 kfree(part->remote_openclose_args_base);
472 part->remote_openclose_args = NULL;
474 kfree(part->channels);
475 part->channels = NULL;
484 xpc_teardown_ch_structures(struct xpc_partition *part)
486 DBUG_ON(atomic_read(&part->nchannels_engaged) != 0);
487 DBUG_ON(atomic_read(&part->nchannels_active) != 0);
494 DBUG_ON(part->setup_state != XPC_P_SS_SETUP);
495 part->setup_state = XPC_P_SS_WTEARDOWN;
497 wait_event(part->teardown_wq, (atomic_read(&part->references) == 0));
501 xpc_arch_ops.teardown_ch_structures(part);
503 kfree(part->remote_openclose_args_base);
504 part->remote_openclose_args = NULL;
505 kfree(part->channels);
506 part->channels = NULL;
508 part->setup_state = XPC_P_SS_TORNDOWN;
526 struct xpc_partition *part = &xpc_partitions[partid];
531 spin_lock_irqsave(&part->act_lock, irq_flags);
533 if (part->act_state == XPC_P_AS_DEACTIVATING) {
534 part->act_state = XPC_P_AS_INACTIVE;
535 spin_unlock_irqrestore(&part->act_lock, irq_flags);
536 part->remote_rp_pa = 0;
541 DBUG_ON(part->act_state != XPC_P_AS_ACTIVATION_REQ);
542 part->act_state = XPC_P_AS_ACTIVATING;
544 XPC_SET_REASON(part, 0, 0);
545 spin_unlock_irqrestore(&part->act_lock, irq_flags);
551 if (xpc_setup_ch_structures(part) == xpSuccess) {
552 (void)xpc_part_ref(part); /* this will always succeed */
554 if (xpc_arch_ops.make_first_contact(part) == xpSuccess) {
555 xpc_mark_partition_active(part);
556 xpc_channel_mgr(part);
560 xpc_part_deref(part);
561 xpc_teardown_ch_structures(part);
565 xpc_mark_partition_inactive(part);
567 if (part->reason == xpReactivating) {
569 xpc_arch_ops.request_partition_reactivation(part);
576 xpc_activate_partition(struct xpc_partition *part)
578 short partid = XPC_PARTID(part);
582 spin_lock_irqsave(&part->act_lock, irq_flags);
584 DBUG_ON(part->act_state != XPC_P_AS_INACTIVE);
586 part->act_state = XPC_P_AS_ACTIVATION_REQ;
587 XPC_SET_REASON(part, xpCloneKThread, __LINE__);
589 spin_unlock_irqrestore(&part->act_lock, irq_flags);
594 spin_lock_irqsave(&part->act_lock, irq_flags);
595 part->act_state = XPC_P_AS_INACTIVE;
596 XPC_SET_REASON(part, xpCloneKThreadFailed, __LINE__);
597 spin_unlock_irqrestore(&part->act_lock, irq_flags);
640 xpc_kthread_waitmsgs(struct xpc_partition *part, struct xpc_channel *ch)
677 struct xpc_partition *part = &xpc_partitions[partid];
687 ch = &part->channels[ch_number];
719 xpc_kthread_waitmsgs(part, ch);
738 atomic_dec_return(&part->nchannels_engaged) == 0) {
739 xpc_arch_ops.indicate_partition_disengaged(part);
747 xpc_part_deref(part);
769 struct xpc_partition *part = &xpc_partitions[ch->partid];
793 atomic_inc_return(&part->nchannels_engaged) == 1) {
794 xpc_arch_ops.indicate_partition_engaged(part);
796 (void)xpc_part_ref(part);
815 atomic_dec_return(&part->nchannels_engaged) == 0) {
816 indicate_partition_disengaged(part);
819 xpc_part_deref(part);
843 struct xpc_partition *part;
849 part = &xpc_partitions[partid];
851 if (!xpc_part_ref(part))
854 ch = &part->channels[ch_number];
857 xpc_part_deref(part);
868 if (part->act_state != XPC_P_AS_DEACTIVATING) {
869 spin_lock(&part->chctl_lock);
870 part->chctl.flags[ch->number] |=
872 spin_unlock(&part->chctl_lock);
882 xpc_wakeup_channel_mgr(part);
884 xpc_part_deref(part);
892 struct xpc_partition *part;
911 part = &xpc_partitions[partid];
913 DBUG_ON((u64)part != L1_CACHE_ALIGN((u64)part));
915 part->activate_IRQ_rcvd = 0;
916 spin_lock_init(&part->act_lock);
917 part->act_state = XPC_P_AS_INACTIVE;
918 XPC_SET_REASON(part, 0, 0);
920 timer_setup(&part->disengage_timer,
923 part->setup_state = XPC_P_SS_UNSET;
924 init_waitqueue_head(&part->teardown_wq);
925 atomic_set(&part->references, 0);
943 struct xpc_partition *part;
975 part = &xpc_partitions[partid];
977 if (xpc_partition_disengaged(part) &&
978 part->act_state == XPC_P_AS_INACTIVE) {
984 XPC_DEACTIVATE_PARTITION(part, reason);
986 if (part->disengage_timeout > disengage_timeout)
987 disengage_timeout = part->disengage_timeout;
1080 struct xpc_partition *part;
1095 part = &xpc_partitions[partid];
1098 part->act_state != XPC_P_AS_INACTIVE) {
1099 xpc_arch_ops.request_partition_deactivation(part);
1100 xpc_arch_ops.indicate_partition_disengaged(part);
1220 dev_set_name(xpc_part, "part");