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 --- |