[openib-general] [PATCH 2/2] ib_local_sa: use SA iterator routines to walk RMPP response
Sean Hefty
sean.hefty at intel.com
Mon Aug 21 17:20:21 PDT 2006
Convert local SA to use the new SA iterator routines for walking a
list of attributes in an RMPP response returned by the SA. This
replaces a local SA specific implementation.
Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
--- infiniband/core/local_sa.c 2006-08-21 16:40:23.760246472 -0700
+++ infiniband.user/core/local_sa.c 2006-08-21 16:48:28.403569488 -0700
@@ -107,16 +107,6 @@ struct sa_db_device {
struct sa_db_port port[0];
};
-/* Define path record format to enable needed checks against MAD data. */
-struct ib_path_rec {
- u8 reserved[8];
- u8 dgid[16];
- u8 sgid[16];
- __be16 dlid;
- __be16 slid;
- u8 reserved2[20];
-};
-
struct ib_sa_cursor {
struct ib_sa_cursor *next;
};
@@ -194,60 +184,29 @@ static int insert_attr(struct index_root
static void update_path_rec(struct sa_db_port *port,
struct ib_mad_recv_wc *mad_recv_wc)
{
- struct ib_mad_recv_buf *recv_buf;
- struct ib_sa_mad *mad = (void *) mad_recv_wc->recv_buf.mad;
+ struct ib_sa_iter *iter;
struct ib_path_rec_info *path_info;
- struct ib_path_rec ib_path, *path = NULL;
- int i, attr_size, left, offset = 0;
+ void *attr;
- attr_size = be16_to_cpu(mad->sa_hdr.attr_offset) * 8;
- if (attr_size < sizeof ib_path)
+ iter = ib_sa_iter_create(mad_recv_wc);
+ if (IS_ERR(iter))
return;
down_write(&lock);
port->update++;
- list_for_each_entry(recv_buf, &mad_recv_wc->rmpp_list, list) {
- for (i = 0; i < IB_MGMT_SA_DATA;) {
- mad = (struct ib_sa_mad *) recv_buf->mad;
-
- left = IB_MGMT_SA_DATA - i;
- if (left < sizeof ib_path) {
- /* copy first piece of the attribute */
- memcpy(&ib_path, &mad->data[i], left);
- path = &ib_path;
- offset = left;
- break;
- } else if (offset) {
- /* copy the second piece of the attribute */
- memcpy((void*) path + offset, &mad->data[i],
- sizeof ib_path - offset);
- i += attr_size - offset;
- offset = 0;
- } else {
- path = (void *) &mad->data[i];
- i += attr_size;
- }
-
- if (!path->slid)
- goto unlock;
-
- path_info = kmalloc(sizeof *path_info, GFP_KERNEL);
- if (!path_info)
- goto unlock;
-
- ib_sa_unpack_attr(&path_info->rec, path,
- IB_SA_ATTR_PATH_REC);
-
- if (insert_attr(&port->index, port->update,
- path_info->rec.dgid.raw,
- &path_info->cursor)) {
- kfree(path_info);
- goto unlock;
- }
+ while ((attr = ib_sa_iter_next(iter)) &&
+ (path_info = kmalloc(sizeof *path_info, GFP_KERNEL))) {
+
+ ib_sa_unpack_attr(&path_info->rec, attr, IB_SA_ATTR_PATH_REC);
+ if (insert_attr(&port->index, port->update,
+ path_info->rec.dgid.raw,
+ &path_info->cursor)) {
+ kfree(path_info);
+ break;
}
}
-unlock:
up_write(&lock);
+ ib_sa_iter_free(iter);
}
static void recv_handler(struct ib_mad_agent *mad_agent,
More information about the general
mailing list