Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
В этой строке описывается указатель на голову очереди запросов.
Строка 276 Это последний запрос, помещенный в очередь ожидания. Строка 277 Функция планировщика (elevator) используется для обработки очереди запросов. Это может быть стандартный планировщик ввода-вывода (безоперационный, Устройства предельный или предварительный) или новый тип планировщика, специально разработанный для данного блочного устройства. Строка 282 request_list - это структура, состоящая из двух wait_queue: одной для очереди чтения блочного устройства и одной для очереди записи. include/linux/blkdev.h 283 284 request_fn_proc *request_fn; 285 merge_request_fn *back_ merge_fn; 286 merge_request_fn *front_merge__fn; 287 merge_requests_fn *merge_requests_fn; 288 make_request_fn *make_request_fn; 289 prep_rq_fn *prep_rq_fn; 2 91 merge__bvec_fn *merge_bvec__fn; 292 activity_fn *activity_fn; Строки 283-293 Специальные функции планировщика (лифта) могут быть определены для управления тем, как обрабатываются запросы для блочных устройств. include/linux/blkdev.h 294 /* 2 95 * Условие автоматического отключения 296 */ 297 struct timer_list unplug_timer; 298 int unplug_thresh; /* После такого количества запросов */ 299 unsigned long unplug_delay; /* После такой задержки*/ 300 struct work_struct, unplug__work; 301 3 02 struct backing_dev_info backing_dev_infо; Строки 294-303 Эти функции используются для изъятия функции планировщика ввода-вывода, используемых для блочного устройства. Подключение (plugging) связано с ожиданием, пока очередь запросов заполнится и можно будет выбрать алгоритм планировщика для упорядочения и сортировки запросов ввода-вывода, оптимизируя время, необходимое для выполнения запросов ввода-вывода. Например, жесткий диск под- Глава 5* Ввод-Вывод ключает несколько запросов на чтение в ожидании того, что после поступления еще нескольких запросов придется меньше перемещать головку. Скорее всего, чтение удастся отсортировать последовательно или даже кластеризовать в одну более длинную операцию чтения. Отключение (unplugging) связано с методом, когда устройство решает больше не ожидать и обрабатывать запросы, в зависимости от возможных будущих оптимизаций. (См. более подобную информацию в Documenta-tion/block/biodoc. txt.) include/linux/blkdev. h 304 /* Владелец очереди может использовать эту информацию 305 * по своему усмотрению. 306 * Это не касается ll_rw_blk. 307 */ 3 08 void *queuedata; 310 void *activity_data; Строки 304-311 Как следует из комментариев, эти строки обрабатывают очередь запросов с помощью определенного устройства и/или драйвера устройства. include/linux/blkdev. h 312 /* 313 * Для страниц за этими пределами очереди нужны страницы раскачки. 314 */-.-. 315 unsigned long bounce__pfn; 316 int bounce_gfp; 317 Строки 312-317 Подпрыгивание (bouncing) означает принятый в ядре перенос буфера ввода-вывода из верхней памяти в буфер в нижней памяти. В Linux 2.6 ядро позволяет устройству самостоятельно обрабатывать необходимый ему буфер в буфере в верхней памяти. Сейчас подпрыгивание обычно используется только в тех случаях, когда устройство не может обработать буфер в верхней памяти. Устройства include/linux/blkdev.h 318 /* 319 * см. ниже в QUEUE_* различные флаги очереди 320 */ 321 unsigned long queue_flags; 322 Строки 318-321 Переменная queue_flags хранит один или несколько флагов, приведенных в табл. 5.1 (см. include/linux/blkdev.h, строки 368-375). Таблица 5.1. queue Jlags Флаг Функция QUEUE_FLAG_CLUSTER Несколько сегментов кластера в 1 QUEUE__FLAG__QUEUED Используется обобщенный код очереди QUEUE__FLAG_STOPPED Очередь остановлена QUEUE_FLAG_READFULL Очередь чтения заполнена QUEUE_FLAG_WRITEFULL Очередь записи заполнена QUEUE_FLAG_DEAD Очередь отменена QUEUE_FLAG__REENTER Избегание повторных вхождений QUEUE_FLAG_PLUGGED Подключение очереди include/linux/blkdev.h
/* * защита структур очереди от повторных вхождений spinlock_t *queue_lock; /* * kobject очереди struct kobject kobj; * настройки очереди */ unsigned long nr__requests; /* Максимальный номер запроса */ Глава 5* Ввод-Вывод 337 unsigned int nr__congestion_on; 338 unsigned int nr_congestion_off; 339
340 unsigned short max_sectors; 341 unsigned short max_phys_segments; 342 unsigned short max_Jiw_segments; 343 unsigned short hardsect_size; 344 unsigned int max_segment_size; 345
346 unsigned long seg__boundary_mask; 347 unsigned int dma_alignment; 348 349 struct blk_queue__tag *queue_tags; 351 atomic_t refcnt; 353 unsigned int in_flight; 355 /* 356 * sg stuff
357 */ 359 unsigned int 360 }; Строки 323-360 Эти переменные определяют управляемые ресурсы для очереди запросов, такие, как блокировка (строка 326) и объекты ядра (строка 331). Также присутствуют специальные настройки очереди, такие, как максимальное число запросов (строка 336) и физическое содержимое блочного устройства (строки 340-347). Кроме этого, можно определить атрибуты SCSI (строки 355-359), если они применимы к данному блочному устройству. Если вы хотите использовать управляемые командные очереди, используйте структуру queue_tags (строка 349). Поля refcnt и in_f light (строки 351 и 353) считают количество обращений к очереди (обычно используются для блокировки) и количество запросов, которые обрабатываются «на лету». Очереди запросов, используемые блочными устройствами, инициализируются в ядре Linux 2.6 простым вызовом следующей функции в функции__ init устройства. Внутри этой функции мы можем увидеть анатомию очереди запроса и связанные с ней вспомогательные функции. В ядре Linux 2.6 каждое блочное устройство управляет собственной блокировкой в отличие от более ранних версий Linux и передает циклическую блокировку в качестве второго аргумента. Первый аргумент - это функция запроса, предоставляемая драйвером блочного устройства. Устройства drivers /block/ ll_rw__blk. с 1397 request_queue_t *blk_init_queue (request__fn_proc *rfn, spinlock_t *lock) 1398 { 13 99 request__queue_t *q; 1400 static int printed; 1402 q = blk_alloc_queue(GFP_KERNEL); 1403 if (! q) 1404 return NULL; 1405 1406 if (blk_init_free_list(q)) 1407 goto out_init; 1409 if (Iprinted) { 1410 printed = 1; 1411 printk(" Using %s io scheduler\n", chosen__elevator-> elevator_name); 1412 } 1414 if (elevator_init(q, chosen__elevator)) 1415 goto out_elv; 1417 q-> request_fn = rfn; 1418 q-> back__merge_fn = ll_back_merge_fn; 1419 q-> front_merge_fn = ll_front_merge_fn; 1420 q-> merge_requests_fn = ll_merge_requests_fn; 1421 q-> prep_rq_fn = NULL; 1422 q-> unplug_fn = generic_unplug__device; 1423 q-> queue_flags = (1 « QUEUE_FLAG_CLUSTER); 1424 q-> queue_lock = lock; 1425 1426 blk_queue_segment_boundary(q, Oxffffffff); 1428 blk_queue_make_request(q, _ make_request); 1429 blk__queue_max_segment_size(q/ MAX_SEGMENT__SIZE); 1430
1431 blk_queue_max_hw_segments (q, MAX_HW_SEGMENTS); 1432 blk_queue_max_phys_segments (q, MAX_PHYS_SEGMENTS); 1433 1434 return q; 1435 out_elv: 1436 b1k_c1eanup_queue(q); 1437 out_init: Глава 5 • Ввод-Вывод 1438 kmem_cache_free(requestq__cachep, q); 1439 return NULL; 1440 } Строка 1402 Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 919; Нарушение авторского права страницы