model-net-sched.h 6.72 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
 * Copyright (C) 2014 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

/* A scheduler interface for use by model-net. */

#ifndef MODEL_NET_SCHED_H
#define MODEL_NET_SCHED_H

#include <ross.h>
#include "model-net.h"
14
15
16
17
18

// forward decl of mn_sched_params since we currently have a circular include
// (method needs sched def, sched needs method def)
typedef struct mn_sched_params_s mn_sched_params;

19
20
#include "model-net-method.h"

21
22
23
24
25
26
27
/// types of schedulers
/// format: enum type, config string, function pointer names
/// fcfs-full eschews packetization
#define SCHEDULER_TYPES \
    X(MN_SCHED_FCFS,      "fcfs",        &fcfs_tab) \
    X(MN_SCHED_FCFS_FULL, "fcfs-full",   &fcfs_tab) \
    X(MN_SCHED_RR,        "round-robin", &rr_tab) \
28
    X(MN_SCHED_PRIO,      "priority",    &prio_tab) \
29
30
31
32
33
34
35
36
    X(MAX_SCHEDS,         NULL,          NULL)

#define X(a,b,c) a,
enum sched_type {
    SCHEDULER_TYPES
};
#undef X

37
38
39
40
41
/// scheduler decls

typedef struct model_net_sched_s model_net_sched;
typedef struct model_net_sched_rc_s model_net_sched_rc;

42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// priority scheduler configurtion parameters
typedef struct mn_prio_params_s {
    int num_prios; // number of priorities
    // sub-scheduler to use. can be any but prio
    enum sched_type sub_stype;
} mn_prio_params;

// TODO: other scheduler config params

// initialization parameter set
typedef struct model_net_sched_cfg_params_s {
    enum sched_type type;
    union {
        mn_prio_params prio;
    } u;
} model_net_sched_cfg_params;

typedef struct mn_sched_cfg_params {
    mn_prio_params prio;
} mn_sched_cfg_params;

/// message-specific parameters
enum sched_msg_param_type {
    MN_SCHED_PARAM_PRIO, // currently, only the priority scheduler has params
    MAX_SCHED_MSG_PARAM_TYPES
};

// scheduler-specific parameter definitions must go here
70
struct mn_sched_params_s {
71
    int prio; // MN_SCHED_PARAM_PRIO (currently the only one)
72
} ;
73

74
75
76
/// interface to be implemented by schedulers
/// see corresponding general functions
typedef struct model_net_sched_interface {
77
78
79
80
81
    // initialize the scheduler
    // params - scheduler specific params (currently only prio q uses)
    void (*init)(
            const struct model_net_method     * method, 
            const model_net_sched_cfg_params  * params,
82
            int                                 is_recv_queue,
83
84
            void                             ** sched);
    // finalize the scheduler
85
    void (*destroy)(void * sched);
86
87
88
89
    // add a new request to the scheduler
    // sched_params - per-message parameters distinct to each scheduler:
    //                prio (currently the only user): int priority
    //              - NULL arguments should be treated as "use default value" 
90
    void (*add)(
91
92
93
94
95
96
97
98
99
            model_net_request     * req,
            const mn_sched_params * sched_params,
            int                     remote_event_size,
            void                  * remote_event,
            int                     local_event_size,
            void                  * local_event,
            void                  * sched,
            model_net_sched_rc    * rc,
            tw_lp                 * lp);
100
    // reverse the previous request addition
101
    void (*add_rc)(void *sched, model_net_sched_rc *rc, tw_lp *lp);
102
    // schedule the next packet for processing by the model
103
    int  (*next)(
104
105
            tw_stime              * poffset,
            void                  * sched,
Jonathan Jenkins's avatar
Jonathan Jenkins committed
106
            // NOTE: copy here when deleting remote/local events for rc
107
108
109
            void                  * rc_event_save,
            model_net_sched_rc    * rc,
            tw_lp                 * lp);
110
111
112
113
114
115
    // reverse schedule the previous packet
    void (*next_rc)(
            void               * sched,
            void               * rc_event_save,
            model_net_sched_rc * rc,
            tw_lp              * lp);
116
117
118
119
120
121
} model_net_sched_interface;

/// overall scheduler struct - type puns the actual data structure

struct model_net_sched_s {
    enum sched_type type;
122
123
    // data for the underlying scheduler implementation (see
    // model-net-sched-impl*)
124
    void * dat;
125
    const model_net_sched_interface * impl;
126
127
};

128
129
/// scheduler-specific structures go here

130
131
132
133
134
135
136
/// reverse computation structure - this is expected to be held by upper-level
/// model-net LPs and passed to the scheduler functions to allow proper rc
/// NOTE: since modelnet LPs will be stashing this in their event structs, 
/// need to provide full definition in header
struct model_net_sched_rc_s {
    // NOTE: sched implementations may need different types, but for now they
    // are equivalent 
Jonathan Jenkins's avatar
Jonathan Jenkins committed
137
    model_net_request req; // request gets deleted...
138
    mn_sched_params sched_params; // along with msg params
139
    int rtn; // return code from a sched_next 
140
    int prio; // prio when doing priority queue events
141
142
};

143
144
145
// initialize the scheduler
// - params is created by the configuration routine and can be different from
//   type to type. Currently only priority scheduler uses it
146
void model_net_sched_init(
147
        const model_net_sched_cfg_params * params,
148
        int is_recv_queue,
149
150
151
152
153
154
155
156
157
158
159
160
161
162
        struct model_net_method *method,
        model_net_sched *sched);

/// schedules the next chunk, storing any info needed for rc in sched_rc
/// packet issue time is placed in poffset to be able to separate packet calls
/// between multiple scheduler events
/// returns: 
/// * 0 on success,
/// * 1 on success and the corresponding request is finished. In this case,
///   out_req is set to the underlying request
/// * -1 when there is nothing to be scheduled
int model_net_sched_next(
        tw_stime *poffset,
        model_net_sched *sched,
Jonathan Jenkins's avatar
Jonathan Jenkins committed
163
        void *rc_event_save,
164
165
166
167
168
        model_net_sched_rc *sched_rc,
        tw_lp *lp);

void model_net_sched_next_rc(
        model_net_sched *sched,
Jonathan Jenkins's avatar
Jonathan Jenkins committed
169
        void *rc_event_save,
170
171
172
173
174
        model_net_sched_rc *sched_rc,
        tw_lp *lp);

/// enter a new request into the scheduler, storing any info needed for rc in
/// sched_rc
175
176
/// sched_msg_params is scheduler-specific parameters (currently only used by
/// prio scheduler)
177
178
void model_net_sched_add(
        model_net_request *req,
179
        const mn_sched_params * sched_params,
180
181
182
183
184
185
186
187
188
189
190
191
192
        int remote_event_size,
        void * remote_event,
        int local_event_size,
        void * local_event,
        model_net_sched *sched,
        model_net_sched_rc *sched_rc,
        tw_lp *lp);

void model_net_sched_add_rc(
        model_net_sched *sched,
        model_net_sched_rc *sched_rc,
        tw_lp *lp);

193
194
195
// set default parameters for messages that don't specify any
void model_net_sched_set_default_params(mn_sched_params *sched_params);

196
197
extern char * sched_names[];

198
199
200
201
202
203
204
205
206
207
#endif /* end of include guard: MODEL_NET_SCHED_H */

/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 * End:
 *
 * vim: ft=c ts=8 sts=4 sw=4 expandtab
 */