[SSI] openssi/kernel/ipc msg.c, 1.12, 1.13 sem.c, 1.28, 1.29 shm.c, 1.23, 1.24
Roger Tsang <[email protected]>
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/ipc
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv14613/ipc
Modified Files:
Tag: OPENSSI-FC
msg.c sem.c shm.c
Log Message:
CFS:
- Fast path directory i_op->permission cfs_permission(); redundant since there is a recheck after token hold.
IPC:
- Fix [ ssic-linux-Bugs-2719607 ] memory leak in ipcname_gettotal() path; based on patch from John Hughes (hughesj).
Index: sem.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/sem.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- sem.c 19 Oct 2008 14:35:29 -0000 1.28
+++ sem.c 28 Mar 2009 23:44:16 -0000 1.29
@@ -146,7 +146,7 @@
ssi_procstate_t *, ics_userbuf_t *, ics_userbuf_t *);
extern int cli_ripc_semexit(clusternode_t, int *, ssi_procstate_t *, int,
pid_t);
-extern int cli_ipcname_gettotal(int, char **, int *);
+extern int cli_ipcname_gettotal(int, struct ssi_nodeid_pair **, int *);
extern int ssi_sem_get_sem_array(clusternode_t, int, char **);
extern clusternode_t name_server_node;
@@ -2119,7 +2119,9 @@
int i, len = 0;
#ifdef CONFIG_SSI
+ struct ssi_nodeid_pair *node_id_pairs = NULL;
int local_view = ssi_get_localview();
+ int id_count, size;
char viewstr[10];
#endif /* CONFIG_SSI */
@@ -2127,54 +2129,47 @@
down(&sem_ids.sem);
#ifdef CONFIG_SSI
- int id_count=0, ipc_id=0;
- char *node_id_pairs=NULL;
- char *tmp_pairs=NULL;
- int size=0, node_num=0;
- char *tsma=NULL;
-
bzero(viewstr, 10);
- if (!local_view)
- {
- size = -1;
- cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
- node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
- if (node_id_pairs == NULL)
- goto done;
- memset(node_id_pairs, 0, size * sizeof(int));
- cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
- tmp_pairs = (char *)node_id_pairs;
+ if (!local_view) {
+ size = 30; /* Random guess */
+ for (;;) {
+ int allocated = size;
+
+ node_id_pairs = kmalloc(size * sizeof(*node_id_pairs), GFP_KERNEL);
+ if (node_id_pairs == NULL)
+ goto done;
+
+ cli_ipcname_gettotal(NAME_SERVICE_SEM, &node_id_pairs, &size);
+ if (size <= allocated)
+ break;
+ kfree (node_id_pairs);
+ }
}
id_count = SEM_MAX_ID;
for(i = 0; i <= id_count; i++) {
struct sem_array *sma;
- sma = NULL;
+ int node_num;
+ key_t ipc_id;
- if (!local_view)
- {
- node_num = *((int *)tmp_pairs);
- tmp_pairs += sizeof(int);
- ipc_id = *((key_t *)tmp_pairs);
- tmp_pairs += sizeof(key_t);
- i++;
- if (node_num == CLUSTERNODE_INVAL)
+ if (!local_view) {
+ ipc_id = node_id_pairs[i].ipc_id;
+ node_num = node_id_pairs[i].node_num;
+
+ if (node_num == CLUSTERNODE_INVAL) {
node_num = -1;
- else if (node_num == this_node)
+ } else if (node_num == this_node) {
sma = sem_lock(ipc_id);
- else
- {
- tsma = (char *)kmalloc(sizeof(struct sem_array), GFP_KERNEL);
- if (tsma == NULL) break;
- memset(tsma, 0, sizeof(struct sem_array));
- ssi_sem_get_sem_array(node_num, ipc_id, &tsma);
- sma = (struct sem_array *)tsma;
+ } else {
+ sma = kzmalloc(sizeof(struct sem_array), GFP_KERNEL);
+ if (sma == NULL)
+ break;
+ (void) ssi_sem_get_sem_array(node_num, ipc_id, (char **) &sma);
}
- }
- else
- {
+ } else {
sma = sem_lock(i);
node_num = this_node;
+ ipc_id = 0; /* shut up compiler */
}
if(sma) {
len += sprintf(buffer + len, "%10d %10d %4o %10lu %5u %5u %5u %5u %10lu %10lu",
@@ -2210,6 +2205,7 @@
goto done;
}
}
+
#else
for(i = 0; i <= sem_ids.max_id; i++) {
struct sem_array *sma;
@@ -2240,6 +2236,9 @@
*eof = 1;
done:
up(&sem_ids.sem);
+#ifdef CONFIG_SSI
+ kfree (node_id_pairs);
+#endif
*start = buffer + (offset - begin);
len -= (offset - begin);
if(len > length)
Index: shm.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/shm.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- shm.c 24 Mar 2009 04:26:29 -0000 1.23
+++ shm.c 28 Mar 2009 23:44:16 -0000 1.24
@@ -42,7 +42,7 @@
#ifdef CONFIG_SSI
extern int cli_ipcname_findid(int, int, key_t *, clusternode_t *, int *, int *, int *);
-extern int cli_ipcname_gettotal(int objtype, char **, int *);
+extern int cli_ipcname_gettotal(int objtype, struct ssi_nodeid_pair **, int *);
extern int cli_ipcname_rmid(int, global_id_t);
extern int ssi_shmctl(clusternode_t, int, int, struct shmid_ds *);
extern int ssi_shm_get_shmid_kernel(clusternode_t, int, char **, int *, int *);
@@ -1589,7 +1589,9 @@
int i, len = 0;
#ifdef CONFIG_SSI
+ struct ssi_nodeid_pair *node_id_pairs = NULL;
int local_view = ssi_get_localview();
+ int id_count, size;
char viewstr[10];
#endif /* CONFIG_SSI */
@@ -1597,23 +1599,21 @@
PRINT_HEADER;
#ifdef CONFIG_SSI
- int id_count=0, ipc_id=0;
- int segsize=0, cprid=0;
- char *node_id_pairs=NULL;
- char *tmp_pairs=NULL;
- int size=0, node_num=0;
-
bzero(viewstr, 10);
if (!local_view) {
- size = -1;
- cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
- if (size <= 0) goto done;
- node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
- if (node_id_pairs == NULL)
- goto done;
- memset(node_id_pairs, 0, size * sizeof(int));
- cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
- tmp_pairs = (char *)node_id_pairs;
+ size = 30; /* Random guess */
+ for (;;) { /* Maybe limit tries? */
+ int allocated = size;
+
+ node_id_pairs = kmalloc(size * sizeof *node_id_pairs, GFP_KERNEL);
+ if (!node_id_pairs)
+ goto done;
+
+ cli_ipcname_gettotal(NAME_SERVICE_SHM, &node_id_pairs, &size);
+ if (size <= allocated)
+ break;
+ kfree (node_id_pairs);
+ }
}
id_count = SHM_MAX_ID;
@@ -1623,32 +1623,28 @@
#endif /* CONFIG_SSI */
struct shmid_kernel* shp;
#ifdef CONFIG_SSI
+ key_t ipc_id = i;
+ int node_num, segsize=0, cprid=0;
shp = NULL;
if (!local_view) {
- node_num = *((int *)tmp_pairs);
- tmp_pairs += sizeof(int);
- ipc_id = *((key_t *)tmp_pairs);
- tmp_pairs += sizeof(key_t);
- i++;
- if (node_num == CLUSTERNODE_INVAL)
+ ipc_id = node_id_pairs[i].ipc_id;
+ node_num = node_id_pairs[i].node_num;
+
+ if (node_num == CLUSTERNODE_INVAL) {
node_num = -1;
- else if (node_num == this_node)
- {
+ } else if (node_num == this_node) {
shp = shm_lock(ipc_id);
segsize = shm_get_segsize(shp);
cprid = shm_get_cpid(shp);
- }
- else
- {
- shp = kmalloc(sizeof(struct shmid_kernel),
+ } else {
+ shp = kzmalloc(sizeof(struct shmid_kernel),
GFP_KERNEL);
- if (shp == NULL) break;
- memset(shp, 0, sizeof(struct shmid_kernel));
+ if (shp == NULL)
+ break;
ssi_shm_get_shmid_kernel(node_num, ipc_id,
(char **)&shp, &segsize, &cprid);
}
- }
- else {
+ } else {
shp = shm_lock(i);
node_num = this_node;
}
@@ -1733,16 +1729,15 @@
*eof = 1;
done:
up(&shm_ids.sem);
+#ifdef CONFIG_SSI
+ kfree(node_id_pairs);
+#endif /* CONFIG_SSI */
*start = buffer + (offset - begin);
len -= (offset - begin);
if(len > length)
len = length;
if(len < 0)
len = 0;
-#ifdef CONFIG_SSI
- if ((!local_view) && (size > 0))
- kfree(node_id_pairs);
-#endif /* CONFIG_SSI */
return len;
}
#endif
Index: msg.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/ipc/msg.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- msg.c 27 May 2005 04:38:21 -0000 1.12
+++ msg.c 28 Mar 2009 23:44:16 -0000 1.13
@@ -39,7 +39,7 @@
extern int cli_ipcname_findid(int, int, key_t *, clusternode_t *, int *,
int *, int *);
-extern int cli_ipcname_gettotal(int objtype, char **, int *);
+extern int cli_ipcname_gettotal(int objtype, struct ssi_nodeid_pair **, int *);
extern int cli_ipcname_rmid(int service, global_id_t glid);
extern int cli_ripc_msgctl(clusternode_t, int *, int, int, ssi_procstate_t *,
long *);
@@ -1470,28 +1470,30 @@
int i, len = 0;
#ifdef CONFIG_SSI
+ struct ssi_nodeid_pair *node_id_pairs = NULL;
int local_view = ssi_get_localview();
+ int id_count, size;
char viewstr[10];
#endif
down(&msg_ids.sem);
PRINT_HEADER;
#ifdef CONFIG_SSI
- int id_count=0, ipc_id=0;
- char *node_id_pairs=NULL;
- char *tmp_pairs=NULL;
- int size=0, node_num=0;
bzero(viewstr, 10);
- if (!local_view)
- {
- size = -1;
- cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
- node_id_pairs = (char *)kmalloc(size * sizeof(int), GFP_KERNEL);
- if (node_id_pairs == NULL)
- goto done;
- memset(node_id_pairs, 0, size * sizeof(int));
- cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
- tmp_pairs = (char *)node_id_pairs;
+ if (!local_view) {
+ size = 30; /* Random guess */
+ for (;;) {
+ int allocated = size;
+
+ node_id_pairs = kmalloc(size * sizeof(*node_id_pairs), GFP_KERNEL);
+ if (node_id_pairs == NULL)
+ goto done;
+
+ (void) cli_ipcname_gettotal(NAME_SERVICE_MSG, &node_id_pairs, &size);
+ if (allocated >= size)
+ break;
+ kfree (node_id_pairs);
+ }
}
id_count = MSG_MAX_ID;
@@ -1501,28 +1503,25 @@
#endif
struct msg_queue * msq;
#ifdef CONFIG_SSI
+ int node_num;
+ key_t ipc_id = i;
msq = NULL;
- if (!local_view)
- {
- node_num = *((int *)tmp_pairs);
- tmp_pairs += sizeof(int);
- ipc_id = *((key_t *)tmp_pairs);
- tmp_pairs += sizeof(key_t);
- i++;
- if (node_num == CLUSTERNODE_INVAL)
+ if (!local_view) {
+ ipc_id = node_id_pairs[i].ipc_id;
+ node_num = node_id_pairs[i].node_num;
+
+ if (node_num == CLUSTERNODE_INVAL) {
node_num = -1;
- else if (node_num == this_node)
+ } else if (node_num == this_node) {
msq = msg_lock(ipc_id);
- else
- {
- msq = kmalloc(sizeof(struct msg_queue), GFP_KERNEL);
- if (msq == NULL) break;
- memset(msq, 0, sizeof(struct msg_queue));
+ } else {
+ msq = kzmalloc(sizeof(struct msg_queue), GFP_KERNEL);
+ if (msq == NULL)
+ break;
ssi_msg_get_msg_queue(node_num, ipc_id, (char **)&msq);
}
- }
- else {
+ } else {
node_num = this_node;
msq = msg_lock(i);
}
@@ -1578,6 +1577,9 @@
*eof = 1;
done:
up(&msg_ids.sem);
+#ifdef CONFIG_SSI
+ kfree (node_id_pairs);
+#endif
*start = buffer + (offset - begin);
len -= (offset - begin);
if(len > length)
------------------------------------------------------------------------------