linux/tools/testing/selftests/vm/mlock2.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#include <syscall.h>
   3#include <errno.h>
   4#include <stdio.h>
   5#include <stdlib.h>
   6
   7#ifndef MLOCK_ONFAULT
   8#define MLOCK_ONFAULT 1
   9#endif
  10
  11#ifndef MCL_ONFAULT
  12#define MCL_ONFAULT (MCL_FUTURE << 1)
  13#endif
  14
  15static int mlock2_(void *start, size_t len, int flags)
  16{
  17#ifdef __NR_mlock2
  18        return syscall(__NR_mlock2, start, len, flags);
  19#else
  20        errno = ENOSYS;
  21        return -1;
  22#endif
  23}
  24
  25static FILE *seek_to_smaps_entry(unsigned long addr)
  26{
  27        FILE *file;
  28        char *line = NULL;
  29        size_t size = 0;
  30        unsigned long start, end;
  31        char perms[5];
  32        unsigned long offset;
  33        char dev[32];
  34        unsigned long inode;
  35        char path[BUFSIZ];
  36
  37        file = fopen("/proc/self/smaps", "r");
  38        if (!file) {
  39                perror("fopen smaps");
  40                _exit(1);
  41        }
  42
  43        while (getline(&line, &size, file) > 0) {
  44                if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",
  45                           &start, &end, perms, &offset, dev, &inode, path) < 6)
  46                        goto next;
  47
  48                if (start <= addr && addr < end)
  49                        goto out;
  50
  51next:
  52                free(line);
  53                line = NULL;
  54                size = 0;
  55        }
  56
  57        fclose(file);
  58        file = NULL;
  59
  60out:
  61        free(line);
  62        return file;
  63}
  64