model-net-sched.h 6.15 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
 * 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"
#include "model-net-method.h"

16
17
18
19
20
21
22
/// 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) \
23
    X(MN_SCHED_PRIO,      "priority",    &prio_tab) \
24
25
26
27
28
29
30
31
    X(MAX_SCHEDS,         NULL,          NULL)

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

32
33
34
35
36
/// scheduler decls

typedef struct model_net_sched_s model_net_sched;
typedef struct model_net_sched_rc_s model_net_sched_rc;

37
38
39
40
41
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
// 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
typedef struct mn_sched_params_s {
    int prio; // MN_SCHED_PARAM_PRIO (currently the only one)
} mn_sched_params;

69
70
71
/// interface to be implemented by schedulers
/// see corresponding general functions
typedef struct model_net_sched_interface {
72
73
74
75
76
77
78
    // 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,
            void                             ** sched);
    // finalize the scheduler
79
    void (*destroy)(void * sched);
80
81
82
83
    // 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" 
84
    void (*add)(
85
86
87
88
89
90
91
92
93
94
            model_net_request  * req,
            void               * 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);
    // reverse the previous request addition
95
    void (*add_rc)(void *sched, model_net_sched_rc *rc, tw_lp *lp);
96
    // schedule the next packet for processing by the model
97
    int  (*next)(
98
99
            tw_stime           * poffset,
            void               * sched,
Jonathan Jenkins's avatar
Jonathan Jenkins committed
100
            // NOTE: copy here when deleting remote/local events for rc
101
102
103
104
105
106
107
108
109
            void               * rc_event_save,
            model_net_sched_rc * rc,
            tw_lp              * lp);
    // reverse schedule the previous packet
    void (*next_rc)(
            void               * sched,
            void               * rc_event_save,
            model_net_sched_rc * rc,
            tw_lp              * lp);
110
111
112
113
114
115
116
} model_net_sched_interface;

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

struct model_net_sched_s {
    enum sched_type type;
    void * dat;
117
    const model_net_sched_interface * impl;
118
119
};

120
121
/// scheduler-specific structures go here

122
123
124
125
126
127
128
/// 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
129
    model_net_request req; // request gets deleted...
130
    int rtn; // return code from a sched_next 
131
    int prio; // prio when doing priority queue events 
132
133
};

134
135
136
// initialize the scheduler
// - params is created by the configuration routine and can be different from
//   type to type. Currently only priority scheduler uses it
137
void model_net_sched_init(
138
        const model_net_sched_cfg_params * params,
139
140
141
142
143
144
145
146
147
148
149
150
151
152
        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
153
        void *rc_event_save,
154
155
156
157
158
        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
159
        void *rc_event_save,
160
161
162
163
164
        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
165
166
/// sched_msg_params is scheduler-specific parameters (currently only used by
/// prio scheduler)
167
168
void model_net_sched_add(
        model_net_request *req,
169
        void * sched_msg_params,
170
171
172
173
174
175
176
177
178
179
180
181
182
        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);

183
184
extern char * sched_names[];

185
186
187
188
189
190
191
192
193
194
#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
 */