int ramster_remote_async_get(struct tmem_xhandle *xh, bool free, int remotenode, size_t expect_size, uint8_t expect_cksum, void *extra) { int ret = -1, status; struct r2nm_node *node = NULL; struct kvec vec[1]; size_t veclen = 1; u32 msg_type; node = r2nm_get_node_by_num(remotenode); if (node == NULL) goto out; xh->client_id = r2nm_this_node(); /* which node is getting */ xh->xh_data_cksum = expect_cksum; xh->xh_data_size = expect_size; xh->extra = extra; vec[0].iov_len = sizeof(*xh); vec[0].iov_base = xh; if (free) msg_type = RMSTR_TMEM_ASYNC_GET_AND_FREE_REQUEST; else msg_type = RMSTR_TMEM_ASYNC_GET_REQUEST; ret = r2net_send_message_vec(msg_type, RMSTR_KEY, vec, veclen, remotenode, &status); r2nm_node_put(node); if (ret < 0) { /* FIXME handle bad message possibilities here? */ pr_err("UNTESTED ret<0 in ramster_remote_async_get\n"); } ret = status; out: return ret; }
int ramster_remote_flush_object(struct tmem_xhandle *xh, int remotenode) { int ret = -1, status; struct r2nm_node *node = NULL; struct kvec vec[1]; size_t veclen = 1; node = r2nm_get_node_by_num(remotenode); BUG_ON(node == NULL); xh->client_id = r2nm_this_node(); /* which node is flobjing */ vec[0].iov_len = sizeof(*xh); vec[0].iov_base = xh; ret = r2net_send_message_vec(RMSTR_TMEM_FLOBJ, RMSTR_KEY, vec, veclen, remotenode, &status); r2nm_node_put(node); return ret; }
int ramster_remote_flush(struct tmem_xhandle *xh, int remotenode) { int ret = -1, status; struct r2nm_node *node = NULL; struct kvec vec[1]; size_t veclen = 1; node = r2nm_get_node_by_num(remotenode); BUG_ON(node == NULL); xh->client_id = r2nm_this_node(); /* */ vec[0].iov_len = sizeof(*xh); vec[0].iov_base = xh; BUG_ON(irqs_disabled()); BUG_ON(in_softirq()); ret = r2net_send_message_vec(RMSTR_TMEM_FLUSH, RMSTR_KEY, vec, veclen, remotenode, &status); r2nm_node_put(node); return ret; }
int ramster_remote_put(struct tmem_xhandle *xh, char *data, size_t size, bool ephemeral, int *remotenode) { int nodenum, ret = -1, status; struct r2nm_node *node = NULL; struct kvec vec[2]; size_t veclen = 2; u32 msg_type; #ifdef RAMSTER_TESTING struct r2net_node *nn; #endif BUG_ON(size > RMSTR_R2NET_MAX_LEN); xh->client_id = r2nm_this_node(); /* which node is putting */ vec[0].iov_len = sizeof(*xh); vec[0].iov_base = xh; vec[1].iov_len = size; vec[1].iov_base = data; node = r2net_target_node; if (!node) goto out; nodenum = r2net_target_nodenum; r2nm_node_get(node); #ifdef RAMSTER_TESTING nn = r2net_nn_from_num(nodenum); WARN_ON_ONCE(nn->nn_persistent_error || !nn->nn_sc_valid); #endif if (ephemeral) msg_type = RMSTR_TMEM_PUT_EPH; else msg_type = RMSTR_TMEM_PUT_PERS; #ifdef RAMSTER_TESTING /* leave me here to see if it catches a weird crash */ ramster_check_irq_counts(); #endif ret = r2net_send_message_vec(msg_type, RMSTR_KEY, vec, veclen, nodenum, &status); #ifdef RAMSTER_TESTING if (ret != 0) { static unsigned long cnt; cnt++; if (!(cnt&(cnt-1))) pr_err("ramster_remote_put: message failed, " "ret=%d, cnt=%lu\n", ret, cnt); ret = -1; } #endif if (ret < 0) ret = -1; else { ret = status; *remotenode = nodenum; } r2nm_node_put(node); out: return ret; }