LINUX.ORG.RU

История изменений

Исправление kirk_johnson, (текущая версия) :

интересно... А не будет ли этих буферов слишком много? А в каком месте они мержатся в реальные очереди к устройствам?

Как в blk-mq. Пишется ядерная прослойка, которая создает массив из N per-cpu очередей. Когда приложение засылает реквест, прослойка кладет реквест в очередь (под nopreempt) и дергает твоей FS нотификатор. Твоя FS спрашивает через ioctl() список операций из конкретной очереди и обрабатывает их. Ну или через read(), не суть важно.

это кто делает? В рамках разработки FUSE драйвера или глубже уже в где-то в ядре?

В userspace :) Создаешь тред, который говорит ioctl'м «хочу, чтобы ты меня привязал к такой-то очереди». Ему возвращают eventfd от этой очереди, по которой же и аккаунтинг на выдачу данных делается.

Мы с чуваками такое для блочного драйвера в US делали, работало с очень небольшой добавленной латентностью. Порядка пары сотен микросекунд вроде. Я могу перепроверить попозже, у меня код остался :)

Исправление kirk_johnson, :

интересно... А не будет ли этих буферов слишком много? А в каком месте они мержатся в реальные очереди к устройствам?

Как в blk-mq. Пишется ядерная прослойка, которая создает массив из N per-cpu очередей. Когда приложение засылает реквест, прослойка кладет реквест в очередь (под nopreempt) и дергает твоей FS нотификатор. Твоя FS спрашивает через ioctl() список операций из конкретной очереди и обрабатывает их. Ну или через read(), не суть важно.

это кто делает? В рамках разработки FUSE драйвера или глубже уже в где-то в ядре?

В userspace :) Создаешь тред, который говорит ioctl'м «хочу, чтобы ты меня привязал к такой-то очереди». Ему возвращают eventfd от этой очереди, по которой же и аккаунтинг на выдачу данных делается.

Мы с чуваками такое для блочного драйвера в US делали, работало с очень небольшой добавленной латентностью. Порядка сотни микросекунд вроде. Я могу перепроверить попозже, у меня код остался :)

Исправление kirk_johnson, :

интересно... А не будет ли этих буферов слишком много? А в каком месте они мержатся в реальные очереди к устройствам?

Как в blk-mq. Пишется ядерная прослойка, которая создает массив из N per-cpu очередей. Когда приложение засылает реквест, прослойка кладет реквест в очередь (под nopreempt) и дергает твоей FS нотификатор. Твоя FS спрашивает через ioctl() список операций из конкретной очереди и обрабатывает их. Ну или через read(), не суть важно.

это кто делает? В рамках разработки FUSE драйвера или глубже уже в где-то в ядре?

В userspace :) Создаешь тред, который говорит ioctl'м «хочу, чтобы ты меня привязал к такой-то очереди». Ему возвращают eventfd от этой очереди, по которой же и аккаунтинг на выдачу данных делается.

Исходная версия kirk_johnson, :

интересно... А не будет ли этих буферов слишком много? А в каком месте они мержатся в реальные очереди к устройствам?

Как в blk-mq. Пишется ядерная прослойка, которая создает массив из N per-cpu очередей. Когда приложение засылает реквест, прослойка кладет реквест в очередь (под nopreempt) и дергает твоей FS нотификатор. Твоя FS спрашивает через ioctl() список операций из конкретной очереди и обрабатывает их. Ну или через read(), не суть важно.

это кто делает? В рамках разработки FUSE драйвера или глубже уже в где-то в ядре?

В userspace :) Создаешь тред, который говорит ioctl'м «хочу, чтобы ты меня привязал к такой-то очереди».