dm.c (faad87df4b907605815c711dca613b3e7755e0d9) dm.c (1c357a1e86a4227a6b6059f2de118ae47659cebc)
1/*
2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
4 *
5 * This file is released under the GPL.
6 */
7
8#include "dm.h"

--- 209 unchanged lines hidden (view full) ---

218
219 /* for request-based merge heuristic in dm_request_fn() */
220 unsigned seq_rq_merge_deadline_usecs;
221 int last_rq_rw;
222 sector_t last_rq_pos;
223 ktime_t last_rq_start_time;
224
225 /* for blk-mq request-based DM support */
1/*
2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
4 *
5 * This file is released under the GPL.
6 */
7
8#include "dm.h"

--- 209 unchanged lines hidden (view full) ---

218
219 /* for request-based merge heuristic in dm_request_fn() */
220 unsigned seq_rq_merge_deadline_usecs;
221 int last_rq_rw;
222 sector_t last_rq_pos;
223 ktime_t last_rq_start_time;
224
225 /* for blk-mq request-based DM support */
226 struct blk_mq_tag_set tag_set;
226 struct blk_mq_tag_set *tag_set;
227 bool use_blk_mq;
228};
229
230#ifdef CONFIG_DM_MQ_DEFAULT
231static bool use_blk_mq = true;
232#else
233static bool use_blk_mq = false;
234#endif

--- 2148 unchanged lines hidden (view full) ---

2383
2384static void free_dev(struct mapped_device *md)
2385{
2386 int minor = MINOR(disk_devt(md->disk));
2387
2388 unlock_fs(md);
2389
2390 cleanup_mapped_device(md);
227 bool use_blk_mq;
228};
229
230#ifdef CONFIG_DM_MQ_DEFAULT
231static bool use_blk_mq = true;
232#else
233static bool use_blk_mq = false;
234#endif

--- 2148 unchanged lines hidden (view full) ---

2383
2384static void free_dev(struct mapped_device *md)
2385{
2386 int minor = MINOR(disk_devt(md->disk));
2387
2388 unlock_fs(md);
2389
2390 cleanup_mapped_device(md);
2391 if (md->use_blk_mq)
2392 blk_mq_free_tag_set(&md->tag_set);
2391 if (md->tag_set) {
2392 blk_mq_free_tag_set(md->tag_set);
2393 kfree(md->tag_set);
2394 }
2393
2394 free_table_devices(&md->table_devices);
2395 dm_stats_cleanup(&md->stats);
2396 free_minor(minor);
2397
2398 module_put(THIS_MODULE);
2399 kfree(md);
2400}

--- 304 unchanged lines hidden (view full) ---

2705};
2706
2707static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
2708{
2709 unsigned md_type = dm_get_md_type(md);
2710 struct request_queue *q;
2711 int err;
2712
2395
2396 free_table_devices(&md->table_devices);
2397 dm_stats_cleanup(&md->stats);
2398 free_minor(minor);
2399
2400 module_put(THIS_MODULE);
2401 kfree(md);
2402}

--- 304 unchanged lines hidden (view full) ---

2707};
2708
2709static int dm_init_request_based_blk_mq_queue(struct mapped_device *md)
2710{
2711 unsigned md_type = dm_get_md_type(md);
2712 struct request_queue *q;
2713 int err;
2714
2713 memset(&md->tag_set, 0, sizeof(md->tag_set));
2714 md->tag_set.ops = &dm_mq_ops;
2715 md->tag_set.queue_depth = dm_get_blk_mq_queue_depth();
2716 md->tag_set.numa_node = NUMA_NO_NODE;
2717 md->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE;
2718 md->tag_set.nr_hw_queues = dm_get_blk_mq_nr_hw_queues();
2715 md->tag_set = kzalloc(sizeof(struct blk_mq_tag_set), GFP_KERNEL);
2716 if (!md->tag_set)
2717 return -ENOMEM;
2718
2719 md->tag_set->ops = &dm_mq_ops;
2720 md->tag_set->queue_depth = dm_get_blk_mq_queue_depth();
2721 md->tag_set->numa_node = NUMA_NO_NODE;
2722 md->tag_set->flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE;
2723 md->tag_set->nr_hw_queues = dm_get_blk_mq_nr_hw_queues();
2724 md->tag_set->driver_data = md;
2725
2726 md->tag_set->cmd_size = sizeof(struct dm_rq_target_io);
2719 if (md_type == DM_TYPE_REQUEST_BASED) {
2727 if (md_type == DM_TYPE_REQUEST_BASED) {
2720 /* make the memory for non-blk-mq clone part of the pdu */
2721 md->tag_set.cmd_size = sizeof(struct dm_rq_target_io) + sizeof(struct request);
2722 } else
2723 md->tag_set.cmd_size = sizeof(struct dm_rq_target_io);
2724 md->tag_set.driver_data = md;
2728 /* put the memory for non-blk-mq clone at the end of the pdu */
2729 md->tag_set->cmd_size += sizeof(struct request);
2730 }
2725
2731
2726 err = blk_mq_alloc_tag_set(&md->tag_set);
2732 err = blk_mq_alloc_tag_set(md->tag_set);
2727 if (err)
2733 if (err)
2728 return err;
2734 goto out_kfree_tag_set;
2729
2735
2730 q = blk_mq_init_allocated_queue(&md->tag_set, md->queue);
2736 q = blk_mq_init_allocated_queue(md->tag_set, md->queue);
2731 if (IS_ERR(q)) {
2732 err = PTR_ERR(q);
2733 goto out_tag_set;
2734 }
2735 md->queue = q;
2736 dm_init_md_queue(md);
2737
2738 /* backfill 'mq' sysfs registration normally done in blk_register_queue */
2739 blk_mq_register_disk(md->disk);
2740
2741 if (md_type == DM_TYPE_REQUEST_BASED)
2742 init_rq_based_worker_thread(md);
2743
2744 return 0;
2745
2746out_tag_set:
2737 if (IS_ERR(q)) {
2738 err = PTR_ERR(q);
2739 goto out_tag_set;
2740 }
2741 md->queue = q;
2742 dm_init_md_queue(md);
2743
2744 /* backfill 'mq' sysfs registration normally done in blk_register_queue */
2745 blk_mq_register_disk(md->disk);
2746
2747 if (md_type == DM_TYPE_REQUEST_BASED)
2748 init_rq_based_worker_thread(md);
2749
2750 return 0;
2751
2752out_tag_set:
2747 blk_mq_free_tag_set(&md->tag_set);
2753 blk_mq_free_tag_set(md->tag_set);
2754out_kfree_tag_set:
2755 kfree(md->tag_set);
2756
2748 return err;
2749}
2750
2751static unsigned filter_md_type(unsigned type, struct mapped_device *md)
2752{
2753 if (type == DM_TYPE_BIO_BASED)
2754 return type;
2755

--- 942 unchanged lines hidden ---
2757 return err;
2758}
2759
2760static unsigned filter_md_type(unsigned type, struct mapped_device *md)
2761{
2762 if (type == DM_TYPE_BIO_BASED)
2763 return type;
2764

--- 942 unchanged lines hidden ---