[sample] mem_notify v6: usage example

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <linux-mm@...>, <linux-kernel@...>
Cc: <kosaki.motohiro@...>, Marcelo Tosatti <marcelo@...>, Daniel Spang <daniel.spang@...>, Rik van Riel <riel@...>, Andrew Morton <akpm@...>, Alan Cox <alan@...>, <linux-fsdevel@...>, Pavel Machek <pavel@...>, Al Boldi <a1426z@...>, Jon Masters <jonathan@...>, Zan Lynx <zlynx@...>
Date: Saturday, February 9, 2008 - 11:55 am

this is usage example of /dev/mem_notify.

Daniel Spang create original version.
kosaki add fasync related code.


Signed-off-by: Daniel Spang <daniel.spang@gmail.com>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>

---
 Documentation/mem_notify.c |  120 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

Index: b/Documentation/mem_notify.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ b/Documentation/mem_notify.c	2008-02-10 00:44:00.000000000 +0900
@@ -0,0 +1,120 @@
+/*
+ * Allocate 10 MB each second. Exit on notification.
+ */
+
+#define _GNU_SOURCE
+
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <poll.h>
+#include <pthread.h>
+#include <errno.h>
+#include <signal.h>
+
+int count = 0;
+int size = 10;
+
+void *do_alloc()
+{
+        for(;;) {
+                int *buffer;
+                buffer = mmap(NULL,  size*1024*1024,
+                              PROT_READ | PROT_WRITE,
+                              MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+                if (buffer == MAP_FAILED) {
+                        perror("mmap");
+                        exit(EXIT_FAILURE);
+                }
+                memset(buffer, 1 , size*1024*1024);
+
+                printf("-");
+                fflush(stdout);
+
+                count++;
+                sleep(1);
+        }
+}
+
+int wait_for_notification(struct pollfd *pfd)
+{
+        int ret;
+        read(pfd->fd, 0, 0);
+        ret = poll(pfd, 1, -1);              /* wake up when low memory */
+        if (ret == -1 && errno != EINTR) {
+                perror("poll");
+                exit(EXIT_FAILURE);
+        }
+        return ret;
+}
+
+void do_free()
+{
+	int fd;
+	struct pollfd pfd;
+
+        fd = open("/dev/mem_notify", O_RDONLY);
+        if (fd == -1) {
+                perror("open");
+                exit(EXIT_FAILURE);
+        }
+
+	pfd.fd = fd;
+        pfd.events = POLLIN;
+        for(;;)
+                if (wait_for_notification(&pfd) > 0) {
+                        printf("\nGot notification, allocated %d MB\n",
+                               size * count);
+                        exit(EXIT_SUCCESS);
+                }
+}
+
+void do_free_signal()
+{
+	int fd;
+	int flags;
+
+        fd = open("/dev/mem_notify", O_RDONLY);
+        if (fd == -1) {
+                perror("open");
+                exit(EXIT_FAILURE);
+        }
+
+	fcntl(fd, F_SETOWN, getpid());
+	fcntl(fd, F_SETSIG, SIGUSR1);
+
+	flags = fcntl(fd, F_GETFL);
+	fcntl(fd, F_SETFL, flags|FASYNC); /* when low memory, receive SIGUSR1 */
+
+	for(;;)
+		sleep(1);
+}
+
+
+void daniel_exit(int signo)
+{
+	printf("\nGot notification %d, allocated %d MB\n",
+	       signo, size * count);
+	exit(EXIT_SUCCESS);
+
+}
+
+int main(int argc, char *argv[])
+{
+        pthread_t allocator;
+
+	if(argc == 2 && (strcmp(argv[1], "-sig") == 0)) {
+		printf("run signal mode\n");
+		signal(SIGUSR1, daniel_exit);
+		pthread_create(&allocator, NULL, do_alloc, NULL);
+		do_free_signal();
+	} else {
+		printf("run poll mode\n");
+		pthread_create(&allocator, NULL, do_alloc, NULL);
+		do_free();
+	}
+	return 0;
+}
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[sample] mem_notify v6: usage example, KOSAKI Motohiro, (Sat Feb 9, 11:55 am)
Re: [sample] mem_notify v6: usage example, Jon Masters, (Sat Feb 9, 12:07 pm)
Re: [sample] mem_notify v6: usage example, Pavel Machek, (Sat Feb 9, 9:30 pm)
Re: [sample] mem_notify v6: usage example, KOSAKI Motohiro, (Sat Feb 9, 12:46 pm)
Re: [sample] mem_notify v6: usage example, Andreas Dilger, (Mon Feb 11, 2:15 pm)
Re: [sample] mem_notify v6: usage example, KOSAKI Motohiro, (Mon Feb 11, 2:37 pm)