linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Prarit Bhargava <prarit@sgi.com>
To: linux-hotplug@vger.kernel.org
Subject: Re: Virtual Console Hotplug Leads to OOM
Date: Wed, 30 Mar 2005 16:31:57 +0000	[thread overview]
Message-ID: <424AD47D.9070209@sgi.com> (raw)
In-Reply-To: <424AD41F.1040309@sgi.com>

[-- Attachment #1: Type: text/plain, Size: 1632 bytes --]

It helps to attach the test code :)

P.

Prarit Bhargava wrote:

> Colleagues,
>
> I've identified the following critical issue where the hotplug 
> subsystem can cause OOM-killer to run.  IMO this is a critical issue 
> within hotplug -- in the case below, only the virtual console 
> subsystem is responsible.
>
> The virtual consoles that are being spawned are responsible for 2 
> hotplug events for every console opened -- one on the opening of the 
> console, and one on the closing of the console.
>
> If you run the tty2_test which opens and closes ttys (attached to this 
> email) you'll see THOUSANDS of hotplug events.  After running for 1 
> minute on a 16p ia64 I had well over 4000 hotplug events.
>
> If we're unlucky enough to fall below the low-water memory point at 
> the same time tty2_test is spawning, the OOM-killer starts up.  Memory 
> is taken up by the hotplug events ... and we're off into the weeds.
>
> The issue with the virtual console code is that it uses the 
> class_simple library.  This is a problem as the library pre-defines a 
> global kset parent as class_obj (or at least AFAICT).  This parent is 
> used by ALL subsystems using the class_simple, not just the virtual 
> console subsystem.
>
> This parent has a pointer to allow hotplug slot operations for all 
> it's children (including the virtual consoles).  IMO zero-ing this 
> pointer out is not a valid option as this would break hotplug op's for 
> many other subystems.
>
> ** I did notice that the class struct has it's own hotplug value -- 
> can/should this be used to override the parent's hotplug operations? **
>
> P.
>
>
>

[-- Attachment #2: tty2_test.c --]
[-- Type: text/plain, Size: 1117 bytes --]

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <pthread.h>

#define NTHREADS 300

void *thread_function();
int open_fail_num;
int open_success;

int
main(int argc, char *argv[])
{
  int i, j;
  pthread_t thread_id[NTHREADS];

  for(;;)
    {
      for(i=0; i < NTHREADS; i++)
	{
	  pthread_create(&thread_id[i], NULL, &thread_function, NULL);
	}
      for(j=0; j < NTHREADS; j++)
	{
	  pthread_join(thread_id[j], NULL); 
	}
      printf("open failures: %i\n", open_fail_num);
      printf("open success: %i\n", open_success);
    }
}

void *thread_function()
{
  int fd;
  time_t t;

  //  fd = open("/dev/cua0", O_NONBLOCK);
  //  fd = open("/dev/cua0", O_RDWR);
  fd = open("/dev/tty9", O_RDWR);

  //  if (fd == -1)
  if (fd < 0)
    {
      open_fail_num++;
      //      perror("open");
      //      exit(1);
    }
  else
    {
      open_success++;
    }
  /* just waste some random time */
  t = (time((time_t *)0) &31L) << 6;
  while (t-- > 0)
    (void)time((time_t *)0);
  close(fd);	
  //  _exit(0);
}

[-- Attachment #3: Makefile --]
[-- Type: text/plain, Size: 566 bytes --]

#
# make test command
#
NAME_SRC=tty2_test
CFLAGS= -O -g -Wall -I /usr/include/
LDFLAGS=-lpthread
CC=cc
GET=co
SRCS=$(NAME_SRC).c
OBJS=$(NAME_SRC).o
DEPEND= makedepend $(CFLAGS)
all:	$(NAME_SRC)

# To make an executable

$(NAME_SRC): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $(OBJS)

# what are the source dependencies
depend:	$(SRCS)
	$(DEPEND) $(SRCS)

# clean out the junk
clean:
	-rm $(NAME_SRC) *~ *.o

# DO NOT DELETE THIS LINE -- make depend depends on it.
$(NAME_SRC).o: /usr/include/sys/types.h /usr/include/sys/stat.h \
/usr/include/fcntl.h /usr/include/pthread.h


  reply	other threads:[~2005-03-30 16:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-30 16:30 Virtual Console Hotplug Leads to OOM Prarit Bhargava
2005-03-30 16:31 ` Prarit Bhargava [this message]
2005-04-01  0:17 ` Greg KH
2005-04-01 13:42 ` Prarit Bhargava

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=424AD47D.9070209@sgi.com \
    --to=prarit@sgi.com \
    --cc=linux-hotplug@vger.kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).