Lines Matching refs:sctx

63 	struct switch_ctx *sctx;
65 sctx = kzalloc(struct_size(sctx, path_list, nr_paths), GFP_KERNEL);
66 if (!sctx)
69 sctx->ti = ti;
70 sctx->region_size = region_size;
72 ti->private = sctx;
74 return sctx;
79 struct switch_ctx *sctx = ti->private;
83 if (!(sctx->region_size & (sctx->region_size - 1)))
84 sctx->region_size_bits = __ffs(sctx->region_size);
86 sctx->region_size_bits = -1;
88 sctx->region_table_entry_bits = 1;
89 while (sctx->region_table_entry_bits < sizeof(region_table_slot_t) * 8 &&
90 (region_table_slot_t)1 << sctx->region_table_entry_bits < nr_paths)
91 sctx->region_table_entry_bits++;
93 sctx->region_entries_per_slot = (sizeof(region_table_slot_t) * 8) / sctx->region_table_entry_bits;
94 if (!(sctx->region_entries_per_slot & (sctx->region_entries_per_slot - 1)))
95 sctx->region_entries_per_slot_bits = __ffs(sctx->region_entries_per_slot);
97 sctx->region_entries_per_slot_bits = -1;
99 if (sector_div(nr_regions, sctx->region_size))
106 sctx->nr_regions = nr_regions;
109 if (sector_div(nr_slots, sctx->region_entries_per_slot))
117 sctx->region_table = vmalloc(array_size(nr_slots,
119 if (!sctx->region_table) {
127 static void switch_get_position(struct switch_ctx *sctx, unsigned long region_nr,
130 if (sctx->region_entries_per_slot_bits >= 0) {
131 *region_index = region_nr >> sctx->region_entries_per_slot_bits;
132 *bit = region_nr & (sctx->region_entries_per_slot - 1);
134 *region_index = region_nr / sctx->region_entries_per_slot;
135 *bit = region_nr % sctx->region_entries_per_slot;
138 *bit *= sctx->region_table_entry_bits;
141 static unsigned int switch_region_table_read(struct switch_ctx *sctx, unsigned long region_nr)
146 switch_get_position(sctx, region_nr, &region_index, &bit);
148 return (READ_ONCE(sctx->region_table[region_index]) >> bit) &
149 ((1 << sctx->region_table_entry_bits) - 1);
155 static unsigned int switch_get_path_nr(struct switch_ctx *sctx, sector_t offset)
161 if (sctx->region_size_bits >= 0)
162 p >>= sctx->region_size_bits;
164 sector_div(p, sctx->region_size);
166 path_nr = switch_region_table_read(sctx, p);
169 if (unlikely(path_nr >= sctx->nr_paths))
175 static void switch_region_table_write(struct switch_ctx *sctx, unsigned long region_nr,
182 switch_get_position(sctx, region_nr, &region_index, &bit);
184 pte = sctx->region_table[region_index];
185 pte &= ~((((region_table_slot_t)1 << sctx->region_table_entry_bits) - 1) << bit);
187 sctx->region_table[region_index] = pte;
193 static void initialise_region_table(struct switch_ctx *sctx)
198 for (region_nr = 0; region_nr < sctx->nr_regions; region_nr++) {
199 switch_region_table_write(sctx, region_nr, path_nr);
200 if (++path_nr >= sctx->nr_paths)
207 struct switch_ctx *sctx = ti->private;
212 &sctx->path_list[sctx->nr_paths].dmdev);
220 dm_put_device(ti, sctx->path_list[sctx->nr_paths].dmdev);
224 sctx->path_list[sctx->nr_paths].start = start;
226 sctx->nr_paths++;
236 struct switch_ctx *sctx = ti->private;
238 while (sctx->nr_paths--)
239 dm_put_device(ti, sctx->path_list[sctx->nr_paths].dmdev);
241 vfree(sctx->region_table);
242 kfree(sctx);
261 struct switch_ctx *sctx;
287 sctx = alloc_switch_ctx(ti, nr_paths, region_size);
288 if (!sctx) {
307 initialise_region_table(sctx);
322 struct switch_ctx *sctx = ti->private;
324 unsigned int path_nr = switch_get_path_nr(sctx, offset);
326 bio_set_dev(bio, sctx->path_list[path_nr].dmdev->bdev);
327 bio->bi_iter.bi_sector = sctx->path_list[path_nr].start + offset;
374 static int process_set_region_mappings(struct switch_ctx *sctx,
414 unlikely(region_index + num_write >= sctx->nr_regions)) {
416 region_index, num_write, sctx->nr_regions);
422 path_nr = switch_region_table_read(sctx, region_index - cycle_length);
423 switch_region_table_write(sctx, region_index, path_nr);
450 if (unlikely(region_index >= sctx->nr_regions)) {
451 DMWARN("invalid set_region_mappings region number: %lu >= %lu", region_index, sctx->nr_regions);
454 if (unlikely(path_nr >= sctx->nr_paths)) {
455 DMWARN("invalid set_region_mappings device: %lu >= %u", path_nr, sctx->nr_paths);
459 switch_region_table_write(sctx, region_index, path_nr);
475 struct switch_ctx *sctx = ti->private;
481 r = process_set_region_mappings(sctx, argc, argv);
493 struct switch_ctx *sctx = ti->private;
503 DMEMIT("%u %u 0", sctx->nr_paths, sctx->region_size);
504 for (path_nr = 0; path_nr < sctx->nr_paths; path_nr++)
505 DMEMIT(" %s %llu", sctx->path_list[path_nr].dmdev->name,
506 (unsigned long long)sctx->path_list[path_nr].start);
522 struct switch_ctx *sctx = ti->private;
525 path_nr = switch_get_path_nr(sctx, 0);
527 *bdev = sctx->path_list[path_nr].dmdev->bdev;
532 if (ti->len + sctx->path_list[path_nr].start !=
541 struct switch_ctx *sctx = ti->private;
545 for (path_nr = 0; path_nr < sctx->nr_paths; path_nr++) {
546 r = fn(ti, sctx->path_list[path_nr].dmdev,
547 sctx->path_list[path_nr].start, ti->len, data);