#ifndef _RSM_IN_H
#define _RSM_IN_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/rsm/rsm.h>
#include <sys/rsm/rsmpi.h>
#define DRIVER_NAME "rsm"
#define RSM_DRIVER_MINOR 0
#define RSM_CNUM 8
#define RSMIPC_SZ 10
#define RSMIPC_MAX_MESSAGES 64
#define RSMIPC_LOTSFREE_MSGBUFS 16
#define RSM_INTR_T_KA 0x88
#define RSM_SERVICE RSM_INTR_T_KA
#define RSM_PRI 2
#define RSM_QUEUE_SZ 256
#define RSM_LOCK 0
#define RSM_NOLOCK 1
#define RSM_MAX_NUM_SEG 4095
#define RSM_MAX_NODE 64
#define RSM_MAX_CTRL 32
#define RSM_MAXSZ_PAGE_ALIGNED (UINT_MAX & PAGEMASK)
#define TRASHSIZE 0x7fffffffffffe000
#define RSM_ACCESS_READ 0444
#define RSM_ACCESS_WRITE 0222
#define RSM_ACCESS_TRUSTED 0666
#define DISCONNECT 1
#define NO_DISCONNECT 0
struct rsm_driver_data {
kmutex_t drv_lock;
kcondvar_t drv_cv;
int drv_state;
int drv_memdel_cnt;
};
#define RSM_DRV_NEW 0
#define RSM_DRV_OK 1
#define RSM_DRV_PREDEL_STARTED 2
#define RSM_DRV_PREDEL_COMPLETED 3
#define RSM_DRV_POSTDEL_IN_PROGRESS 4
#define RSM_DRV_DR_IN_PROGRESS 5
#define RSM_DRV_REG_PROCESSING 6
#define RSM_DRV_UNREG_PROCESSING 7
#define RSM_DR_QUIESCE 0
#define RSM_DR_UNQUIESCE 1
typedef enum {
RSM_STATE_NEW = 0,
RSM_STATE_NEW_QUIESCED,
RSM_STATE_BIND,
RSM_STATE_BIND_QUIESCED,
RSM_STATE_EXPORT,
RSM_STATE_EXPORT_QUIESCING,
RSM_STATE_EXPORT_QUIESCED,
RSM_STATE_ZOMBIE,
RSM_STATE_CONNECTING,
RSM_STATE_ABORT_CONNECT,
RSM_STATE_CONNECT,
RSM_STATE_CONN_QUIESCE,
RSM_STATE_MAPPING,
RSM_STATE_ACTIVE,
RSM_STATE_MAP_QUIESCE,
RSM_STATE_DISCONNECT,
RSM_STATE_END
} rsm_resource_state_t;
typedef enum {
RSM_RESOURCE_EXPORT_SEGMENT,
RSM_RESOURCE_IMPORT_SEGMENT,
RSM_RESOURCE_BAR
}rsm_resource_type_t;
typedef struct rsm_resource {
kmutex_t rsmrc_lock;
minor_t rsmrc_num;
rsm_memseg_id_t rsmrc_key;
mode_t rsmrc_mode;
struct adapter *rsmrc_adapter;
rsm_node_id_t rsmrc_node;
rsm_resource_type_t rsmrc_type;
rsm_resource_state_t rsmrc_state;
struct rsm_resource *rsmrc_next;
} rsmresource_t;
#define RSMRC_BLKSZ 16
#define RSMRC_RESERVED ((rsmresource_t *)0x1)
#define RSM_HASHSZ 128
#define RSM_USER_MEMORY 0x1
#define RSM_KERNEL_MEMORY 0x2
#define RSM_EXPORT_WAIT 0x4
#define RSM_SEGMENT_POLL 0x8
#define RSM_FORCE_DISCONNECT 0x10
#define RSM_IMPORT_DUMMY 0x20
#define RSMKA_ALLOW_UNBIND_REBIND 0x40
#define RSM_REPUBLISH_WAIT 0x80
#define RSM_DR_INPROGRESS 0x100
#define RSM_FORCE_DESTROY_WAIT 0x200
#define RSMKA_SET_RESOURCE_DONTWAIT 0x400
#define RSMRC_LOCK(p) mutex_enter(&(p)->rsmrc_lock)
#define RSMRC_UNLOCK(p) mutex_exit(&(p)->rsmrc_lock)
#define RSMRC_HELD(p) MUTEX_HELD(&(p)->rsmrc_lock)
#define RSMRC_TRY(p) mutex_tryenter(&(p)->rsmrc_lock)
typedef struct rsm_region {
caddr_t r_vaddr;
size_t r_len;
offset_t r_off;
struct as *r_asp;
struct rsm_region *r_next;
}rsm_region;
typedef struct rsm_cookie {
devmap_cookie_t c_dhp;
offset_t c_off;
size_t c_len;
struct rsm_cookie *c_next;
}rsmcookie_t;
typedef struct rsm_mapinfo {
dev_info_t *dip;
uint_t dev_register;
off_t dev_offset;
off_t start_offset;
size_t individual_len;
struct rsm_mapinfo *next;
} rsm_mapinfo_t;
typedef struct rsm_import_share {
kmutex_t rsmsi_lock;
kcondvar_t rsmsi_cv;
rsm_node_id_t rsmsi_node;
rsm_memseg_id_t rsmsi_segid;
size_t rsmsi_seglen;
rsm_memseg_import_handle_t rsmsi_handle;
uint_t rsmsi_state;
#define RSMSI_STATE_NEW 0x0001
#define RSMSI_STATE_CONNECTING 0x0002
#define RSMSI_STATE_ABORT_CONNECT 0x0004
#define RSMSI_STATE_CONNECTED 0x0008
#define RSMSI_STATE_CONN_QUIESCE 0x0010
#define RSMSI_STATE_MAPPED 0x0020
#define RSMSI_STATE_MAP_QUIESCE 0x0040
#define RSMSI_STATE_DISCONNECTED 0x0080
uint_t rsmsi_refcnt;
uint_t rsmsi_mapcnt;
mode_t rsmsi_mode;
uid_t rsmsi_uid;
gid_t rsmsi_gid;
rsm_mapinfo_t *rsmsi_mapinfo;
uint_t rsmsi_flags;
#define RSMSI_FLAGS_ABORTDONE 0x0001
void *rsmsi_cookie;
} rsm_import_share_t;
#define RSMSI_LOCK(sharep) mutex_enter(&(sharep)->rsmsi_lock)
#define RSMSI_UNLOCK(sharep) mutex_exit(&(sharep)->rsmsi_lock)
#define RSMSI_HELD(sharep) MUTEX_HELD(&(sharep)->rsmsi_lock)
#define RSMSI_TRY(sharep) mutex_tryenter(&(sharep)->rsmsi_lock)
typedef struct rsm_seginfo {
rsmresource_t s_hdr;
#define s_state s_hdr.rsmrc_state
#define s_adapter s_hdr.rsmrc_adapter
#define s_node s_hdr.rsmrc_node
#define s_lock s_hdr.rsmrc_lock
#define s_minor s_hdr.rsmrc_num
#define s_key s_hdr.rsmrc_key
#define s_mode s_hdr.rsmrc_mode
#define s_type s_hdr.rsmrc_type
uid_t s_uid;
gid_t s_gid;
size_t s_len;
rsm_region s_region;
int s_flags;
int s_pollflag;
kcondvar_t s_cv;
rsm_memseg_id_t s_segid;
int s_acl_len;
rsmapi_access_entry_t *s_acl;
rsm_access_entry_t *s_acl_in;
struct pollhead s_poll;
uint32_t s_pollevent;
pid_t s_pid;
rsmcookie_t *s_ckl;
size_t s_total_maplen;
rsm_mapinfo_t *s_mapinfo;
union {
rsm_memseg_import_handle_t in;
rsm_memseg_export_handle_t out;
} s_handle;
ddi_umem_cookie_t s_cookie;
rsm_import_share_t *s_share;
uint_t s_rdmacnt;
struct proc *s_proc;
} rsmseg_t;
#define rsmseglock_acquire(p) RSMRC_LOCK((rsmresource_t *)(p))
#define rsmseglock_release(p) RSMRC_UNLOCK((rsmresource_t *)(p))
#define rsmseglock_held(p) RSMRC_HELD((rsmresource_t *)(p))
#define rsmseglock_try(p) RSMRC_TRY((rsmresource_t *)(p))
#define rsmsharelock_acquire(p) RSMSI_LOCK(p->s_share)
#define rsmsharelock_release(p) RSMSI_UNLOCK(p->s_share)
#define rsmsharelock_held(p) RSMSI_HELD(p->s_share)
#define rsmsharelock_try(p) RSMSI_TRY(p->s_share)
typedef struct {
int rsmrcblk_avail;
rsmresource_t *rsmrcblk_blks[RSMRC_BLKSZ];
}rsmresource_blk_t;
struct rsmresource_table {
krwlock_t rsmrc_lock;
int rsmrc_len;
int rsmrc_sz;
rsmresource_blk_t **rsmrc_root;
};
typedef struct rsmhash_table {
krwlock_t rsmhash_rw;
rsmresource_t **bucket;
} rsmhash_table_t;
#define RSMIPC_FREE 0x1
#define RSMIPC_PENDING 0x2
#define RSMIPC_SET(x, v) ((x)->rsmipc_flags |= (v))
#define RSMIPC_GET(x, v) ((x)->rsmipc_flags & (v))
#define RSMIPC_CLEAR(x, v) ((x)->rsmipc_flags &= ~(v))
typedef struct rsmipc_slot {
kmutex_t rsmipc_lock;
kcondvar_t rsmipc_cv;
int rsmipc_flags;
rsmipc_cookie_t rsmipc_cookie;
void *rsmipc_data;
}rsmipc_slot_t;
typedef struct {
kmutex_t lock;
kcondvar_t cv;
int count;
int wanted;
int sequence;
rsmipc_slot_t slots[RSMIPC_SZ];
}rsm_ipc_t;
typedef struct importing_token {
struct importing_token *next;
rsm_memseg_id_t key;
rsm_node_id_t importing_node;
void *import_segment_cookie;
rsm_addr_t importing_adapter_hwaddr;
} importing_token_t;
typedef struct {
kmutex_t lock;
importing_token_t **bucket;
} importers_table_t;
typedef struct republish_token {
struct republish_token *next;
rsm_memseg_id_t key;
rsm_node_id_t importing_node;
rsm_permission_t permission;
} republish_token_t;
typedef struct list_element {
struct list_element *next;
rsm_node_id_t nodeid;
uint32_t flags;
#define RSM_SUSPEND_ACKPENDING 0x01
#define RSM_SUSPEND_NODEDEAD 0x02
} list_element_t;
typedef struct list_head {
struct list_element *list_head;
kmutex_t list_lock;
} list_head_t;
#ifdef __cplusplus
}
#endif
#endif