public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Dhruv Anand <dhruv.anand@wipro.com>
To: linux-kernel@vger.kernel.org
Cc: indou.takao@jp.fujitsu.com, akpm@zip.com.au, ahaas@airmail.net,
	dalecki@evision-ventures.com, ezolt@perf.zko.dec.com,
	rob.naccarato@sheridanc.on.ca, Dave@imladris.demon.co.uk
Subject: [RFC][PATCH 2.5.70] dynamically tuning msgtql
Date: 06 Jun 2003 19:30:10 +0530	[thread overview]
Message-ID: <1054908010.18527.7.camel@m2-arvind> (raw)

Hi,
Please find below the patch (RFC) that makes msgtql dynamically tunable
through /proc interface. 

1) IPC_NOWAIT flag not handled.
Handling this will cause overheads (additional queue, wake-ups etc). 
Please comment.

Or Handling IPC_NOWAIT may require:
a) An additional global queue for processes when message to be 
queued is > msgtql && IPC_NOWAIT flag is not set.
Please comment.

Thanks,
Dhruv

diff -Nur linux-2.5.70/include/linux/msg.h linux-2.5.70msg/include/linux/msg.h
--- linux-2.5.70/include/linux/msg.h	Tue May 27 06:30:40 2003
+++ linux-2.5.70msg/include/linux/msg.h	Fri Jun  6 14:31:26 2003
@@ -49,13 +49,13 @@
 	unsigned short  msgseg; 
 };
 
-#define MSGMNI    16   /* <= IPCMNI */     /* max # of msg queue identifiers */
-#define MSGMAX  8192   /* <= INT_MAX */   /* max size of message (bytes) */
-#define MSGMNB 16384   /* <= INT_MAX */   /* default max size of a message queue */
+#define MSGMNI    16      /* <= IPCMNI  */   /* max # of msg queue identifiers */
+#define MSGMAX  8192      /* <= INT_MAX */   /* max size of message (bytes) */
+#define MSGMNB 16384   	  /* <= INT_MAX */   /* default max size of a message queue */
+#define MSGTQL 0x7fffffff /* <= INT_MAX */   /* number of system message */
 
 /* unused */
 #define MSGPOOL (MSGMNI*MSGMNB/1024)  /* size in kilobytes of message pool */
-#define MSGTQL  MSGMNB            /* number of system message headers */
 #define MSGMAP  MSGMNB            /* number of entries in message map */
 #define MSGSSZ  16                /* message segment size */
 #define __MSGSEG ((MSGPOOL*1024)/ MSGSSZ) /* max no. of segments */
diff -Nur linux-2.5.70/include/linux/sysctl.h linux-2.5.70msg/include/linux/sysctl.h
--- linux-2.5.70/include/linux/sysctl.h	Tue May 27 06:30:40 2003
+++ linux-2.5.70msg/include/linux/sysctl.h	Fri Jun  6 14:00:54 2003
@@ -130,6 +130,7 @@
 	KERN_PIDMAX=55,		/* int: PID # limit */
   	KERN_CORE_PATTERN=56,	/* string: pattern for core-file names */
 	KERN_PANIC_ON_OOPS=57,  /* int: whether we will panic on an oops */
+	KERN_MSGTQL=57,         /* int: Maximum number of messages system wide */
 };
 

diff -Nur linux-2.5.70/ipc/msg.c linux-2.5.70msg/ipc/msg.c
--- linux-2.5.70/ipc/msg.c	Tue May 27 06:30:20 2003
+++ linux-2.5.70msg/ipc/msg.c	Fri Jun  6 18:43:42 2003
@@ -32,6 +32,9 @@
 int msg_ctlmax = MSGMAX;
 int msg_ctlmnb = MSGMNB;
 int msg_ctlmni = MSGMNI;
+int msg_ctltql = MSGTQL;
+static int msg_count = 0;               /* counter for MSGTQL */
+static spinlock_t msg_count_lock;       /* spinlock for MSGTQL */
 
 /* one msg_receiver structure for each sleeping receiver */
 struct msg_receiver {
@@ -137,6 +140,9 @@
 
 	seg = msg->next;
 	kfree(msg);
+	spin_lock(&msg_count_lock);
+	msg_count--;
+	spin_unlock(&msg_count_lock);
 	while(seg != NULL) {
 		struct msg_msgseg* tmp = seg->next;
 		kfree(seg);
@@ -154,48 +160,59 @@
 	alen = len;
 	if(alen > DATALEN_MSG)
 		alen = DATALEN_MSG;
-
-	msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
-	if(msg==NULL)
-		return ERR_PTR(-ENOMEM);
-
-	msg->next = NULL;
-	msg->security = NULL;
-
-	if (copy_from_user(msg+1, src, alen)) {
-		err = -EFAULT;
-		goto out_err;
-	}
-
-	len -= alen;
-	src = ((char*)src)+alen;
-	pseg = &msg->next;
-	while(len > 0) {
-		struct msg_msgseg* seg;
-		alen = len;
-		if(alen > DATALEN_SEG)
-			alen = DATALEN_SEG;
-		seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
-		if(seg==NULL) {
-			err=-ENOMEM;
-			goto out_err;
+	
+	spin_lock(&msg_count_lock);
+	if(msg_count < msg_ctltql){
+		msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
+		if(msg==NULL) {
+			spin_unlock(msg_count_lock);
+			return ERR_PTR(-ENOMEM);
 		}
-		*pseg = seg;
-		seg->next = NULL;
-		if(copy_from_user (seg+1, src, alen)) {
+		msg_count++;
+                spin_unlock(msg_count_lock);
+		msg->next = NULL;
+		msg->security = NULL;
+
+		if (copy_from_user(msg+1, src, alen)) {
 			err = -EFAULT;
 			goto out_err;
 		}
-		pseg = &seg->next;
+
 		len -= alen;
 		src = ((char*)src)+alen;
-	}
+		pseg = &msg->next;
+		while(len > 0) {
+			struct msg_msgseg* seg;
+			alen = len;
+			if(alen > DATALEN_SEG)
+			alen = DATALEN_SEG;
+			seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
+			if(seg==NULL) {
+				err=-ENOMEM;
+				goto out_err;
+			}
+			*pseg = seg;
+			seg->next = NULL;
+			if(copy_from_user (seg+1, src, alen)) {
+				err = -EFAULT;
+				goto out_err;
+			}
+			pseg = &seg->next;
+			len -= alen;
+			src = ((char*)src)+alen;
+		}
 	
-	err = security_msg_msg_alloc(msg);
-	if (err)
-		goto out_err;
+		err = security_msg_msg_alloc(msg);
+		if (err)
+			goto out_err;
 
-	return msg;
+		return msg;
+	}
+	else {
+		spin_unlock(&msg_count_lock);
+	        err= -EAGAIN;
+	        return ERR_PTR(err);
+	}
 
 out_err:
 	free_msg(msg);
diff -Nur linux-2.5.70/kernel/sysctl.c linux-2.5.70msg/kernel/sysctl.c
--- linux-2.5.70/kernel/sysctl.c	Tue May 27 06:30:23 2003
+++ linux-2.5.70msg/kernel/sysctl.c	Fri Jun  6 14:35:06 2003
@@ -61,6 +61,9 @@
 /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
 static int maxolduid = 65535;
 static int minolduid;
+static int zero = 0;
+static int one = 1;
+static int one_hundred = 100;
 
 #ifdef CONFIG_KMOD
 extern char modprobe_path[];
@@ -78,6 +81,7 @@
 extern int msg_ctlmax;
 extern int msg_ctlmnb;
 extern int msg_ctlmni;
+extern int msg_ctltql;
 extern int sem_ctls[];
 #endif
 
@@ -235,6 +239,8 @@
 	 0644, NULL, &proc_dointvec},
 	{KERN_MSGMNB, "msgmnb", &msg_ctlmnb, sizeof (int),
 	 0644, NULL, &proc_dointvec},
+	{KERN_MSGTQL, "msgtql", &msg_ctltql, sizeof (int),
+         0644, NULL, &proc_dointvec_minmax, NULL, NULL, &zero, NULL},
 	{KERN_SEM, "sem", &sem_ctls, 4*sizeof (int),
 	 0644, NULL, &proc_dointvec},
 #endif
@@ -270,9 +276,6 @@
 
 /* Constants for minimum and maximum testing in vm_table.
    We use these as one-element integer vectors. */
-static int zero = 0;
-static int one = 1;
-static int one_hundred = 100;
 

 static ctl_table vm_table[] = {



                 reply	other threads:[~2003-06-06 13:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1054908010.18527.7.camel@m2-arvind \
    --to=dhruv.anand@wipro.com \
    --cc=Dave@imladris.demon.co.uk \
    --cc=ahaas@airmail.net \
    --cc=akpm@zip.com.au \
    --cc=dalecki@evision-ventures.com \
    --cc=ezolt@perf.zko.dec.com \
    --cc=indou.takao@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rob.naccarato@sheridanc.on.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox