-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 91415 b: refs/heads/master c: e80ab41 h: refs/heads/master i: 91413: 9d7b590 91411: 6efe2e0 91407: 95216b5 v: v3
- Loading branch information
Linus Torvalds
committed
Apr 21, 2008
1 parent
fc70658
commit 79ea3e5
Showing
801 changed files
with
44,955 additions
and
15,807 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: ee959b00c335d7780136c5abda37809191fe52c3 | ||
refs/heads/master: e80ab411e589e00550e2e6e5a6a02d59cc730357 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
96 changes: 96 additions & 0 deletions
96
trunk/Documentation/prctl/disable-tsc-ctxt-sw-stress-test.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* | ||
* Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...) | ||
* | ||
* Tests if the control register is updated correctly | ||
* at context switches | ||
* | ||
* Warning: this test will cause a very high load for a few seconds | ||
* | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <signal.h> | ||
#include <inttypes.h> | ||
#include <wait.h> | ||
|
||
|
||
#include <sys/prctl.h> | ||
#include <linux/prctl.h> | ||
|
||
/* Get/set the process' ability to use the timestamp counter instruction */ | ||
#ifndef PR_GET_TSC | ||
#define PR_GET_TSC 25 | ||
#define PR_SET_TSC 26 | ||
# define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */ | ||
# define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */ | ||
#endif | ||
|
||
uint64_t rdtsc() { | ||
uint32_t lo, hi; | ||
/* We cannot use "=A", since this would use %rax on x86_64 */ | ||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); | ||
return (uint64_t)hi << 32 | lo; | ||
} | ||
|
||
void sigsegv_expect(int sig) | ||
{ | ||
/* */ | ||
} | ||
|
||
void segvtask(void) | ||
{ | ||
if (prctl(PR_SET_TSC, PR_TSC_SIGSEGV) < 0) | ||
{ | ||
perror("prctl"); | ||
exit(0); | ||
} | ||
signal(SIGSEGV, sigsegv_expect); | ||
alarm(10); | ||
rdtsc(); | ||
fprintf(stderr, "FATAL ERROR, rdtsc() succeeded while disabled\n"); | ||
exit(0); | ||
} | ||
|
||
|
||
void sigsegv_fail(int sig) | ||
{ | ||
fprintf(stderr, "FATAL ERROR, rdtsc() failed while enabled\n"); | ||
exit(0); | ||
} | ||
|
||
void rdtsctask(void) | ||
{ | ||
if (prctl(PR_SET_TSC, PR_TSC_ENABLE) < 0) | ||
{ | ||
perror("prctl"); | ||
exit(0); | ||
} | ||
signal(SIGSEGV, sigsegv_fail); | ||
alarm(10); | ||
for(;;) rdtsc(); | ||
} | ||
|
||
|
||
int main(int argc, char **argv) | ||
{ | ||
int n_tasks = 100, i; | ||
|
||
fprintf(stderr, "[No further output means we're allright]\n"); | ||
|
||
for (i=0; i<n_tasks; i++) | ||
if (fork() == 0) | ||
{ | ||
if (i & 1) | ||
segvtask(); | ||
else | ||
rdtsctask(); | ||
} | ||
|
||
for (i=0; i<n_tasks; i++) | ||
wait(NULL); | ||
|
||
exit(0); | ||
} | ||
|
95 changes: 95 additions & 0 deletions
95
trunk/Documentation/prctl/disable-tsc-on-off-stress-test.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...) | ||
* | ||
* Tests if the control register is updated correctly | ||
* when set with prctl() | ||
* | ||
* Warning: this test will cause a very high load for a few seconds | ||
* | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <signal.h> | ||
#include <inttypes.h> | ||
#include <wait.h> | ||
|
||
|
||
#include <sys/prctl.h> | ||
#include <linux/prctl.h> | ||
|
||
/* Get/set the process' ability to use the timestamp counter instruction */ | ||
#ifndef PR_GET_TSC | ||
#define PR_GET_TSC 25 | ||
#define PR_SET_TSC 26 | ||
# define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */ | ||
# define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */ | ||
#endif | ||
|
||
/* snippet from wikipedia :-) */ | ||
|
||
uint64_t rdtsc() { | ||
uint32_t lo, hi; | ||
/* We cannot use "=A", since this would use %rax on x86_64 */ | ||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); | ||
return (uint64_t)hi << 32 | lo; | ||
} | ||
|
||
int should_segv = 0; | ||
|
||
void sigsegv_cb(int sig) | ||
{ | ||
if (!should_segv) | ||
{ | ||
fprintf(stderr, "FATAL ERROR, rdtsc() failed while enabled\n"); | ||
exit(0); | ||
} | ||
if (prctl(PR_SET_TSC, PR_TSC_ENABLE) < 0) | ||
{ | ||
perror("prctl"); | ||
exit(0); | ||
} | ||
should_segv = 0; | ||
|
||
rdtsc(); | ||
} | ||
|
||
void task(void) | ||
{ | ||
signal(SIGSEGV, sigsegv_cb); | ||
alarm(10); | ||
for(;;) | ||
{ | ||
rdtsc(); | ||
if (should_segv) | ||
{ | ||
fprintf(stderr, "FATAL ERROR, rdtsc() succeeded while disabled\n"); | ||
exit(0); | ||
} | ||
if (prctl(PR_SET_TSC, PR_TSC_SIGSEGV) < 0) | ||
{ | ||
perror("prctl"); | ||
exit(0); | ||
} | ||
should_segv = 1; | ||
} | ||
} | ||
|
||
|
||
int main(int argc, char **argv) | ||
{ | ||
int n_tasks = 100, i; | ||
|
||
fprintf(stderr, "[No further output means we're allright]\n"); | ||
|
||
for (i=0; i<n_tasks; i++) | ||
if (fork() == 0) | ||
task(); | ||
|
||
for (i=0; i<n_tasks; i++) | ||
wait(NULL); | ||
|
||
exit(0); | ||
} | ||
|
Oops, something went wrong.