|
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__ */
|