packer
vdo_drain_packer(vdo->packer, completion);
vdo_resume_packer(vdo->packer, completion);
vdo_increment_packer_flush_generation(flusher->vdo->packer);
write_packer_statistics("packer : ", &stats->packer, ", ", buf, maxlen);
static void insert_in_sorted_list(struct packer *packer, struct packer_bin *bin)
list_for_each_entry(active_bin, &packer->bins, list)
list_move_tail(&bin->list, &packer->bins);
static int __must_check make_bin(struct packer *packer)
list_add_tail(&bin->list, &packer->bins);
int vdo_make_packer(struct vdo *vdo, block_count_t bin_count, struct packer **packer_ptr)
struct packer *packer;
result = vdo_allocate(1, struct packer, __func__, &packer);
packer->thread_id = vdo->thread_config.packer_thread;
packer->size = bin_count;
INIT_LIST_HEAD(&packer->bins);
vdo_set_admin_state_code(&packer->state, VDO_ADMIN_STATE_NORMAL_OPERATION);
result = make_bin(packer);
vdo_free_packer(packer);
struct vio *, __func__, &packer->canceled_bin);
vdo_free_packer(packer);
result = vdo_make_default_thread(vdo, packer->thread_id);
vdo_free_packer(packer);
*packer_ptr = packer;
void vdo_free_packer(struct packer *packer)
if (packer == NULL)
list_for_each_entry_safe(bin, tmp, &packer->bins, list) {
vdo_free(vdo_forget(packer->canceled_bin));
vdo_free(packer);
static inline struct packer *get_packer_from_data_vio(struct data_vio *data_vio)
return vdo_from_data_vio(data_vio)->packer;
struct packer_statistics vdo_get_packer_statistics(const struct packer *packer)
const struct packer_statistics *stats = &packer->statistics;
struct packer *packer = get_packer_from_data_vio(data_vio);
WRITE_ONCE(packer->statistics.compressed_fragments_in_packer,
packer->statistics.compressed_fragments_in_packer - 1);
static struct data_vio *remove_from_bin(struct packer *packer, struct packer_bin *bin)
add_to_bin(packer->canceled_bin, data_vio);
static void write_bin(struct packer *packer, struct packer_bin *bin)
struct data_vio *agent = remove_from_bin(packer, bin);
while ((client = remove_from_bin(packer, bin)) != NULL)
stats = &packer->statistics;
static void add_data_vio_to_packer_bin(struct packer *packer, struct packer_bin *bin,
write_bin(packer, bin);
write_bin(packer, bin);
insert_in_sorted_list(packer, bin);
static struct packer_bin * __must_check select_bin(struct packer *packer,
list_for_each_entry(bin, &packer->bins, list) {
fullest_bin = list_first_entry(&packer->bins, struct packer_bin, list);
struct packer *packer = get_packer_from_data_vio(data_vio);
assert_on_packer_thread(packer, __func__);
WRITE_ONCE(packer->statistics.compressed_fragments_in_packer,
packer->statistics.compressed_fragments_in_packer + 1);
if (!vdo_is_state_normal(&packer->state) ||
(data_vio->flush_generation < packer->flush_generation)) {
bin = select_bin(packer, data_vio);
add_data_vio_to_packer_bin(packer, bin, data_vio);
static void check_for_drain_complete(struct packer *packer)
if (vdo_is_state_draining(&packer->state) && (packer->canceled_bin->slots_used == 0))
vdo_finish_draining(&packer->state);
static void write_all_non_empty_bins(struct packer *packer)
list_for_each_entry(bin, &packer->bins, list)
write_bin(packer, bin);
check_for_drain_complete(packer);
void vdo_flush_packer(struct packer *packer)
assert_on_packer_thread(packer, __func__);
if (vdo_is_state_normal(&packer->state))
write_all_non_empty_bins(packer);
struct packer *packer = get_packer_from_data_vio(data_vio);
if (bin != packer->canceled_bin) {
insert_in_sorted_list(packer, bin);
check_for_drain_complete(packer);
void vdo_increment_packer_flush_generation(struct packer *packer)
assert_on_packer_thread(packer, __func__);
packer->flush_generation++;
vdo_flush_packer(packer);
struct packer *packer = container_of(state, struct packer, state);
write_all_non_empty_bins(packer);
void vdo_drain_packer(struct packer *packer, struct vdo_completion *completion)
assert_on_packer_thread(packer, __func__);
vdo_start_draining(&packer->state, VDO_ADMIN_STATE_SUSPENDING, completion,
void vdo_resume_packer(struct packer *packer, struct vdo_completion *parent)
assert_on_packer_thread(packer, __func__);
vdo_continue_completion(parent, vdo_resume_if_quiescent(&packer->state));
void vdo_dump_packer(const struct packer *packer)
(unsigned long long) packer->flush_generation,
vdo_get_admin_state_code(&packer->state)->name,
(unsigned long long) packer->size);
list_for_each_entry(bin, &packer->bins, list)
dump_packer_bin(packer->canceled_bin, true);
static inline void assert_on_packer_thread(struct packer *packer, const char *caller)
VDO_ASSERT_LOG_ONLY((vdo_get_callback_thread_id() == packer->thread_id),
struct packer **packer_ptr);
void vdo_free_packer(struct packer *packer);
struct packer_statistics __must_check vdo_get_packer_statistics(const struct packer *packer);
void vdo_flush_packer(struct packer *packer);
void vdo_increment_packer_flush_generation(struct packer *packer);
void vdo_drain_packer(struct packer *packer, struct vdo_completion *completion);
void vdo_resume_packer(struct packer *packer, struct vdo_completion *parent);
void vdo_dump_packer(const struct packer *packer);
struct packer_statistics packer;
vdo_flush_packer(vdo->packer);
stats->packer = vdo_get_packer_statistics(vdo->packer);
vdo_dump_packer(vdo->packer);
result = vdo_make_packer(vdo, DEFAULT_PACKER_BINS, &vdo->packer);
vdo_free_packer(vdo_forget(vdo->packer));
struct packer *packer;
struct m00235_fdma_packer_regmap __iomem *packer;
packer = COBALT_CVI_PACKER(cobalt, ch);
&packer->control);
&packer->control);
&packer->control);
struct m00235_fdma_packer_regmap __iomem *packer;
packer = COBALT_CVI_PACKER(cobalt, rx);
cobalt_info("rx%d: Packer: %x\n", rx, ioread32(&packer->control));