Blame src/tracker-ioprio.c

Packit f01ec2
/*
Packit f01ec2
 * Copyright (C) 2005, Novell, Inc.
Packit f01ec2
 * Copyright (C) 2006, Jamie McCracken <jamiemcc@gnome.org>
Packit f01ec2
 * Copyright (C) 2006, Anders Aagaard
Packit f01ec2
 *
Packit f01ec2
 * Based mostly on code by Robert Love <rml@novell.com>
Packit f01ec2
 *
Packit f01ec2
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit f01ec2
 * copy of this software and associated documentation files (the "Software"),
Packit f01ec2
 * to deal in the Software without restriction, including without limitation
Packit f01ec2
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Packit f01ec2
 * and/or sell copies of the Software, and to permit persons to whom the
Packit f01ec2
 * Software is furnished to do so, subject to the following conditions:
Packit f01ec2
 *
Packit f01ec2
 * The above copyright notice and this permission notice shall be included in
Packit f01ec2
 * all copies or substantial portions of the Software.
Packit f01ec2
 *
Packit f01ec2
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit f01ec2
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit f01ec2
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit f01ec2
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit f01ec2
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit f01ec2
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Packit f01ec2
 * DEALINGS IN THE SOFTWARE.
Packit f01ec2
 */
Packit f01ec2
Packit f01ec2
#include "config.h"
Packit f01ec2
Packit f01ec2
#ifdef __linux__
Packit f01ec2
Packit f01ec2
#include <stdio.h>
Packit f01ec2
#include <errno.h>
Packit f01ec2
Packit f01ec2
#ifdef HAVE_LINUX_UNISTD_H
Packit f01ec2
#include <linux/unistd.h>
Packit f01ec2
#endif
Packit f01ec2
Packit f01ec2
#include <sys/syscall.h>
Packit f01ec2
#include <unistd.h>
Packit f01ec2
Packit f01ec2
#include <glib/gstdio.h>
Packit f01ec2
Packit f01ec2
#endif /* __linux__ */
Packit f01ec2
Packit f01ec2
#include "tracker-ioprio.h"
Packit f01ec2
Packit f01ec2
/* We assume ALL linux architectures have the syscalls defined here */
Packit f01ec2
#ifdef __linux__
Packit f01ec2
Packit f01ec2
/* Make sure the system call is supported */
Packit f01ec2
#ifndef __NR_ioprio_set
Packit f01ec2
Packit f01ec2
#if defined(__i386__)
Packit f01ec2
#define __NR_ioprio_set                 289
Packit f01ec2
#define __NR_ioprio_get                 290
Packit f01ec2
#elif defined(__powerpc__) || defined(__powerpc64__)
Packit f01ec2
#define __NR_ioprio_set                 273
Packit f01ec2
#define __NR_ioprio_get                 274
Packit f01ec2
#elif defined(__x86_64__)
Packit f01ec2
#define __NR_ioprio_set                 251
Packit f01ec2
#define __NR_ioprio_get                 252
Packit f01ec2
#elif defined(__ia64__)
Packit f01ec2
#define __NR_ioprio_set                 1274
Packit f01ec2
#define __NR_ioprio_get                 1275
Packit f01ec2
#elif defined(__alpha__)
Packit f01ec2
#define __NR_ioprio_set                 442
Packit f01ec2
#define __NR_ioprio_get                 443
Packit f01ec2
#elif defined(__s390x__) || defined(__s390__)
Packit f01ec2
#define __NR_ioprio_set                 282
Packit f01ec2
#define __NR_ioprio_get                 283
Packit f01ec2
#elif defined(__SH4__)
Packit f01ec2
#define __NR_ioprio_set                 288
Packit f01ec2
#define __NR_ioprio_get                 289
Packit f01ec2
#elif defined(__SH5__)
Packit f01ec2
#define __NR_ioprio_set                 316
Packit f01ec2
#define __NR_ioprio_get                 317
Packit f01ec2
#elif defined(__sparc__) || defined(__sparc64__)
Packit f01ec2
#define __NR_ioprio_set                 196
Packit f01ec2
#define __NR_ioprio_get                 218
Packit f01ec2
#elif defined(__arm__)
Packit f01ec2
#define __NR_ioprio_set                 314
Packit f01ec2
#define __NR_ioprio_get                 315
Packit f01ec2
#else
Packit f01ec2
#error "Unsupported architecture!"
Packit f01ec2
#endif
Packit f01ec2
Packit f01ec2
#endif /* __NR_ioprio_set */
Packit f01ec2
Packit f01ec2
enum {
Packit f01ec2
	IOPRIO_CLASS_NONE,
Packit f01ec2
	IOPRIO_CLASS_RT,
Packit f01ec2
	IOPRIO_CLASS_BE,
Packit f01ec2
	IOPRIO_CLASS_IDLE,
Packit f01ec2
};
Packit f01ec2
Packit f01ec2
enum {
Packit f01ec2
	IOPRIO_WHO_PROCESS = 1,
Packit f01ec2
	IOPRIO_WHO_PGRP,
Packit f01ec2
	IOPRIO_WHO_USER,
Packit f01ec2
};
Packit f01ec2
Packit f01ec2
#define IOPRIO_CLASS_SHIFT 13
Packit f01ec2
Packit f01ec2
static inline int
Packit f01ec2
ioprio_set (int which, int who, int ioprio_val)
Packit f01ec2
{
Packit f01ec2
	return syscall (__NR_ioprio_set, which, who, ioprio_val);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static int
Packit f01ec2
set_io_priority_idle (void)
Packit f01ec2
{
Packit f01ec2
	int ioprio, ioclass;
Packit f01ec2
Packit f01ec2
	ioprio = 7; /* priority is ignored with idle class */
Packit f01ec2
	ioclass = IOPRIO_CLASS_IDLE << IOPRIO_CLASS_SHIFT;
Packit f01ec2
Packit f01ec2
	return ioprio_set (IOPRIO_WHO_PROCESS, 0, ioprio | ioclass);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static int
Packit f01ec2
set_io_priority_best_effort (int ioprio_val)
Packit f01ec2
{
Packit f01ec2
	int ioclass;
Packit f01ec2
Packit f01ec2
	ioclass = IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT;
Packit f01ec2
Packit f01ec2
	return ioprio_set (IOPRIO_WHO_PROCESS, 0, ioprio_val | ioclass);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
void
Packit f01ec2
tracker_ioprio_init (void)
Packit f01ec2
{
Packit f01ec2
	if (set_io_priority_idle () == -1) {
Packit f01ec2
		g_message ("Could not set idle IO priority, attempting best effort of 7");
Packit f01ec2
Packit f01ec2
		if (set_io_priority_best_effort (7) == -1) {
Packit f01ec2
			g_message ("Could not set best effort IO priority either, giving up");
Packit f01ec2
		}
Packit f01ec2
	}
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
#else  /* __linux__ */
Packit f01ec2
Packit f01ec2
void
Packit f01ec2
tracker_ioprio_init (void)
Packit f01ec2
{
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
#endif /* __linux__ */