Pulled code specific to all 2LS out of pthread.c
[akaros.git] / tests / msr_cycling_vcores.c
1 /* tests/msr_cycling_vcores.c
2  *
3  * This requests the max_vcores in the system, waits a bit, then gives them
4  * back, looping forever.  We can't give up all vcores, based on the current
5  * kernel, so we hold on to vcore0 to do the thinking. */
6
7 #include <ros/resource.h>
8 #include <parlib.h>
9 #include <rstdio.h>
10 #include <vcore.h>
11 #include <timing.h>
12 #include <mcs.h>
13
14 #ifdef __sparc_v8__
15 # define udelay(x) udelay((x)/2000)
16 #endif
17
18 mcs_barrier_t b;
19 uint64_t begin = 0, end = 0;
20
21 void ghetto_vcore_entry(void);
22 struct schedule_ops ghetto_sched_ops = {
23         0, /* init, */
24         ghetto_vcore_entry,
25         0, /* thread_create, */
26         0, /* thread_runnable, */
27         0, /* thread_yield, */
28         0, /* thread_exit, */
29         0, /* preempt_pending, */
30         0, /* spawn_thread, */
31 };
32 struct schedule_ops *sched_ops = &ghetto_sched_ops;
33
34 int main(int argc, char** argv)
35 {
36
37         /* don't forget to enable notifs on vcore0.  if you don't, the kernel will
38          * restart your _S with notifs disabled, which is a path to confusion. */
39         struct preempt_data *vcpd = &__procdata.vcore_preempt_data[0];
40         vcpd->notif_enabled = TRUE;
41
42         mcs_barrier_init(&b, max_vcores());
43
44         vcore_request(max_vcores());
45         printf("not enough vcores, going to try it manually\n");
46         sys_resource_req(RES_CORES, max_vcores(), 1, REQ_SOFT);
47         printf("We're screwed!\n");
48
49         /* should never make it here */
50         return -1;
51 }
52
53 void ghetto_vcore_entry(void)
54 {
55         uint32_t vcoreid = vcore_id();
56
57         if (vcoreid) {
58                 mcs_barrier_wait(&b, vcoreid);
59                 udelay(5000000);
60                 if (vcoreid == 1)
61                         printf("Proc %d's vcores are yielding\n", getpid());
62                 sys_yield(0);
63         } else {
64                 /* trip the barrier here, all future times are in the loop */
65                 mcs_barrier_wait(&b, vcoreid);
66                 while (1) {
67                         udelay(15000000);
68                         printf("Proc %d requesting its cores again\n", getpid());
69                         begin = read_tsc();
70                         sys_resource_req(RES_CORES, max_vcores(), 1, REQ_SOFT);
71                         mcs_barrier_wait(&b, vcoreid);
72                         end = read_tsc();
73                         printf("Took %llu usec (%llu nsec) to get my yielded cores back.\n",
74                                udiff(begin, end), ndiff(begin, end));
75                         printf("[T]:010:%llu:%llu\n",
76                                udiff(begin, end), ndiff(begin, end));
77                 }
78         }
79         printf("We're screwed!\n");
80         exit(-1);
81 }