Vcore states for preemption recovery (XCC)
[akaros.git] / kern / include / ros / resource.h
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  *
6  * Interface for asking for resources from the kernel.
7  */
8
9 #ifndef ROS_INCLUDE_RESOURCE_H
10 #define ROS_INCLUDE_RESOURCE_H
11
12 #include <ros/common.h>
13
14 /* A request means to set the amt_wanted to X.  Any changes result in prodding
15  * the scheduler / whatever.
16  *
17  * To make these requests, userspace uses SYS_resource_req, which currently is a
18  * syscall to make one request.
19  *
20  * Another way would be to take a ptr to a resource req and length, to batch
21  * requests together.  Individual syscalls are simpler than the batch.  For
22  * example,  servicing the core request doesn't easily return (which could lead
23  * to other requests getting ignored, or us having to worry about the
24  * order of processing).  Dealing with more than one request per type could be a
25  * pain too.  The batch one is nice, since it amortizes the overhead of the syscall,
26  * but it doesn't really matter that much, esp when there are only a few resources.
27  *
28  * amt_wanted_min is the least amount you are will to run with.
29  *
30  * A few caveats for cores:
31  * - when someone yields (esp if the wish > grant): yielding means take one
32  *   away, and set wished = current.  don't yield if you want another core still
33  * - if someone requests less cores than they currently have active, we'll set
34  *   their wish to their active and return an error code (no core allocation
35  *   changes either).
36  */
37
38 /* Types of resource requests */
39 #define RES_CORES                        0
40 #define RES_MEMORY                       1
41 #define RES_APPLE_PIES           2
42 #define MAX_NUM_RESOURCES    3
43
44 /* Flags */
45 #define REQ_ASYNC                       0x01 // Sync by default (?)
46 #define REQ_SOFT                        0x02 // just making something up
47
48 struct resource {
49         int type;
50         size_t amt_wanted;
51         size_t amt_wanted_min;
52         size_t amt_granted;
53         uint32_t flags;
54 };
55
56 #endif // !ROS_INCLUDE_RESOURCE_H