Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 177093
b: refs/heads/master
c: a7ca1f0
h: refs/heads/master
i:
  177091: 9fcf08a
v: v3
  • Loading branch information
Sean Hefty authored and Roland Dreier committed Nov 16, 2009
1 parent 8f96fe4 commit 479ffd5
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c597b0240b686427248b6d4fc8adbe22f9a04c11
refs/heads/master: a7ca1f00ed2921b804d7ebda0f6fca8c9078fa42
6 changes: 6 additions & 0 deletions trunk/drivers/infiniband/core/sa_query.c
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,12 @@ static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask)
return ret ? ret : id;
}

void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec)
{
ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), attribute, rec);
}
EXPORT_SYMBOL(ib_sa_unpack_path);

static void ib_sa_path_rec_callback(struct ib_sa_query *sa_query,
int status,
struct ib_sa_mad *mad)
Expand Down
49 changes: 49 additions & 0 deletions trunk/drivers/infiniband/core/ucma.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include <rdma/rdma_user_cm.h>
#include <rdma/ib_marshall.h>
#include <rdma/rdma_cm.h>
#include <rdma/rdma_cm_ib.h>

MODULE_AUTHOR("Sean Hefty");
MODULE_DESCRIPTION("RDMA Userspace Connection Manager Access");
Expand Down Expand Up @@ -812,6 +813,51 @@ static int ucma_set_option_id(struct ucma_context *ctx, int optname,
return ret;
}

static int ucma_set_ib_path(struct ucma_context *ctx,
struct ib_path_rec_data *path_data, size_t optlen)
{
struct ib_sa_path_rec sa_path;
struct rdma_cm_event event;
int ret;

if (optlen % sizeof(*path_data))
return -EINVAL;

for (; optlen; optlen -= sizeof(*path_data), path_data++) {
if (path_data->flags == (IB_PATH_GMP | IB_PATH_PRIMARY |
IB_PATH_BIDIRECTIONAL))
break;
}

if (!optlen)
return -EINVAL;

ib_sa_unpack_path(path_data->path_rec, &sa_path);
ret = rdma_set_ib_paths(ctx->cm_id, &sa_path, 1);
if (ret)
return ret;

memset(&event, 0, sizeof event);
event.event = RDMA_CM_EVENT_ROUTE_RESOLVED;
return ucma_event_handler(ctx->cm_id, &event);
}

static int ucma_set_option_ib(struct ucma_context *ctx, int optname,
void *optval, size_t optlen)
{
int ret;

switch (optname) {
case RDMA_OPTION_IB_PATH:
ret = ucma_set_ib_path(ctx, optval, optlen);
break;
default:
ret = -ENOSYS;
}

return ret;
}

static int ucma_set_option_level(struct ucma_context *ctx, int level,
int optname, void *optval, size_t optlen)
{
Expand All @@ -821,6 +867,9 @@ static int ucma_set_option_level(struct ucma_context *ctx, int level,
case RDMA_OPTION_ID:
ret = ucma_set_option_id(ctx, optname, optval, optlen);
break;
case RDMA_OPTION_IB:
ret = ucma_set_option_ib(ctx, optname, optval, optlen);
break;
default:
ret = -ENOSYS;
}
Expand Down
14 changes: 4 additions & 10 deletions trunk/drivers/infiniband/hw/amso1100/c2_qp.c
Original file line number Diff line number Diff line change
Expand Up @@ -798,10 +798,8 @@ int c2_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
u8 actual_sge_count;
u32 msg_size;

if (qp->state > IB_QPS_RTS) {
err = -EINVAL;
goto out;
}
if (qp->state > IB_QPS_RTS)
return -EINVAL;

while (ib_wr) {

Expand Down Expand Up @@ -932,7 +930,6 @@ int c2_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
ib_wr = ib_wr->next;
}

out:
if (err)
*bad_wr = ib_wr;
return err;
Expand All @@ -947,10 +944,8 @@ int c2_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
unsigned long lock_flags;
int err = 0;

if (qp->state > IB_QPS_RTS) {
err = -EINVAL;
goto out;
}
if (qp->state > IB_QPS_RTS)
return -EINVAL;

/*
* Try and post each work request
Expand Down Expand Up @@ -1003,7 +998,6 @@ int c2_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
ib_wr = ib_wr->next;
}

out:
if (err)
*bad_wr = ib_wr;
return err;
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/rdma/ib_sa.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,4 +379,10 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
struct ib_sa_path_rec *rec,
struct ib_ah_attr *ah_attr);

/**
* ib_sa_unpack_path - Convert a path record from MAD format to struct
* ib_sa_path_rec.
*/
void ib_sa_unpack_path(void *attribute, struct ib_sa_path_rec *rec);

#endif /* IB_SA_H */
16 changes: 16 additions & 0 deletions trunk/include/rdma/ib_user_sa.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,22 @@

#include <linux/types.h>

enum {
IB_PATH_GMP = 1,
IB_PATH_PRIMARY = (1<<1),
IB_PATH_ALTERNATE = (1<<2),
IB_PATH_OUTBOUND = (1<<3),
IB_PATH_INBOUND = (1<<4),
IB_PATH_INBOUND_REVERSE = (1<<5),
IB_PATH_BIDIRECTIONAL = IB_PATH_OUTBOUND | IB_PATH_INBOUND_REVERSE
};

struct ib_path_rec_data {
__u32 flags;
__u32 reserved;
__u32 path_rec[16];
};

struct ib_user_path_rec {
__u8 dgid[16];
__u8 sgid[16];
Expand Down
6 changes: 4 additions & 2 deletions trunk/include/rdma/rdma_user_cm.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,14 @@ struct rdma_ucm_event_resp {

/* Option levels */
enum {
RDMA_OPTION_ID = 0
RDMA_OPTION_ID = 0,
RDMA_OPTION_IB = 1
};

/* Option details */
enum {
RDMA_OPTION_ID_TOS = 0
RDMA_OPTION_ID_TOS = 0,
RDMA_OPTION_IB_PATH = 1
};

struct rdma_ucm_set_option {
Expand Down

0 comments on commit 479ffd5

Please sign in to comment.