linux/drivers/md/dm-vdo/action-manager.h
Matthew Sakai 3f493fcea0 dm vdo: add administrative state and action manager
This patch adds the admin_state structures which are used to track the
states of individual vdo components for handling of operations like suspend
and resume. It also adds the action manager which is used to schedule and
manage cross-thread administrative and internal operations.

Co-developed-by: J. corwin Coburn <corwin@hurlbutnet.net>
Signed-off-by: J. corwin Coburn <corwin@hurlbutnet.net>
Signed-off-by: Matthew Sakai <msakai@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
2024-02-20 13:43:14 -05:00

111 lines
4.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright 2023 Red Hat
*/
#ifndef VDO_ACTION_MANAGER_H
#define VDO_ACTION_MANAGER_H
#include "admin-state.h"
#include "types.h"
/*
* An action_manager provides a generic mechanism for applying actions to multi-zone entities (such
* as the block map or slab depot). Each action manager is tied to a specific context for which it
* manages actions. The manager ensures that only one action is active on that context at a time,
* and supports at most one pending action. Calls to schedule an action when there is already a
* pending action will result in VDO_COMPONENT_BUSY errors. Actions may only be submitted to the
* action manager from a single thread (which thread is determined when the action manager is
* constructed).
*
* A scheduled action consists of four components:
*
* preamble
* an optional method to be run on the initiator thread before applying the action to all zones
* zone_action
* an optional method to be applied to each of the zones
* conclusion
* an optional method to be run on the initiator thread once the per-zone method has been
* applied to all zones
* parent
* an optional completion to be finished once the conclusion is done
*
* At least one of the three methods must be provided.
*/
/*
* A function which is to be applied asynchronously to a set of zones.
* @context: The object which holds the per-zone context for the action
* @zone_number: The number of zone to which the action is being applied
* @parent: The object to notify when the action is complete
*/
typedef void (*vdo_zone_action_fn)(void *context, zone_count_t zone_number,
struct vdo_completion *parent);
/*
* A function which is to be applied asynchronously on an action manager's initiator thread as the
* preamble of an action.
* @context: The object which holds the per-zone context for the action
* @parent: The object to notify when the action is complete
*/
typedef void (*vdo_action_preamble_fn)(void *context, struct vdo_completion *parent);
/*
* A function which will run on the action manager's initiator thread as the conclusion of an
* action.
* @context: The object which holds the per-zone context for the action
*
* Return: VDO_SUCCESS or an error
*/
typedef int (*vdo_action_conclusion_fn)(void *context);
/*
* A function to schedule an action.
* @context: The object which holds the per-zone context for the action
*
* Return: true if an action was scheduled
*/
typedef bool (*vdo_action_scheduler_fn)(void *context);
/*
* A function to get the id of the thread associated with a given zone.
* @context: The action context
* @zone_number: The number of the zone for which the thread ID is desired
*/
typedef thread_id_t (*vdo_zone_thread_getter_fn)(void *context, zone_count_t zone_number);
struct action_manager;
int __must_check vdo_make_action_manager(zone_count_t zones,
vdo_zone_thread_getter_fn get_zone_thread_id,
thread_id_t initiator_thread_id, void *context,
vdo_action_scheduler_fn scheduler,
struct vdo *vdo,
struct action_manager **manager_ptr);
const struct admin_state_code *__must_check
vdo_get_current_manager_operation(struct action_manager *manager);
void * __must_check vdo_get_current_action_context(struct action_manager *manager);
bool vdo_schedule_default_action(struct action_manager *manager);
bool vdo_schedule_action(struct action_manager *manager, vdo_action_preamble_fn preamble,
vdo_zone_action_fn action, vdo_action_conclusion_fn conclusion,
struct vdo_completion *parent);
bool vdo_schedule_operation(struct action_manager *manager,
const struct admin_state_code *operation,
vdo_action_preamble_fn preamble, vdo_zone_action_fn action,
vdo_action_conclusion_fn conclusion,
struct vdo_completion *parent);
bool vdo_schedule_operation_with_context(struct action_manager *manager,
const struct admin_state_code *operation,
vdo_action_preamble_fn preamble,
vdo_zone_action_fn action,
vdo_action_conclusion_fn conclusion,
void *context, struct vdo_completion *parent);
#endif /* VDO_ACTION_MANAGER_H */