ИМЯ
spu_create -
создаёт
новый
контекст spu
ОБЗОР
#include <sys/types.h>
#include <sys/spu.h>
int spu_create(const char *pathname, int flags, mode_t mode);
int spu_create(const char *pathname, int flags, mode_t mode,
int neighbor_fd);
Замечание:
В glibc нет
обёрточной
функции
для
данного
системного
вызова;
смотрите
ЗАМЕЧАНИЯ.
ОПИСАНИЕ
Системный
вызов spu_create()
используется
на машинах
PowerPC с
архитектурой
Cell Broadband Engine для
получения
доступа к
Synergistic Processor Unit (SPU). Он
создаёт
новый
логический
контекст
для SPU в pathname и
возвращает
связанный
с ним
файловый
дескриптор.
Аргумент
pathname должен
указывать
на
несуществующий
каталог в
точке
монтирования
файловой
системы SPU (spufs).
Если
работа spu_create()
выполнена
без ошибок,
то
создаётся
каталог pathname,
а в нём
создаются
файлы,
описанные
в spufs(7).
После
создания
контекста,
полученный
файловый
дескриптор
может быть
передан
только spu_run(2),
семейству
системных
вызовов *at
(например,
openat(2)) в
аргументе
dirfd или
закрыт;
другие
операции
не
определены.
Логический
контекст SPU
уничтожается
(вместе с
файлами,
созданными
внутри
каталога
контекста
pathname) после
освобождения
последней
ссылки на
контекст;
обычно, это
происходит
после
закрытия
файлового
дескриптора,
возвращённого
spu_create().
Аргумент
flags может
быть равен
нулю или
содержать
любую
побитовую
комбинацию
(посредством
OR) следующих
констант:
- SPU_CREATE_EVENTS_ENABLED
- Вместо
использования
сигналов
для
сообщения
об ошибках
DMA,
использовать
аргумент
event в spu_run(2).
- SPU_CREATE_GANG
- Создать
блок (gang) SPU
вместо
контекста
(блок — это
группа
контекстов
SPU, которые
близки по
функциям и
у которых
общие
параметры
планирования
—
приоритет
и политика.
В будущем,
планирование
блока на
включение
и
выключение
может быть
реализовано
как
единого
целое).
- В месте,
указанном
в
аргументе
pathname, будет
создан
новый
каталог.
Этот блок
может
использоваться
для
хранения
других
контекстов
SPU, если
указывать
путь блока
в
последующих
вызовах
spu_create().
- SPU_CREATE_NOSCHED
- Создать
контекст,
на который
не влияет
планировщик
SPU. После
запуска
контекста,
он не будет
планироваться
для
выполнения
пока не
будет
уничтожен
создавшим
его
процессом.
- Так как
контекст
не может
быть
удалён из SPU,
у
контекстов
SPU_CREATE_NOSCHED
отключены
некоторые
возможности.
Не все
файлы
будут
доступны в
каталоге
этого
контекста
в spufs. Также,
для
контекстов
SPU_CREATE_NOSCHED не
может быть
создан
файл дампа
при
поломке.
- Для
создания
контекстов
SPU_CREATE_NOSCHED
требуется
мандат CAP_SYS_NICE.
- SPU_CREATE_ISOLATE
- Создать
изолированный
контекст SPU.
Изолированные
контексты
защищены
от
некоторых
операций PPE
(PowerPC Processing Element), таких
как доступ
к
локальному
хранилищу
SPU и
регистру NPC.
- Для
создания
контекста
SPU_CREATE_ISOLATE также
требуется
флаг SPU_CREATE_NOSCHED.
- SPU_CREATE_AFFINITY_SPU
- Создать
контекст
со связью с
другим
контекстом
SPU. Эта
информация
о связи
используется
в
алгоритме
планирования
SPU. При
использовании
этого
флага
требуется,
чтобы
файловый
дескриптор,
ссылающийся
на другой
контекст SPU,
передавался
в
аргументе
neighbor_fd.
- SPU_CREATE_AFFINITY_MEM
- Создать
контекст
со связью с
системной
памятью.
Эта
информация
о связи
используется
в
алгоритме
планирования
SPU.
В
аргументе
mode (не
считая
битов umask(2)
процесса)
задаются
права,
которые
используются
при
создании
нового
каталога в
spufs. Полное
описание
всех
значений mode
смотрите в
stat(2).
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ
При
успешном
выполнении
spu_create()
возвращается
новый
файловый
дескриптор;
при ошибке
возвращается
-1, а в errno
содержится
один из
кодов
ошибки,
описанных
далее.
ОШИБКИ
- EACCES
- Текущий
пользователь
не имеет
прав на
запись в
точку
монтирования
spufs(7).
- EEXIST
- Контекст SPU
с
указанным
именем
пути уже
существует.
- EFAULT
- Значение
pathname не
является
допустимым
строковым
указателем
в адресном
пространстве
вызывающего
процесса.
- EINVAL
- Значение
pathname не
является
каталогом
в точке
монтирования
spufs(7), или
указаны
неправильные
флаги.
- ELOOP
- Во время
определения
pathname
встретилось
слишком
много
символьных
ссылок.
- EMFILE
- Было
достигнуто
ограничение
по
количеству
открытых
файловых
дескрипторов
на
процесс.
- ENAMETOOLONG
- Слишком
длинное
значение
аргумента
pathname.
- ENFILE
- Достигнуто
максимальное
количество
открытых
файлов в
системе.
- ENODEV
- Был
запрошен
изолированный
контекст,
но
аппаратная
часть не
поддерживает
изоляцию SPU.
- ENOENT
- Невозможно
определить
часть pathname.
- ENOMEM
- Ядро не
может
выделить
все
требуемые
ресурсы.
- ENOSPC
- Недостаточно
ресурсов SPU
для
создания
нового
контекста
или
достигнуто
ограничение
на
количество
контекстов
SPU для
пользователя.
- ENOSYS
- Возможность
не
предоставляется
текущей
системой,
так как или
аппаратура
не
предоставляет
SPU, или не
загружен
модуль spufs.
- ENOTDIR
- Часть pathname не
является
каталогом.
- EPERM
- Указан
флаг SPU_CREATE_NOSCHED,
но
пользователь
не имеет
мандата
CAP_SYS_NICE.
ФАЙЛЫ
Значение
pathname должно
указываться
относительно
точки
монтирования
spufs. По
соглашению
всё
монтируется
в /spu.
ВЕРСИИ
Системный
вызов spu_create()
был
добавлен в
ядро Linux
версии 2.6.16.
СООТВЕТСТВИЕ
СТАНДАРТАМ
Данный
вызов
существует
только в Linux и
реализован
только для
архитектуры
PowerPC.
Программы,
использующие
данный
вызов, не
переносимы.
ЗАМЕЧАНИЯ
В glibc нет
обёртки
для этого
системного
вызова;
запускайте
его с
помощью syscall(2).
Однако
заметим,
что spu_run()
предназначен
для работы
в
библиотеках,
которые
реализуют
более
абстрактный
интерфейс
к SPU и не
должен
вызываться
из обычных
приложений.
Рекомендуемые
библиотеки
приведены
на
странице
http://www.bsc.es/projects/deepcomputing/linuxoncell/.
ПРИМЕР
В spu_run(2) дан
пример
использования
spu_create().