119 lines
3.5 KiB
C
119 lines
3.5 KiB
C
/*
|
|
* ramster.h
|
|
*
|
|
* Peer-to-peer transcendent memory
|
|
*
|
|
* Copyright (c) 2009-2012, Dan Magenheimer, Oracle Corp.
|
|
*/
|
|
|
|
#ifndef _RAMSTER_H_
|
|
#define _RAMSTER_H_
|
|
|
|
/*
|
|
* format of remote pampd:
|
|
* bit 0 == intransit
|
|
* bit 1 == is_remote... if this bit is set, then
|
|
* bit 2-9 == remotenode
|
|
* bit 10-22 == size
|
|
* bit 23-30 == cksum
|
|
*/
|
|
#define FAKE_PAMPD_INTRANSIT_BITS 1
|
|
#define FAKE_PAMPD_ISREMOTE_BITS 1
|
|
#define FAKE_PAMPD_REMOTENODE_BITS 8
|
|
#define FAKE_PAMPD_REMOTESIZE_BITS 13
|
|
#define FAKE_PAMPD_CHECKSUM_BITS 8
|
|
|
|
#define FAKE_PAMPD_INTRANSIT_SHIFT 0
|
|
#define FAKE_PAMPD_ISREMOTE_SHIFT (FAKE_PAMPD_INTRANSIT_SHIFT + \
|
|
FAKE_PAMPD_INTRANSIT_BITS)
|
|
#define FAKE_PAMPD_REMOTENODE_SHIFT (FAKE_PAMPD_ISREMOTE_SHIFT + \
|
|
FAKE_PAMPD_ISREMOTE_BITS)
|
|
#define FAKE_PAMPD_REMOTESIZE_SHIFT (FAKE_PAMPD_REMOTENODE_SHIFT + \
|
|
FAKE_PAMPD_REMOTENODE_BITS)
|
|
#define FAKE_PAMPD_CHECKSUM_SHIFT (FAKE_PAMPD_REMOTESIZE_SHIFT + \
|
|
FAKE_PAMPD_REMOTESIZE_BITS)
|
|
|
|
#define FAKE_PAMPD_MASK(x) ((1UL << (x)) - 1)
|
|
|
|
static inline void *pampd_make_remote(int remotenode, size_t size,
|
|
unsigned char cksum)
|
|
{
|
|
unsigned long fake_pampd = 0;
|
|
fake_pampd |= 1UL << FAKE_PAMPD_ISREMOTE_SHIFT;
|
|
fake_pampd |= ((unsigned long)remotenode &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_REMOTENODE_BITS)) <<
|
|
FAKE_PAMPD_REMOTENODE_SHIFT;
|
|
fake_pampd |= ((unsigned long)size &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_REMOTESIZE_BITS)) <<
|
|
FAKE_PAMPD_REMOTESIZE_SHIFT;
|
|
fake_pampd |= ((unsigned long)cksum &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_CHECKSUM_BITS)) <<
|
|
FAKE_PAMPD_CHECKSUM_SHIFT;
|
|
return (void *)fake_pampd;
|
|
}
|
|
|
|
static inline unsigned int pampd_remote_node(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
return (fake_pampd >> FAKE_PAMPD_REMOTENODE_SHIFT) &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_REMOTENODE_BITS);
|
|
}
|
|
|
|
static inline unsigned int pampd_remote_size(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
return (fake_pampd >> FAKE_PAMPD_REMOTESIZE_SHIFT) &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_REMOTESIZE_BITS);
|
|
}
|
|
|
|
static inline unsigned char pampd_remote_cksum(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
return (fake_pampd >> FAKE_PAMPD_CHECKSUM_SHIFT) &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_CHECKSUM_BITS);
|
|
}
|
|
|
|
static inline bool pampd_is_remote(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
return (fake_pampd >> FAKE_PAMPD_ISREMOTE_SHIFT) &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_ISREMOTE_BITS);
|
|
}
|
|
|
|
static inline bool pampd_is_intransit(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
return (fake_pampd >> FAKE_PAMPD_INTRANSIT_SHIFT) &
|
|
FAKE_PAMPD_MASK(FAKE_PAMPD_INTRANSIT_BITS);
|
|
}
|
|
|
|
/* note that it is a BUG for intransit to be set without isremote also set */
|
|
static inline void *pampd_mark_intransit(void *pampd)
|
|
{
|
|
unsigned long fake_pampd = (unsigned long)pampd;
|
|
|
|
fake_pampd |= 1UL << FAKE_PAMPD_ISREMOTE_SHIFT;
|
|
fake_pampd |= 1UL << FAKE_PAMPD_INTRANSIT_SHIFT;
|
|
return (void *)fake_pampd;
|
|
}
|
|
|
|
static inline void *pampd_mask_intransit_and_remote(void *marked_pampd)
|
|
{
|
|
unsigned long pampd = (unsigned long)marked_pampd;
|
|
|
|
pampd &= ~(1UL << FAKE_PAMPD_INTRANSIT_SHIFT);
|
|
pampd &= ~(1UL << FAKE_PAMPD_ISREMOTE_SHIFT);
|
|
return (void *)pampd;
|
|
}
|
|
|
|
extern int ramster_remote_async_get(struct tmem_xhandle *,
|
|
bool, int, size_t, uint8_t, void *extra);
|
|
extern int ramster_remote_put(struct tmem_xhandle *, char *, size_t,
|
|
bool, int *);
|
|
extern int ramster_remote_flush(struct tmem_xhandle *, int);
|
|
extern int ramster_remote_flush_object(struct tmem_xhandle *, int);
|
|
extern int r2net_register_handlers(void);
|
|
extern int r2net_remote_target_node_set(int);
|
|
|
|
#endif /* _TMEM_H */
|