Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
90 lines
2.7 KiB
C
90 lines
2.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright 2023 Red Hat
|
|
*/
|
|
|
|
#ifndef VDO_LOGICAL_ZONE_H
|
|
#define VDO_LOGICAL_ZONE_H
|
|
|
|
#include <linux/list.h>
|
|
|
|
#include "admin-state.h"
|
|
#include "int-map.h"
|
|
#include "types.h"
|
|
|
|
struct physical_zone;
|
|
|
|
struct logical_zone {
|
|
/* The completion for flush notifications */
|
|
struct vdo_completion completion;
|
|
/* The owner of this zone */
|
|
struct logical_zones *zones;
|
|
/* Which logical zone this is */
|
|
zone_count_t zone_number;
|
|
/* The thread id for this zone */
|
|
thread_id_t thread_id;
|
|
/* In progress operations keyed by LBN */
|
|
struct int_map *lbn_operations;
|
|
/* The logical to physical map */
|
|
struct block_map_zone *block_map_zone;
|
|
/* The current flush generation */
|
|
sequence_number_t flush_generation;
|
|
/*
|
|
* The oldest active generation in this zone. This is mutated only on the logical zone
|
|
* thread but is queried from the flusher thread.
|
|
*/
|
|
sequence_number_t oldest_active_generation;
|
|
/* The number of IOs in the current flush generation */
|
|
block_count_t ios_in_flush_generation;
|
|
/* The youngest generation of the current notification */
|
|
sequence_number_t notification_generation;
|
|
/* Whether a notification is in progress */
|
|
bool notifying;
|
|
/* The queue of active data write VIOs */
|
|
struct list_head write_vios;
|
|
/* The administrative state of the zone */
|
|
struct admin_state state;
|
|
/* The physical zone from which to allocate */
|
|
struct physical_zone *allocation_zone;
|
|
/* The number of allocations done from the current allocation_zone */
|
|
block_count_t allocation_count;
|
|
/* The next zone */
|
|
struct logical_zone *next;
|
|
};
|
|
|
|
struct logical_zones {
|
|
/* The vdo whose zones these are */
|
|
struct vdo *vdo;
|
|
/* The manager for administrative actions */
|
|
struct action_manager *manager;
|
|
/* The number of zones */
|
|
zone_count_t zone_count;
|
|
/* The logical zones themselves */
|
|
struct logical_zone zones[];
|
|
};
|
|
|
|
int __must_check vdo_make_logical_zones(struct vdo *vdo,
|
|
struct logical_zones **zones_ptr);
|
|
|
|
void vdo_free_logical_zones(struct logical_zones *zones);
|
|
|
|
void vdo_drain_logical_zones(struct logical_zones *zones,
|
|
const struct admin_state_code *operation,
|
|
struct vdo_completion *completion);
|
|
|
|
void vdo_resume_logical_zones(struct logical_zones *zones,
|
|
struct vdo_completion *parent);
|
|
|
|
void vdo_increment_logical_zone_flush_generation(struct logical_zone *zone,
|
|
sequence_number_t expected_generation);
|
|
|
|
void vdo_acquire_flush_generation_lock(struct data_vio *data_vio);
|
|
|
|
void vdo_release_flush_generation_lock(struct data_vio *data_vio);
|
|
|
|
struct physical_zone * __must_check vdo_get_next_allocation_zone(struct logical_zone *zone);
|
|
|
|
void vdo_dump_logical_zone(const struct logical_zone *zone);
|
|
|
|
#endif /* VDO_LOGICAL_ZONE_H */
|