mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 17:59:32 +00:00
![Dan Magenheimer](/assets/img/avatar_default.png)
RAMster implements peer-to-peer transcendent memory, allowing a "cluster" of kernels to dynamically pool their RAM. This patch adds new files necessary for ramster support: The file ramster.h declares externs and some pampd bitfield manipulation. The file zcache.h declares some zcache functions that now must be accessed from the ramster glue code. The file r2net.c is the glue between zcache and the messaging layer, providing routines called from zcache that initiate messages, and routines that handle messages by calling zcache. TODO explains future plans for merging. Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
118 lines
3.5 KiB
C
118 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 */
|