#include <xseg/xseg.h>
#include <sys/kernel/segdev.h>
#include <sys/util.h>
+#include <xtypes/xpool.h>
MODULE_DESCRIPTION("xseg_pthread");
MODULE_AUTHOR("XSEG");
}
}
+ XSEGLOG("creating segment of size %llu\n", size);
+
if (ioctl(fd, SEGDEV_IOC_CREATESEG, size)) {
XSEGLOG("Failed to create segment");
closedev();
[ -z "${XSEG_HOME}" ] && XSEG_HOME="/root/archip/xseg"
[ -z "${MODULES_DIR}" ] && MODULES_DIR="${XSEG_HOME}/lib/kernel"
#type:name:nr_ports:nr_requests:request_size:extra_size:page_shift
- [ -z "${SPEC}" ] && SPEC="segdev:xsegbd:16:1024:12"
+ [ -z "${SPEC}" ] && SPEC="segdev:xsegbd:4:1024:12"
[ -z "${REQS}" ] && REQS=512
[ -z "${PORTS}" ] && PORTS=16
[ -z "${IMAGES}" ] && IMAGES="/srv/archip/images"
# @param $2 xseg port
function spawn_filed {
- "${XSEG_HOME}/peers/user/filed" "$1" -p "$2" -g "${SPEC}" -n ${NR_OPS} &> "${XSEG_LOGS}/filed-${HOSTNAME}" &
+ "${XSEG_HOME}/peers/user/filed" "$1" -p "$2" -g "${SPEC}" -n ${NR_OPS} -v &> "${XSEG_LOGS}/filed-${HOSTNAME}" &
}
# map_volume - Map a volume to an xsegbd device
mk_chardev
load_all
spawn_filed ${IMAGES} 1
- map_volume xsegvol 0 1
+# map_volume xsegvol 0 1
;;
stop)
pkill -f peers/user/filed
sleep 0.5
- unmap_device 0
+# unmap_device 0
rm ${CHRDEV_NAME}
unload_all
;;
struct xsegbd_pending *pending;
struct completion comp;
xport p;
+ void *data;
int ret = -EBUSY, r;
xreq = xseg_get_request(xsegbd_dev->xseg, xsegbd_dev->src_portno,
xsegbd_dev->dst_portno, X_ALLOC);
spin_unlock(&xsegbd_dev->reqdatalock);
if (r < 0)
goto out_queue;
+ XSEGLOG("for req: %lx, set data %llu (lx: %lx)", xreq, blkreq_idx, (void *) blkreq_idx);
target = xseg_get_target(xsegbd_dev->xseg, xreq);
strncpy(target, xsegbd_dev->target, xsegbd_dev->targetlen);
*/
xseg_prepare_wait(xsegbd_dev->xseg, xsegbd_dev->src_portno);
- BUG_ON((p = xseg_submit(xsegbd_dev->xseg, xreq,
- xsegbd_dev->src_portno, X_ALLOC)) == NoPort);
+ p = xseg_submit(xsegbd_dev->xseg, xreq,
+ xsegbd_dev->src_portno, X_ALLOC);
+ BUG_ON(p == NoPort);
+ if ( p == NoPort) {
+ goto out_data;
+ }
WARN_ON(xseg_signal(xsegbd_dev->xseg, p) < 0);
wait_for_completion_interruptible(&comp);
BUG_ON(xseg_put_request(xsegbd_dev->xseg, xreq, xsegbd_dev->src_portno) < 0);
return ret;
+out_data:
+ spin_lock(&xsegbd_dev->reqdatalock);
+ r = xseg_get_req_data(xsegbd_dev->xseg, xreq, &data);
+ spin_unlock(&xsegbd_dev->reqdatalock);
out_queue:
xq_append_head(&xsegbd_dev->blk_queue_pending, blkreq_idx, 1);
spin_lock(&xsegbd_dev->reqdatalock);
err = xseg_get_req_data(xsegbd_dev->xseg, xreq, &data);
spin_unlock(&xsegbd_dev->reqdatalock);
+ XSEGLOG("for req: %lx, got data %llu (lx %lx)", xreq, (xqindex) data, data);
if (err < 0) {
WARN_ON(2);
//maybe put request?
int major;
sector_t sectors;
uint64_t segsize;
- uint32_t src_portno, dst_portno, nr_requests;
+ xport src_portno, dst_portno;
+ uint32_t nr_requests;
struct xq blk_queue_pending;
struct xsegbd *xsegbd;
struct xsegbd_pending *blk_req_pending;
rq = xseg_get_queue(xseg, port, request_queue);
pq = xseg_get_queue(xseg, port, reply_queue);
fprintf(stderr, "port %u:\n"
- " requests: %llu/%llu src gw: %lu dst gw: %lu\n"
+ " requests: %llu/%llu src gw: %u dst gw: %u\n"
" free_queue [%p] count : %u\n"
" request_queue [%p] count : %u\n"
" reply_queue [%p] count : %u\n",
#include <linux/vmalloc.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
-
+#include <sys/util.h>
#include "segdev.h"
static struct segdev segdev;
/* vmalloc can handle large sizes */
ret = -ENOMEM;
+ XSEGLOG("creating segment of size %llu\n", segsize);
segment = vmalloc(segsize);
if (!segment)
goto out_unlock;
make -C xhash all
make -C xheap all
make -C xobj all
- make -C python all
COMMA=,
_initialize.c: drivers
xops = &type->ops;
cfg->name[XSEG_NAMESIZE-1] = 0;
+ XSEGLOG("creating segment of size %llu\n", size);
r = xops->allocate(cfg->name, size);
if (r) {
XSEGLOG("cannot allocate segment!\n");
struct xseg_port *port;
/* discover next and current ports */
- if (!__validate_port(xseg, xreq->src_transit_portno))
+ if (!__validate_port(xseg, xreq->src_transit_portno)){
+ XSEGLOG("couldn't validate src_transit_portno");
return NoPort;
+ }
next = xseg->src_gw[xreq->src_transit_portno];
if (next != xreq->src_portno) {
cur = xreq->src_transit_portno;
goto submit;
}
- if (!__validate_port(xseg, xreq->dst_transit_portno))
+ if (!__validate_port(xseg, xreq->dst_transit_portno)){
+ XSEGLOG("couldn't validate dst_transit_portno");
return NoPort;
+ }
next = xseg->dst_gw[xreq->dst_transit_portno];
if (xreq->dst_transit_portno == xreq->dst_portno)
cur = xreq->src_transit_portno;
submit:
port = xseg_get_port(xseg, next);
- if (!port)
- goto out;
+ if (!port){
+ XSEGLOG("couldnt get port (next :%u)", next);
+ return NoPort;
+ }
__update_timestamp(xreq);
/* add current port to path */
serial = __xq_append_head(&xreq->path, cur);
if (serial == Noneidx){
+ XSEGLOG("couldn't append path head");
return NoPort;
}
serial = __xq_append_tail(q, xqi);
if (flags & X_ALLOC && serial == Noneidx) {
/* double up queue size */
+ XSEGLOG("trying to double up queue");
newq = __alloc_queue(xseg, xq_size(q)*2);
if (!newq)
goto out_rel;
out_rel:
xlock_release(&port->rq_lock);
- if (serial == Noneidx)
+ if (serial == Noneidx){
+ XSEGLOG("couldn't append request to queue");
__xq_pop_head(&xreq->path);
+ next = NoPort;
+ }
out:
return next;
int xseg_get_req_data(struct xseg *xseg, struct xseg_request *xreq, void **data)
{
- int r;
+ int r1, r;
ul_t val;
xhash_t *req_data = xseg->priv->req_data;
- r = xhash_lookup(req_data, (ul_t) xreq, &val);
+ r1 = xhash_lookup(req_data, (ul_t) xreq, &val);
*data = (void *) val;
- if (r >= 0) {
+ XSEGLOG("xhash_lookup returned r: %d", r1);
+ if (r1 >= 0) {
// delete or update to NULL ?
r = xhash_delete(req_data, (ul_t) xreq);
+ XSEGLOG("xhash_delete returned r: %d", r);
if (r == -XHASH_ERESIZE) {
req_data = xhash_resize(req_data, shrink_size_shift(req_data), NULL);
if (req_data){
xseg->priv->req_data = req_data;
r = xhash_delete(req_data, (ul_t) xreq);
+ XSEGLOG("xhash_delete2 returned r: %d", r);
}
}
}
- return r;
+ return r1;
}
/*
ul_t size_shift = xhash->size_shift;
ul_t size = (ul_t)1<<size_shift;
ul_t u = xhash->used;
- return (4*u < size && size_shift >= xhash->minsize_shift) ? true : false;
+ return (4*u < size && size_shift > xhash->minsize_shift) ? true : false;
}
uint32_t alignment_unit = heap->alignment_unit;
bytes = __get_alloc_bytes(heap, bytes) - sizeof(struct xheap_header);
- if (bytes < (1<<alignment_unit + SMALL_LIMIT))
+ if (bytes < (1<<(alignment_unit + SMALL_LIMIT)))
r = bytes >> alignment_unit;
else if (bytes < 1 << (alignment_unit + MEDIUM_LIMIT)) {
r = 1 << SMALL_LIMIT;
r += bytes >> (alignment_unit + MEDIUM_AL_UNIT);
}
else {
- r = 1 << SMALL_LIMIT + 1 << MEDIUM_LIMIT;
+ r = (1 << SMALL_LIMIT) + (1 << MEDIUM_LIMIT);
r -= 1 << (SMALL_LIMIT - MEDIUM_AL_UNIT);
r -= 1 << (MEDIUM_LIMIT - (LARGE_AL_UNIT - MEDIUM_AL_UNIT));
r += bytes >> (alignment_unit + MEDIUM_AL_UNIT);
#include <xtypes/xpool.h>
-//#include <xpool.h>
-//#include <xseg/xseg.h>
-
static inline int __validate_idx(struct xpool *xp, xpool_index idx)
{
xlock_release(&xp->lock);
return ret;
}
+
+
+#ifdef __KERNEL__
+#include <linux/module.h>
+#include <xtypes/xpool_exports.h>
+#endif
#include <sys/util.h>
#include <xtypes/xlock.h>
-//#include <xseg/xseg.h>
typedef uint64_t xpool_index;
typedef uint64_t xpool_data;
--- /dev/null
+EXPORT_SYMBOL(xpool_init);
+EXPORT_SYMBOL(xpool_clear);
+EXPORT_SYMBOL(xpool_add);
+EXPORT_SYMBOL(xpool_remove);
+EXPORT_SYMBOL(xpool_peek);
+EXPORT_SYMBOL(xpool_peek_idx);
+EXPORT_SYMBOL(xpool_peek_and_fwd);
+EXPORT_SYMBOL(xpool_set_idx);
+
+EXPORT_SYMBOL(__xpool_clear);
+EXPORT_SYMBOL(__xpool_add);
+EXPORT_SYMBOL(__xpool_remove);
+EXPORT_SYMBOL(__xpool_peek);
+EXPORT_SYMBOL(__xpool_peek_idx);
+EXPORT_SYMBOL(__xpool_peek_and_fwd);
+EXPORT_SYMBOL(__xpool_set_idx);