Lines Matching refs:sctx

62 	struct switch_ctx *sctx;
64 sctx = kzalloc(struct_size(sctx, path_list, nr_paths), GFP_KERNEL);
65 if (!sctx)
68 sctx->ti = ti;
69 sctx->region_size = region_size;
71 ti->private = sctx;
73 return sctx;
78 struct switch_ctx *sctx = ti->private;
82 if (!(sctx->region_size & (sctx->region_size - 1)))
83 sctx->region_size_bits = __ffs(sctx->region_size);
85 sctx->region_size_bits = -1;
87 sctx->region_table_entry_bits = 1;
88 while (sctx->region_table_entry_bits < sizeof(region_table_slot_t) * 8 &&
89 (region_table_slot_t)1 << sctx->region_table_entry_bits < nr_paths)
90 sctx->region_table_entry_bits++;
92 sctx->region_entries_per_slot = (sizeof(region_table_slot_t) * 8) / sctx->region_table_entry_bits;
93 if (!(sctx->region_entries_per_slot & (sctx->region_entries_per_slot - 1)))
94 sctx->region_entries_per_slot_bits = __ffs(sctx->region_entries_per_slot);
96 sctx->region_entries_per_slot_bits = -1;
98 if (sector_div(nr_regions, sctx->region_size))
105 sctx->nr_regions = nr_regions;
108 if (sector_div(nr_slots, sctx->region_entries_per_slot))
116 sctx->region_table = vmalloc(array_size(nr_slots,
118 if (!sctx->region_table) {
126 static void switch_get_position(struct switch_ctx *sctx, unsigned long region_nr,
129 if (sctx->region_entries_per_slot_bits >= 0) {
130 *region_index = region_nr >> sctx->region_entries_per_slot_bits;
131 *bit = region_nr & (sctx->region_entries_per_slot - 1);
133 *region_index = region_nr / sctx->region_entries_per_slot;
134 *bit = region_nr % sctx->region_entries_per_slot;
137 *bit *= sctx->region_table_entry_bits;
140 static unsigned switch_region_table_read(struct switch_ctx *sctx, unsigned long region_nr)
145 switch_get_position(sctx, region_nr, &region_index, &bit);
147 return (READ_ONCE(sctx->region_table[region_index]) >> bit) &
148 ((1 << sctx->region_table_entry_bits) - 1);
154 static unsigned switch_get_path_nr(struct switch_ctx *sctx, sector_t offset)
160 if (sctx->region_size_bits >= 0)
161 p >>= sctx->region_size_bits;
163 sector_div(p, sctx->region_size);
165 path_nr = switch_region_table_read(sctx, p);
168 if (unlikely(path_nr >= sctx->nr_paths))
174 static void switch_region_table_write(struct switch_ctx *sctx, unsigned long region_nr,
181 switch_get_position(sctx, region_nr, &region_index, &bit);
183 pte = sctx->region_table[region_index];
184 pte &= ~((((region_table_slot_t)1 << sctx->region_table_entry_bits) - 1) << bit);
186 sctx->region_table[region_index] = pte;
192 static void initialise_region_table(struct switch_ctx *sctx)
197 for (region_nr = 0; region_nr < sctx->nr_regions; region_nr++) {
198 switch_region_table_write(sctx, region_nr, path_nr);
199 if (++path_nr >= sctx->nr_paths)
206 struct switch_ctx *sctx = ti->private;
211 &sctx->path_list[sctx->nr_paths].dmdev);
219 dm_put_device(ti, sctx->path_list[sctx->nr_paths].dmdev);
223 sctx->path_list[sctx->nr_paths].start = start;
225 sctx->nr_paths++;
235 struct switch_ctx *sctx = ti->private;
237 while (sctx->nr_paths--)
238 dm_put_device(ti, sctx->path_list[sctx->nr_paths].dmdev);
240 vfree(sctx->region_table);
241 kfree(sctx);
260 struct switch_ctx *sctx;
286 sctx = alloc_switch_ctx(ti, nr_paths, region_size);
287 if (!sctx) {
306 initialise_region_table(sctx);
321 struct switch_ctx *sctx = ti->private;
323 unsigned path_nr = switch_get_path_nr(sctx, offset);
325 bio_set_dev(bio, sctx->path_list[path_nr].dmdev->bdev);
326 bio->bi_iter.bi_sector = sctx->path_list[path_nr].start + offset;
373 static int process_set_region_mappings(struct switch_ctx *sctx,
413 unlikely(region_index + num_write >= sctx->nr_regions)) {
415 region_index, num_write, sctx->nr_regions);
421 path_nr = switch_region_table_read(sctx, region_index - cycle_length);
422 switch_region_table_write(sctx, region_index, path_nr);
449 if (unlikely(region_index >= sctx->nr_regions)) {
450 DMWARN("invalid set_region_mappings region number: %lu >= %lu", region_index, sctx->nr_regions);
453 if (unlikely(path_nr >= sctx->nr_paths)) {
454 DMWARN("invalid set_region_mappings device: %lu >= %u", path_nr, sctx->nr_paths);
458 switch_region_table_write(sctx, region_index, path_nr);
474 struct switch_ctx *sctx = ti->private;
480 r = process_set_region_mappings(sctx, argc, argv);
492 struct switch_ctx *sctx = ti->private;
502 DMEMIT("%u %u 0", sctx->nr_paths, sctx->region_size);
503 for (path_nr = 0; path_nr < sctx->nr_paths; path_nr++)
504 DMEMIT(" %s %llu", sctx->path_list[path_nr].dmdev->name,
505 (unsigned long long)sctx->path_list[path_nr].start);
517 struct switch_ctx *sctx = ti->private;
520 path_nr = switch_get_path_nr(sctx, 0);
522 *bdev = sctx->path_list[path_nr].dmdev->bdev;
527 if (ti->len + sctx->path_list[path_nr].start !=
536 struct switch_ctx *sctx = ti->private;
540 for (path_nr = 0; path_nr < sctx->nr_paths; path_nr++) {
541 r = fn(ti, sctx->path_list[path_nr].dmdev,
542 sctx->path_list[path_nr].start, ti->len, data);