[openib-general] [PATCH 10/12] SRP: Changing ibsrpdm

Ishai Rabinovitz ishai at mellanox.co.il
Mon May 1 04:30:45 PDT 2006


Add a function send_and_get that handles the communication and retries.
Reduce redundancy.
Increment TID on retry.
Bound the number of retries.

Signed-off-by: Ishai Rabinovitz <ishai at mellanox.co.il>

Index: last_stable/src/userspace/srptools/src/srp-dm.c
===================================================================
--- last_stable.orig/src/userspace/srptools/src/srp-dm.c	2006-04-21 01:35:10.000000000 +0300
+++ last_stable/src/userspace/srptools/src/srp-dm.c	2006-04-21 01:41:28.000000000 +0300
@@ -85,6 +85,36 @@ static void usage(const char *argv0)
 	fprintf(stderr, "Usage: %s [-vc] [-d <umad device>]\n", argv0);
 }
 
+#define NUM_OF_RETRIES 3
+int send_and_get(int fd, struct ib_user_mad *out_mad,
+                struct ib_user_mad *in_mad, long in_mad_size)
+{
+       int i, len, in_mad_real_size;
+       struct srp_dm_mad *out_dm_mad;
+
+       in_mad_real_size = (in_mad_size ? in_mad_size : sizeof(struct ib_user_mad));
+       for (i = 0; i < NUM_OF_RETRIES; ++i)
+       {
+               len = write(fd, out_mad, sizeof(struct ib_user_mad));
+              if (len != sizeof(struct ib_user_mad)) {
+                       fprintf(stderr, "write: %s\n", strerror(errno));
+                       return -1;
+               }
+
+               len = read(fd, in_mad, in_mad_real_size);
+               if ((in_mad_size == 0 && len == in_mad_real_size) ||
+                   (in_mad_size != 0 && len > 0))
+                       return len;
+               else if (in_mad->hdr.status != ETIMEDOUT) {
+                       fprintf(stderr, "%s/%d: read: %s\n", __func__, __LINE__, strerror(errno));
+                       return -1;
+               }
+               out_dm_mad = (void *) out_mad->data;
+               ((uint32_t *) &out_dm_mad->tid)[1] = tid++;
+       }
+       return -1;
+}
+
 static int read_file(const char *dir, const char *file, char *buf, size_t size)
 {
 	char *path;
@@ -234,19 +264,8 @@ static int set_class_port_info(int fd, u
 		((uint16_t *) cpi->trap_gid)[i] = htons(strtol(val + i * 5, NULL, 16));
 	}
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
+	if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
 		return -1;
-	}
-
-	if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
-		if (in_mad.hdr.status == ETIMEDOUT)
-			goto again;
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
-		return -1;
-	}
 
 	in_dm_mad = (void *) in_mad.data;
 	if (in_dm_mad->status) {
@@ -266,19 +285,8 @@ static int get_iou_info(int fd, uint32_t
 
 	init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_IO_UNIT_INFO, 0);
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
-		return -1;
-	}
-
-	if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
-		if (in_mad.hdr.status == ETIMEDOUT)
-			goto again;
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
+	if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
 		return -1;
-	}
 
 	in_dm_mad = (void *) in_mad.data;
 	if (in_dm_mad->status) {
@@ -300,19 +308,8 @@ static int get_ioc_prof(int fd, uint32_t
 
 	init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_IO_CONTROLLER_PROFILE, ioc);
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
+	if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
 		return -1;
-	}
-
-	if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
-		if (in_mad.hdr.status == ETIMEDOUT)
-			goto again;
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
-		return -1;
-	}
 
 	if (in_mad.hdr.status != 0) {
 		fprintf(stderr, "IO Controller Profile query timed out\n");
@@ -340,19 +337,8 @@ static int get_svc_entries(int fd, uint3
 	init_srp_dm_mad(&out_mad, agent[1], dlid, SRP_DM_ATTR_SERVICE_ENTRIES,
 			(ioc << 16) | (end << 8) | start);
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
+	if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
 		return -1;
-	}
-
-	if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
-		if (in_mad.hdr.status == ETIMEDOUT)
-			goto again;
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
-		return -1;
-	}
 
 	if (in_mad.hdr.status != 0) {
 		fprintf(stderr, "Service Entries query timed out\n");
@@ -486,20 +472,8 @@ static int get_port_info(int fd, uint32_
 	port_info                 = (void *) out_sa_mad->data;
 	port_info->endport_lid	  = htons(dlid);
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
-		return -1;
-	}
-
-	if (read(fd, &in_mad, sizeof in_mad) != sizeof in_mad) {
-		if (in_mad.hdr.status == ETIMEDOUT)
-			goto again;
-
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
+	if (send_and_get(fd, &out_mad, &in_mad, 0) < 0)
 		return -1;
-	}
 
 	port_info = (void *) in_sa_mad->data;
 	*subnet_prefix = ntohll(port_info->subnet_prefix);
@@ -542,21 +516,8 @@ static int get_port_list(int fd, uint32_
 	node                      = (void *) out_sa_mad->data;
 	node->type		  = 1; /* CA */
 
-again:
-	if (write(fd, &out_mad, sizeof out_mad) != sizeof out_mad) {
-		perror("write");
+	if ((len = send_and_get(fd, &out_mad, in_mad, SIZE_OF_QUERY_RESPONSE)) < 0)
 		return -1;
-	}
-
-	len = read(fd, in_mad, SIZE_OF_QUERY_RESPONSE);
-	if (len < 0) {
-		fprintf(stderr, "%s/%d: ", __func__, __LINE__);
-		perror("read");
-		return -1;
-	}
-
-	if (in_mad->hdr.status == ETIMEDOUT)
-		goto again;
 
 	size = ntohs(in_sa_mad->attr_offset) * 8;
 
-- 
Ishai Rabinovitz



More information about the general mailing list