Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       move_pages - перемещает отдельные страницы процесса на другой узел

LIBRARY

       NUMA (Non-Uniform Memory Access) policy library (libnuma, -lnuma)

СИНТАКСИС

       #include <numaif.h>

       long move_pages(int pid, unsigned long count, void *pages[.count],
                       const int nodes[.count], int status[.count], int flags);

ОПИСАНИЕ

       Вызов  move_pages()  перемещает  указанные в pages страницы процесса с pid в память узлов,
       заданных в nodes. Результат перемещения отражается в status. В flags задаются  ограничения
       на перемещаемые страницы.

       Значение  pid  представляет собой идентификатор процесса, в котором перемещаются страницы.
       Если pid равен 0, то move_pages()  перемещается страницы вызывающего процесса.

       Для перемещения страниц в другом процессе требуются следующие права:

       •  Up to and including Linux 4.12: the caller must be privileged  (CAP_SYS_NICE)   or  the
          real  or effective user ID of the calling process must match the real or saved-set user
          ID of the target process.

       •  Старые  правила  позволяли  вызывающему  обнаруживать  различные  виртуальные   адреса,
          выбранные  ядром,  что  лишает  смысла  случайность  расположения  раскладки  адресного
          пространства процесса, принадлежащему тому  же  UID  что  и  вызывающий;  правила  были
          изменены  в  Linux  4.13.  Начиная  с  Linux  4.13, права регулируются проверкой режима
          доступа ptrace PTRACE_MODE_READ_REALCREDS целевого процесса; смотрите ptrace(2).

       В аргументе count задаётся количество перемещаемых  страниц.  Он  определяет  размер  трёх
       массивов: pages, nodes и status.

       Аргумент  pages  представляет  собой  массив  указателей  на страницы, которые должны быть
       перемещены. Данные указатели должны быть выровнены на границу страницы. Адреса указываются
       в том же виде, в каком доступны процессу с заданным pid.

       Аргумент  nodes представляет собой массив целых, которыми задаются желаемые местоположения
       каждой страницы. Каждый элемент массива представляет собой номер  узла.  Также,  значением
       nodes  может  быть NULL; в этом случае move_pages() не перемещает страницы, а записывает в
       массив status номер  узла,  на  котором  расположена  каждая  страница  в  данный  момент.
       Получение  состояния  каждой страницы может потребоваться для определения страниц, которые
       нужно переместить.

       status is an array of integers that return the status of each page.   The  array  contains
       valid  values  only  if  move_pages()   did not return an error.  Preinitialization of the
       array to a value which cannot represent a real numa node or valid error  of  status  array
       could help to identify pages that have been migrated.

       В  аргументе  flags указываются типы перемещаемых страниц. Флаг MPOL_MF_MOVE означает, что
       будут  перемещены  только  страницы,  которые  монопольно  используются  процессом.   Флаг
       MPOL_MF_MOVE_ALL  означает,  что  также  будут  перемещены  страницы, которые используются
       совместно с другими процессами. Для использования флага  MPOL_MF_MOVE_ALL  процесс  должен
       быть привилегированным (CAP_SYS_NICE).

   Состояние страницы в массиве состояний
       В каждом элементе массива status могут возвращаться следующие значения:

       0..MAX_NUMNODES
              Номер узла, в котором расположена страница.

       -EACCES
              Страница  отображается  несколькими процессами и может быть перемещена только, если
              указан флаг MPOL_MF_MOVE_ALL.

       -EBUSY Страница в данный момент занята и не может  быть  перемещена.  Попробуйте  позднее.
              Такое  случается,  если  со  страницей выполняется операция ввода-вывода или другая
              подсистема ядра удерживается ссылку на эту страницу.

       -EFAULT
              Это нулевая страница или область памяти не отображена процессом.

       -EIO   Не удалось  выполнить  обратную  запись  на  страницу.  Для  перемещения  требуется
              выполнить обратную запись, так как данные страницы неактуальны (dirty), но файловая
              система  не  предоставляет  функцию  переноса  (migration),  которая  позволила  бы
              переместить неактуальные страницы.

       -EINVAL
              Нельзя переместить неактуальные страницы. Файловая система не предоставляет функцию
              переноса  (migration),  поэтому  нет  возможности  выполнить  обратную  запись   на
              страницы.

       -ENOENT
              Страница отсутствует.

       -ENOMEM
              Не удалось выделить память на узле назначения.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       On  success  move_pages()   returns  zero.   On  error,  it  returns -1, and sets errno to
       indicate the error.  If positive value is returned, it is the number of nonmigrated pages.

ОШИБКИ

       Positive value
              The number of nonmigrated pages if they were the result of nonfatal reasons  (since
              Linux 4.17).

       E2BIG  Слишком  много перемещаемых страниц. Начиная с Linux 2.6.29, ядро не генерирует эту
              ошибку.

       EACCES Один из узлов назначения не разрешён для текущего набора ЦП.

       EFAULT Недоступен массив параметров.

       EINVAL Указаны флаги, отличные от MPOL_MF_MOVE и MPOL_MF_MOVE_ALL, или предпринята попытка
              переместить (migrate) страницы нити ядра.

       ENODEV Один из узлов назначения недоступен (not online).

       EPERM  Вызывающий   указал   флаг  MPOL_MF_MOVE_ALL,  но  у  него  не  хватает  привилегий
              (CAP_SYS_NICE).   Или   вызывающий   попытался   переместить   страницы   процесса,
              принадлежащие   другому   пользователю,   но   не   имеет   привилегий   для  этого
              (CAP_SYS_NICE).

       ESRCH  Процесс не существует.

ВЕРСИИ

       move_pages()  first appeared in Linux 2.6.18.

СТАНДАРТЫ

       Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

       Информация о библиотеке доступна в numa(7).

       Используйте get_mempolicy(2) с флагом  MPOL_F_MEMS_ALLOWED  для  получения  набора  узлов,
       которые доступны в текущем наборе ЦП. Заметим, что эта информация может измениться в любое
       время вручную или при автоматической перенастройке набора ЦП.

       Использование этого вызова может привести к  тому,  что  расположение  страниц  (на  узле)
       нарушит политику памяти, установленную для заданных адресов (см. mbind(2)) и/или заданного
       процесса (см. set_mempolicy(2)). То есть политика памяти не ограничивает узлы  назначения,
       используемые move_pages().

       Заголовочный  файл  <numaif.h>  не  включён  в  glibc,  его  можно найти в пакете с именем
       libnuma-devel или подобным названием.

СМ. ТАКЖЕ

       get_mempolicy(2), mbind(2), set_mempolicy(2), numa(3), numa_maps(5),  cpuset(7),  numa(7),
       migratepages(8), numastat(8)

ПЕРЕВОД

       Русский  перевод  этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey
       <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>,  Dmitriy  S.  Seregin
       <dseregin@59.ru>,       Dmitry      Bolkhovskikh      <d20052005@yandex.ru>,      ITriskTI
       <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>,  Иван
       Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.