From: Denys Vlasenko <dvlasenk@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] make setpriority POSIX compliant; introduce PRIO_THREAD extension
Date: Mon, 01 Sep 2008 16:17:58 +0200 [thread overview]
Message-ID: <1220278678.3866.27.camel@localhost.localdomain> (raw)
In-Reply-To: <1220278355.3866.21.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 3211 bytes --]
On Mon, 2008-09-01 at 16:12 +0200, Denys Vlasenko wrote:
> Patch is run tested. I will post test program etc as a reply.
Test program is attached.
Build with "gcc -o prio_vda3 prio_vda3.c -lpthread".
Output:
start test program
CHILD1: TID:3269 getpriority:0
CHILD1: PID:3269 getpriority:0
setpriority(PRIO_PROCESS, 3269, -10)
THREAD CHILD: TID:3270 getpriority:-2
THREAD CHILD: PID:3269 getpriority:-10
THREAD CHILD: TID:3271 getpriority:-4
THREAD CHILD: PID:3269 getpriority:-10
THREAD CHILD: TID:3272 getpriority:-6
THREAD CHILD: PID:3269 getpriority:-10
THREAD CHILD: TID:3273 getpriority:-8
THREAD CHILD: PID:3269 getpriority:-10
CHILD2: TID:3269 getpriority:-10
CHILD2: PID:3269 getpriority:-10
Joined!
Joined!
Joined!
Joined!
log of instrumented kernel:
(no threads created yet, only one tid exists)
getpriority:
PRIO_PROCESS: pid 3269 tgid 3269: niceval=20
PRIO_PROCESS: returning retval=20
PRIO_PROCESS: pid 3269 tgid 3269: niceval=20
PRIO_PROCESS: returning retval=20
(5 threads are created)
setpriority(PRIO_PROCESS, pid, -10):
setting prio of pid 3269 tgid 3269 to -10
setting prio of pid 3270 tgid 3269 to -10
setting prio of pid 3271 tgid 3269 to -10
setting prio of pid 3272 tgid 3269 to -10
setting prio of pid 3273 tgid 3269 to -10
setpriority(3 /*PRIO_THREAD*/, syscall(SYS_gettid), -1);
setting prio of pid 3270 tgid 3269 to -1
setpriority(PRIO_PROCESS, syscall(SYS_gettid), -2);
setting prio of pid 3270 tgid 3269 to -2
Above you see how setpriority(PRIO_PROCESS) can set prio for all threads
or only for one.
prio = getpriority(PRIO_PROCESS, tid);
PRIO_PROCESS: pid 3270 tgid 3269: niceval=22
PRIO_PROCESS: returning retval=22
prio = getpriority(PRIO_PROCESS, pid);
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: pid 3270 tgid 3269: niceval=22
PRIO_PROCESS: pid 3271 tgid 3269: niceval=30
PRIO_PROCESS: pid 3272 tgid 3269: niceval=30
PRIO_PROCESS: pid 3273 tgid 3269: niceval=30
PRIO_PROCESS: returning retval=30
Same for getpriority.
The rest is analogous:
setting prio of pid 3271 tgid 3269 to -3
setting prio of pid 3271 tgid 3269 to -4
PRIO_PROCESS: pid 3271 tgid 3269: niceval=24
PRIO_PROCESS: returning retval=24
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: pid 3271 tgid 3269: niceval=24
PRIO_PROCESS: pid 3272 tgid 3269: niceval=30
PRIO_PROCESS: pid 3273 tgid 3269: niceval=30
PRIO_PROCESS: returning retval=30
setting prio of pid 3272 tgid 3269 to -5
setting prio of pid 3272 tgid 3269 to -6
PRIO_PROCESS: pid 3272 tgid 3269: niceval=26
PRIO_PROCESS: returning retval=26
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: pid 3272 tgid 3269: niceval=26
PRIO_PROCESS: pid 3273 tgid 3269: niceval=30
PRIO_PROCESS: returning retval=30
setting prio of pid 3273 tgid 3269 to -7
setting prio of pid 3273 tgid 3269 to -8
PRIO_PROCESS: pid 3273 tgid 3269: niceval=28
PRIO_PROCESS: returning retval=28
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: pid 3273 tgid 3269: niceval=28
PRIO_PROCESS: returning retval=30
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: returning retval=30
PRIO_PROCESS: pid 3269 tgid 3269: niceval=30
PRIO_PROCESS: returning retval=30
Patch with instrumentation is attached too.
--
vda
[-- Attachment #2: prio_vda3.c --]
[-- Type: text/x-csrc, Size: 1632 bytes --]
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <memory.h>
#define THREAD_NUM 5
static void printprio(const char *pfx)
{
int prio;
pid_t tid = syscall(SYS_gettid);
pid_t pid = getpid();
prio = getpriority(PRIO_PROCESS, tid);
printf("%sTID:%d getpriority:%d\n", pfx, tid, prio);
prio = getpriority(PRIO_PROCESS, pid);
printf("%sPID:%d getpriority:%d\n", pfx, pid, prio);
}
int threadno;
static void* threadfunc(void *dummy)
{
sleep(1); /* wait for parent to setpriority */
setpriority(3 /*PRIO_THREAD*/, syscall(SYS_gettid), -(++threadno));
setpriority(PRIO_PROCESS, syscall(SYS_gettid), -(++threadno));
printprio("THREAD CHILD: ");
pthread_exit(0);
}
int main()
{
pid_t pid = fork();
if (pid) {
/* parent */
int status;
printf("start test program\n");
sleep(1); /* wait for threads to start in child */
printf("setpriority(PRIO_PROCESS, %d, -10)\n", pid);
if (setpriority(PRIO_PROCESS, pid, -10) < 0) {
perror("setpriority PRIO_PROCESS");
exit(1);
}
wait(&status);
} else {
/* child */
int i;
pthread_t thread_id[THREAD_NUM];
printprio("CHILD1: ");
for (i = 1; i < THREAD_NUM; i++) {
usleep(30*1000);
pthread_create(&thread_id[i], NULL, &threadfunc, NULL);
}
usleep(30*1000);
sleep(1); /* wait for parent to setpriority */
printprio("CHILD2: ");
for (i = 1; i < THREAD_NUM; i++) {
pthread_join(thread_id[i], NULL);
printf("Joined!\n");
}
}
return 0;
}
[-- Attachment #3: setprio_POSIX_instrumented.diff --]
[-- Type: text/x-patch, Size: 1672 bytes --]
--- a/kernel/sys.c.orig 2008-09-01 12:50:22.000000000 +0200
+++ b/kernel/sys.c 2008-09-01 15:11:45.000000000 +0200
@@ -162,15 +162,22 @@
else
p = current;
if (p)
+{printk("setting prio of pid %d tgid %d to %d\n", p->pid, p->tgid, niceval);
error = set_one_prio(p, niceval, error);
+}
break;
case PRIO_PROCESS:
if (who)
pid = find_vpid(who);
- else
+ else {
pid = task_pid(current);
+ who = current->pid;
+ }
do_each_pid_thread(pid, PIDTYPE_PID, p) {
- error = set_one_prio(p, niceval, error);
+ if (who == p->pid || who == p->tgid) {
+printk("setting prio of pid %d tgid %d to %d\n", p->pid, p->tgid, niceval);
+ error = set_one_prio(p, niceval, error);
+ }
} while_each_pid_thread(pid, PIDTYPE_PID, p);
break;
case PRIO_PGRP:
@@ -231,18 +238,25 @@
niceval = 20 - task_nice(p);
if (niceval > retval)
retval = niceval;
+printk("PRIO_THREAD: pid %d tgid %d: niceval=%ld retval=%ld\n", p->pid, p->tgid, niceval, retval);
}
break;
case PRIO_PROCESS:
if (who)
pid = find_vpid(who);
- else
+ else {
pid = task_pid(current);
+ who = current->pid;
+ }
do_each_pid_thread(pid, PIDTYPE_PID, p) {
- niceval = 20 - task_nice(p);
- if (niceval > retval)
- retval = niceval;
+ if (who == p->pid || who == p->tgid) {
+ niceval = 20 - task_nice(p);
+ if (niceval > retval)
+ retval = niceval;
+printk("PRIO_PROCESS: pid %d tgid %d: niceval=%ld\n", p->pid, p->tgid, niceval);
+ }
} while_each_pid_thread(pid, PIDTYPE_PID, p);
+printk("PRIO_PROCESS: returning retval=%ld\n", retval);
break;
case PRIO_PGRP:
if (who)
next prev parent reply other threads:[~2008-09-01 14:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-01 14:12 [PATCH] make setpriority POSIX compliant; introduce PRIO_THREAD extension Denys Vlasenko
2008-09-01 14:17 ` Denys Vlasenko [this message]
2008-09-01 14:42 ` Denys Vlasenko
2008-09-01 15:08 ` Peter Zijlstra
2008-09-01 15:19 ` Peter Zijlstra
2008-09-01 15:20 ` Denys Vlasenko
2008-09-01 17:58 ` Ulrich Drepper
2008-09-09 15:45 ` Michael Kerrisk
2008-09-09 16:42 ` Chris Friesen
2008-09-09 18:45 ` Michael Kerrisk
2008-09-10 9:28 ` Denys Vlasenko
2008-09-10 11:57 ` Michael Kerrisk
2008-09-10 12:08 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1220278678.3866.27.camel@localhost.localdomain \
--to=dvlasenk@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox