Beispiel #1
0
static
unsigned int pscom_openib_rma_mem_register(pscom_con_t *con, pscom_rendezvous_data_t *rd)
{
	int err = 0;
	pscom_rendezvous_data_openib_t *openib_rd = get_req_data(rd);
	psoib_con_info_t *ci = con->arch.openib.mcon;
	psoib_rma_mreg_t *mreg = &openib_rd->rma_req.mreg;

	if (rd->msg.data_len > IB_MAX_RDMA_MSG_SIZE) goto err_size;

#ifdef IB_RNDV_USE_PADDING
#ifdef   IB_RNDV_RDMA_WRITE
#error   IB_RNDV_USE_PADDING and IB_RNDV_RDMA_WRITE are mutually exclusive!
#endif

	rd->msg.arch.openib.padding_size = (IB_RNDV_PADDING_SIZE - ((long long int)rd->msg.data) % IB_RNDV_PADDING_SIZE) % IB_RNDV_PADDING_SIZE;

	memcpy(rd->msg.arch.openib.padding_data, rd->msg.data, rd->msg.arch.openib.padding_size);

	/* get mem region */
	perf_add("openib_acquire_rma_mreg");
	err = psoib_acquire_rma_mreg(mreg, rd->msg.data + rd->msg.arch.openib.padding_size, rd->msg.data_len - rd->msg.arch.openib.padding_size, ci);
	assert(!err);

	if (err) goto err_get_region;

	rd->msg.arch.openib.mr_key  = mreg->mem_info.mr->rkey;
	rd->msg.arch.openib.mr_addr = (uint64_t)mreg->mem_info.ptr;

	return sizeof(rd->msg.arch.openib) - sizeof(rd->msg.arch.openib.padding_data) + rd->msg.arch.openib.padding_size;
#else

	/* get mem region */
	perf_add("openib_acquire_rma_mreg2");
	err = psoib_acquire_rma_mreg(mreg, rd->msg.data, rd->msg.data_len, ci);
	assert(!err);

	if (err) goto err_get_region;

	rd->msg.arch.openib.mr_key  = mreg->mem_info.mr->rkey;
	rd->msg.arch.openib.mr_addr = (uint64_t)mreg->mem_info.ptr;

	return sizeof(rd->msg.arch.openib) - sizeof(rd->msg.arch.openib.padding_data);
#endif

err_get_region:
err_size:
	// ToDo: Handle Errors!
	return 0;
}
Beispiel #2
0
static
int pscom_openib_rma_read(pscom_req_t *rendezvous_req, pscom_rendezvous_data_t *rd)
{
	int err, ret;
	pscom_rendezvous_data_openib_t *psopenib_rd = get_req_data(rd);
	psoib_rma_req_t *dreq = &psopenib_rd->rma_req;
	pscom_con_t *con = get_con(rendezvous_req->pub.connection);
	psoib_con_info_t *ci = con->arch.openib.mcon;

	perf_add("openib_rma_read");
#ifdef IB_RNDV_USE_PADDING
	memcpy(rendezvous_req->pub.data, rd->msg.arch.openib.padding_data, rd->msg.arch.openib.padding_size);
	rendezvous_req->pub.data += rd->msg.arch.openib.padding_size;
	rendezvous_req->pub.data_len -= rd->msg.arch.openib.padding_size;
#endif

	err = psoib_acquire_rma_mreg(&dreq->mreg, rendezvous_req->pub.data, rendezvous_req->pub.data_len, ci);
	assert(!err); // ToDo: Catch error

	dreq->remote_addr = rd->msg.arch.openib.mr_addr;
	dreq->remote_key  = rd->msg.arch.openib.mr_key;
	dreq->data_len = rendezvous_req->pub.data_len;
	dreq->ci = ci;
	dreq->io_done = pscom_openib_rma_read_io_done;
	dreq->priv = psopenib_rd;

	psopenib_rd->rendezvous_req = rendezvous_req;

	err = psoib_post_rma_get(dreq);
	assert(!err); // ToDo: Catch error

	return 0;
}
Beispiel #3
0
static
void pscom_openib_do_write(pscom_con_t *con)
{
	size_t len;
	struct iovec iov[2];
	pscom_req_t *req;

	req = pscom_write_get_iov(con, iov);

	if (req) {
		psoib_con_info_t *mcon = con->arch.openib.mcon;
		len = iov[0].iov_len + iov[1].iov_len;

		perf_add("openib_sendv");
		ssize_t rlen = psoib_sendv(mcon, iov, len);

		if (rlen >= 0) {
			pscom_write_done(con, req, rlen);
			pscom_check_cq_poll();
		} else if ((rlen == -EINTR) || (rlen == -EAGAIN)) {
			// Busy: Maybe out of tokens? try to read more tokens:
			_pscom_openib_do_read(con, mcon);
		} else {
			// Error
			pscom_con_error(con, PSCOM_OP_WRITE, PSCOM_ERR_STDERROR);
		}
	}
}
Beispiel #4
0
static
void pscom_openib_rma_mem_deregister(pscom_con_t *con, pscom_rendezvous_data_t *rd)
{
	pscom_rendezvous_data_openib_t *openib_rd = get_req_data(rd);
	psoib_rma_mreg_t *mreg = &openib_rd->rma_req.mreg;

	perf_add("openib_release_rma_mreg");
	psoib_release_rma_mreg(mreg);
}
Beispiel #5
0
static
int pscom_openib_rma_write(pscom_con_t *con, void *src, pscom_rendezvous_msg_t *des,
			   void (*io_done)(void *priv), void *priv)
{
	pscom_rendezvous_data_t *rd_data = (pscom_rendezvous_data_t *)pscom_malloc(sizeof(*rd_data));
	pscom_rendezvous_data_openib_t *rd_data_openib = get_req_data(rd_data);
	psoib_con_info_t *mcon = con->arch.openib.mcon;

	psoib_rma_req_t *dreq = &rd_data_openib->rma_req;
	size_t len;
	int err;

	rd_data->msg.id = (void*)42;
	rd_data->msg.data = src;
	rd_data->msg.data_len = des->data_len;

	len = pscom_openib_rma_mem_register(con, rd_data);
	assert(len); // ToDo: Catch error
/*
	dreq->mreg.mem_info.ptr = xxx;
	dreq->mreg.size = xxx;
	dreq->mreg.mem_ingo.mr->lkey = xxx;
*/
	perf_add("openib_rma_write");

	dreq->remote_addr = des->arch.openib.mr_addr;
	dreq->remote_key  = des->arch.openib.mr_key;
	dreq->data_len = des->data_len;
	dreq->ci = mcon;
	dreq->io_done = pscom_openib_rma_write_io_done;
	dreq->priv = rd_data;

	rd_data_openib->con = con;
	rd_data_openib->io_done = io_done;
	rd_data_openib->priv = priv;

	err = psoib_post_rma_put(dreq);
	assert(!err); // ToDo: Catch error
	rd_data = NULL; /* Do not use rd_data after psoib_post_rma_put()!
			   io_done might already be called and freed rd_data. */

	return 0;
}
Beispiel #6
0
static
int _pscom_openib_do_read(pscom_con_t *con, psoib_con_info_t *mcon)
{
	void *buf;
	ssize_t size;

	size = psoib_recvlook(mcon, &buf);

	if (size >= 0) {
		perf_add("openib_do_read");
		pscom_read_done(con, buf, size);

		psoib_recvdone(mcon);
		return 1;
	} else if ((size == -EINTR) || (size == -EAGAIN)) {
		// Nothing received
		return 0;
	} else {
		// Error
		errno = -size;
		pscom_con_error(con, PSCOM_OP_READ, PSCOM_ERR_STDERROR);
		return 1;
	}
}
Beispiel #7
0
gboolean mouse_clicked(GtkWidget *widget, GdkEventButton *event)
{
	// Handle click event on canvas
	
	int index;
	double coordx, coordy;
	select_t *select = NULL;
	// Length from click location to nearest dot


	mouse_discarded = 0;
	if (event->button == 8)
	{
		// back button
		if (event->state == GDK_SHIFT_MASK)
			set_prev_count();
		else if (event->state == GDK_CONTROL_MASK)
			set_first();
		else
			set_prev();
		fldstate.mouse_clicked = 0x0;
	}
	else if (event->button == 9)
	{
		// forward button
		if (event->state == GDK_SHIFT_MASK)
			set_next_count();
		else if (event->state == GDK_CONTROL_MASK)
			set_last();
		else
			set_next();
		fldstate.mouse_clicked = 0x0;
	}
	else if (event->button == 1)
	{
		fldstate.mouse_clicked = 0x1;
		mouse_clickx = event->x;
		mouse_clicky = event->y;
		pixel_to_field(&mouse_clickx, &mouse_clicky);
		fldstate.mouse_clickx = mouse_clickx;
		fldstate.mouse_clicky = mouse_clicky;
		switch(mouse_currentMode)
		{
			case SELECTONE:
				// select 1 performer
				select = field_get_in_area(mouse_clickx, mouse_clicky);
				if (event->state == GDK_CONTROL_MASK)
				{
					// ctrl-click
					select_toggle_multiple(pstate.select, select);
				}
				else if ((event->state & ~GDK_SHIFT_MASK)== 0)
				{
					// regular click
					if (select_empty(select))
					{
						//select_dots_discard();
						select_clear(pstate.select);
						mouse_discarded = 1;
						break;
					}
					index = select_get_form(select);
					if (!select_form_empty(select) && !select_check_form(pstate.select, index))
					{
						// select form with ability to scale form
						select_clear(pstate.select);
						mouse_discarded = 1;
						select_add_form(pstate.select, select_get_form(select));
						select_update_center(pstate.select);
					}
					else if (select_form_empty(select) && isSelected(select_get_dot(select)) != 1) 
					{
						// dot is not selected
						select_clear(pstate.select);
						mouse_discarded = 1;
						if ((index = select_get_dot(select))!= -1)
						{
							select_add_dot(pstate.select, index);
						}
					}
					else
					{
						// hold click; dots being moved
						fldstate.mouse_clicked |= 0x2;
					}
				}
				dr_canvas_refresh(drill);
				break;
			case ADDPERF:
				// Add performers by clicking on canvas
				coordx = event->x;
				coordy = event->y;
				pixel_to_field(&coordx, &coordy);
				index = perf_add();
				//coords_set_coord(pshow, index, coordx, coordy);
				coords_set(pshow->sets->currset->coords[index], coordx, coordy);
				dr_canvas_refresh(drill);
				break;
			case ADDFORM:
				break;
		}
	}
	else
		fldstate.mouse_clicked = 0;
	return TRUE;
}
Beispiel #8
0
int
main(int argc, char **argv)
{
    krb5_context context;
    krb5_error_code ret;
    int optidx = 0;

    setprogname(argv[0]);

    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
	usage(1);

    if (help_flag)
	usage (0);

    if(version_flag){
	print_version(NULL);
	exit(0);
    }

    argc -= optidx;
    argv += optidx;

    if (argc != 0)
	errx(1, "argc != 0");

    ret = krb5_init_context(&context);
    if (ret)
	errx (1, "krb5_init_context failed: %d", ret);

    if (perf_str) {
	krb5_keytab id;

	ret = krb5_kt_resolve(context, perf_str, &id);
	if (ret)
	    krb5_err(context, 1, ret, "krb5_kt_resolve: %s", perf_str);

	/* add, find, delete on keytab */
	perf_add(context, id, times);
	perf_find(context, id, times);
	perf_delete(context, id, 0, times);

	/* add and find again on used keytab */
	perf_add(context, id, times);
	perf_find(context, id, times);

	ret = krb5_kt_destroy(context, id);
	if (ret)
	    krb5_err(context, 1, ret, "krb5_kt_destroy: %s", perf_str);

	ret = krb5_kt_resolve(context, perf_str, &id);
	if (ret)
	    krb5_err(context, 1, ret, "krb5_kt_resolve: %s", perf_str);

	/* try delete backwards */
#if 0
	perf_add(context, id, times);
	perf_delete(context, id, 1, times);
#endif

	ret = krb5_kt_destroy(context, id);
	if (ret)
	    krb5_err(context, 1, ret, "krb5_kt_destroy");

    } else {

	test_empty_keytab(context, "MEMORY:foo");
	test_empty_keytab(context, "FILE:foo");

	test_memory_keytab(context, "MEMORY:foo", "MEMORY:foo2");

    }

    krb5_free_context(context);

    return 0;
}