linux/tools/lib/perf/lib.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <unistd.h>
   3#include <stdbool.h>
   4#include <errno.h>
   5#include <linux/kernel.h>
   6#include <internal/lib.h>
   7
   8unsigned int page_size;
   9
  10static ssize_t ion(bool is_read, int fd, void *buf, size_t n)
  11{
  12        void *buf_start = buf;
  13        size_t left = n;
  14
  15        while (left) {
  16                /* buf must be treated as const if !is_read. */
  17                ssize_t ret = is_read ? read(fd, buf, left) :
  18                                        write(fd, buf, left);
  19
  20                if (ret < 0 && errno == EINTR)
  21                        continue;
  22                if (ret <= 0)
  23                        return ret;
  24
  25                left -= ret;
  26                buf  += ret;
  27        }
  28
  29        BUG_ON((size_t)(buf - buf_start) != n);
  30        return n;
  31}
  32
  33/*
  34 * Read exactly 'n' bytes or return an error.
  35 */
  36ssize_t readn(int fd, void *buf, size_t n)
  37{
  38        return ion(true, fd, buf, n);
  39}
  40
  41/*
  42 * Write exactly 'n' bytes or return an error.
  43 */
  44ssize_t writen(int fd, const void *buf, size_t n)
  45{
  46        /* ion does not modify buf. */
  47        return ion(false, fd, (void *)buf, n);
  48}
  49