local-storage-model.h 3.15 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/*
 * Copyright (C) 2013 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

#ifndef __LS_MODEL__
#define __LS_MODEL__

#include <ross.h>

12 13 14
#include "codes-callback.h"
#include "codes-mapping-context.h"

15 16
#define LSM_NAME "lsm"

17 18 19 20 21
/* HACK: problems arise when some LP sends multiple messages as part of an
 * event and expects FCFS ordering. One could simply set a higher delay in
 * delay, but that is hacky as well (and relies on knowing bounds on internal
 * codes_local_latency bounds. Hence, expose explicit start-sequence and
 * stop-sequence markers */
22
extern int lsm_in_sequence;
23 24
extern tw_stime lsm_msg_offset;
#define LSM_START_SEQ() do {\
25
    lsm_in_sequence = 1; \
26 27 28
    lsm_msg_offset = 0.0; \
} while (0)
#define LSM_END_SEQ() do {\
29
    lsm_in_sequence = 0;\
30 31
} while (0)

32 33 34 35 36 37 38 39 40 41 42 43
/*
 * lsm_event_t
 *   - events supported by the local storage model
 */
typedef enum lsm_event_e
{
    LSM_WRITE_REQUEST = 1,
    LSM_READ_REQUEST = 2,
    LSM_WRITE_COMPLETION = 3,
    LSM_READ_COMPLETION = 4
} lsm_event_t;

44 45 46 47 48 49 50
/*
 * return type for lsm events (in the codes-callback sense)
 */
typedef struct {
    int rc;
} lsm_return_t;

51 52 53 54
/*
 * Prototypes
 */

55
/* given LP sender, find the LSM device LP in the same group */ 
56
tw_lpid lsm_find_local_device(
57
        struct codes_mctx const * map_ctx,
58
        tw_lpid sender_gid);
59

60
/*
61
 * lsm_io_event
62 63 64
 *   - creates a new event that is targeted for the corresponding
 *     LSM LP.
 *   - this event will allow wrapping the callers completion event
65 66
 *   - lp_io_category: string name to identify the traffic category for use in
 *     lp-io
67 68 69 70 71 72
 *   - gid_offset: relative offset of the LSM LP to the originating LP
 *   - io_object: id of byte stream the caller will modify
 *   - io_offset: offset into byte stream
 *   - io_size_bytes: size in bytes of IO request
 *   - io_type: read or write request
 */
73 74 75

void lsm_io_event(
        const char * lp_io_category,
76 77 78 79 80
        uint64_t io_object,
        int64_t  io_offset,
        uint64_t io_size_bytes,
        int      io_type,
        tw_stime delay,
81 82 83 84 85
        tw_lp *sender,
        struct codes_mctx const * map_ctx,
        int return_tag,
        msg_header const * return_header,
        struct codes_cb_info const * cb);
86

87
void lsm_io_event_rc(tw_lp *sender);
88 89 90 91 92 93

/* get the priority count for the LSM scheduler.
 * returns 0 if priorities aren't being used, -1 if no LSMs were configured,
 * and >0 otherwise.
 * This should not be called before lsm_configure */
int lsm_get_num_priorities(
94 95
        struct codes_mctx const * map_ctx,
        tw_lpid sender_id);
96 97 98 99 100 101 102 103 104

/* set a request priority for the following lsm_event_*.
 * - tw_error will be called if the priority ends up being out-of-bounds
 *   (won't able to tell until the lsm_event call b/c annotations)
 * - not setting a priority (or setting a negative priority) is equivalent to
 *   setting the message to the lowest priority
 */
void lsm_set_event_priority(int prio);

105
/* registers the storage model LP with CODES/ROSS */
106
void lsm_register(void);
107

108 109
/* configures the LSM model(s) */
void lsm_configure(void);
110 111 112 113 114 115 116 117 118 119 120 121 122

#define LSM_DEBUG 0

#endif

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