Skip to content

Commit

Permalink
[infiniband] Remove the return status code from MAD handlers
Browse files Browse the repository at this point in the history
MAD handlers have to set the status fields within the MAD itself
anyway, in order to provide a meaningful response MAD; the additional
gPXE return status code is just noise.

Note that we probably don't need to ever explicitly set the status to
IB_MGMT_STATUS_OK, since it should already have this value from the
request.  (By not explicitly setting the status in this way, we can
safely have ib_sma_set_xxx() call ib_sma_get_xxx() in order to
generate the GetResponse MAD without worrying that ib_sma_get_xxx()
will clear any error status set by ib_sma_set_xxx().)
  • Loading branch information
Michael Brown committed Jul 17, 2009
1 parent f1d92fa commit 94876f4
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 69 deletions.
3 changes: 1 addition & 2 deletions src/include/gpxe/ib_gma.h
Expand Up @@ -34,13 +34,12 @@ struct ib_gma_handler {
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*
* The handler should modify the MAD as applicable. If the
* handler returns with a non-zero value in the MAD's @c
* method field, it will be sent as a response.
*/
int ( * handle ) ( struct ib_gma *gma, union ib_mad *mad );
void ( * handle ) ( struct ib_gma *gma, union ib_mad *mad );
};

/** GMA attribute handlers */
Expand Down
72 changes: 25 additions & 47 deletions src/net/infiniband/ib_gma.c
Expand Up @@ -86,10 +86,9 @@ static unsigned int next_request_tid;
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_get_node_info ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_get_node_info ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_node_info *node_info = &mad->smp.smp_data.node_info;

Expand All @@ -104,19 +103,16 @@ static int ib_sma_get_node_info ( struct ib_gma *gma,
sizeof ( node_info->port_guid ) );
node_info->partition_cap = htons ( 1 );
node_info->local_port_num = ibdev->port;

return 0;
}

/**
* Get node description
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_get_node_desc ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_get_node_desc ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_node_desc *node_desc = &mad->smp.smp_data.node_desc;
struct ib_gid_half *guid = &ibdev->gid.u.half[1];
Expand All @@ -127,38 +123,32 @@ static int ib_sma_get_node_desc ( struct ib_gma *gma,
guid->bytes[0], guid->bytes[1], guid->bytes[2],
guid->bytes[3], guid->bytes[4], guid->bytes[5],
guid->bytes[6], guid->bytes[7], ibdev->dev->name );

return 0;
}

/**
* Get GUID information
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_get_guid_info ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_get_guid_info ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_guid_info *guid_info = &mad->smp.smp_data.guid_info;

memset ( guid_info, 0, sizeof ( *guid_info ) );
memcpy ( guid_info->guid[0], &ibdev->gid.u.half[1],
sizeof ( guid_info->guid[0] ) );

return 0;
}

/**
* Get port information
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_get_port_info ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_get_port_info ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_port_info *port_info = &mad->smp.smp_data.port_info;

Expand All @@ -184,19 +174,16 @@ static int ib_sma_get_port_info ( struct ib_gma *gma,
port_info->init_type_reply__mtu_cap = IB_MTU_2048;
port_info->operational_vls__enforcement = ( IB_VL_0 << 4 );
port_info->guid_cap = 1;

return 0;
}

/**
* Set port information
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_set_port_info ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_set_port_info ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
const struct ib_port_info *port_info = &mad->smp.smp_data.port_info;
int rc;
Expand All @@ -214,42 +201,38 @@ static int ib_sma_set_port_info ( struct ib_gma *gma,
htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR );
}

return ib_sma_get_port_info ( gma, mad );
ib_sma_get_port_info ( gma, mad );
}

/**
* Get partition key table
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_get_pkey_table ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_get_pkey_table ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table;

memset ( pkey_table, 0, sizeof ( *pkey_table ) );
pkey_table->pkey[0] = htons ( ibdev->pkey );

return 0;
}

/**
* Set partition key table
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_sma_set_pkey_table ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_sma_set_pkey_table ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table;

ibdev->pkey = ntohs ( pkey_table->pkey[0] );

return ib_sma_get_pkey_table ( gma, mad );
ib_sma_get_pkey_table ( gma, mad );
}

/** List of attribute handlers */
Expand Down Expand Up @@ -331,9 +314,8 @@ struct ib_gma_handler ib_sma_handlers[] __ib_gma_handler = {
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_handle_mad ( struct ib_gma *gma, union ib_mad *mad ) {
static void ib_handle_mad ( struct ib_gma *gma, union ib_mad *mad ) {
struct ib_mad_hdr *hdr = &mad->hdr;
struct ib_gma_handler *handler;

Expand All @@ -344,13 +326,13 @@ static int ib_handle_mad ( struct ib_gma *gma, union ib_mad *mad ) {
( handler->method == hdr->method ) &&
( handler->attr_id == hdr->attr_id ) ) {
hdr->method = handler->resp_method;
return handler->handle ( gma, mad );
handler->handle ( gma, mad );
return;
}
}

hdr->method = IB_MGMT_METHOD_TRAP;
hdr->status = htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR );
return -ENOTSUP;
}

/**
Expand Down Expand Up @@ -412,21 +394,17 @@ static void ib_gma_complete_recv ( struct ib_device *ibdev,
}
}

/* Handle MAD, if possible */
if ( ( rc = ib_handle_mad ( gma, mad ) ) != 0 ) {
DBGC ( gma, "GMA %p could not handle TID %08x%08x: %s\n",
gma, ntohl ( hdr->tid[0] ), ntohl ( hdr->tid[1] ),
strerror ( rc ) );
/* Do not abort; we may want to send an error response */
}
/* Handle MAD */
ib_handle_mad ( gma, mad );

/* Finish processing if we have no response to send */
if ( ! hdr->method )
goto out;

DBGC ( gma, "GMA %p TX TID %08x%08x (%02x,%02x,%02x,%04x)\n", gma,
ntohl ( hdr->tid[0] ), ntohl ( hdr->tid[1] ), hdr->mgmt_class,
hdr->class_version, hdr->method, ntohs ( hdr->attr_id ) );
DBGC ( gma, "GMA %p TX TID %08x%08x (%02x,%02x,%02x,%04x) status "
"%04x\n", gma, ntohl ( hdr->tid[0] ), ntohl ( hdr->tid[1] ),
hdr->mgmt_class, hdr->class_version, hdr->method,
ntohs ( hdr->attr_id ), ntohs ( hdr->status ) );
DBGC2_HDA ( gma, 0, mad, sizeof ( *mad ) );

/* Set response fields for directed route SMPs */
Expand Down
22 changes: 8 additions & 14 deletions src/net/infiniband/ib_mcast.c
Expand Up @@ -139,10 +139,9 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp,
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_handle_mc_member_join ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_handle_mc_member_join ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_mc_member_record *mc_member_record =
&mad->sa.sa_data.mc_member_record;
Expand All @@ -155,7 +154,7 @@ static int ib_handle_mc_member_join ( struct ib_gma *gma,
if ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ) {
DBGC ( gma, "GMA %p join failed with status %04x\n",
gma, ntohs ( mad->hdr.status ) );
return -EINVAL;
return;
}

/* Extract MAD parameters */
Expand All @@ -170,7 +169,7 @@ static int ib_handle_mc_member_join ( struct ib_gma *gma,
ntohl ( gid->u.dwords[1] ),
ntohl ( gid->u.dwords[2] ),
ntohl ( gid->u.dwords[3] ) );
return -ENOENT;
return;
}
DBGC ( gma, "GMA %p QPN %lx joined %08x:%08x:%08x:%08x qkey %lx\n",
gma, qp->qpn, ntohl ( gid->u.dwords[0] ),
Expand All @@ -181,21 +180,18 @@ static int ib_handle_mc_member_join ( struct ib_gma *gma,
if ( ( rc = ib_modify_qp ( ibdev, qp, IB_MODIFY_QKEY, qkey ) ) != 0 ) {
DBGC ( gma, "GMA %p QPN %lx could not modify qkey: %s\n",
gma, qp->qpn, strerror ( rc ) );
return rc;
return;
}

return 0;
}

/**
* Handle multicast membership record leave response
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_handle_mc_member_leave ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_handle_mc_member_leave ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_mc_member_record *mc_member_record =
&mad->sa.sa_data.mc_member_record;
struct ib_gid *gid;
Expand All @@ -204,16 +200,14 @@ static int ib_handle_mc_member_leave ( struct ib_gma *gma,
if ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ) {
DBGC ( gma, "GMA %p leave failed with status %04x\n",
gma, ntohs ( mad->hdr.status ) );
return -EINVAL;
return;
}

/* Extract MAD parameters */
gid = &mc_member_record->mgid;
DBGC ( gma, "GMA %p left %08x:%08x:%08x:%08x\n", gma,
ntohl ( gid->u.dwords[0] ), ntohl ( gid->u.dwords[1] ),
ntohl ( gid->u.dwords[2] ), ntohl ( gid->u.dwords[3] ) );

return 0;
}

/** Multicast membership record response handler */
Expand Down
9 changes: 3 additions & 6 deletions src/net/infiniband/ib_pathrec.c
Expand Up @@ -170,10 +170,9 @@ int ib_resolve_path ( struct ib_device *ibdev,
*
* @v gma General management agent
* @v mad MAD
* @ret rc Return status code
*/
static int ib_handle_path_record ( struct ib_gma *gma,
union ib_mad *mad ) {
static void ib_handle_path_record ( struct ib_gma *gma,
union ib_mad *mad ) {
struct ib_device *ibdev = gma->ibdev;
struct ib_path_record *path_record = &mad->sa.sa_data.path_record;
struct ib_gid *dgid = &path_record->dgid;
Expand All @@ -186,7 +185,7 @@ static int ib_handle_path_record ( struct ib_gma *gma,
if ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ) {
DBGC ( gma, "GMA %p path record lookup failed with status "
"%04x\n", gma, ntohs ( mad->hdr.status ) );
return -EINVAL;
return;
}

/* Extract values from MAD */
Expand All @@ -209,8 +208,6 @@ static int ib_handle_path_record ( struct ib_gma *gma,
cached->rate = rate;
cached->sl = sl;
}

return 0;
}

/** Path record response handler */
Expand Down

0 comments on commit 94876f4

Please sign in to comment.