Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 May 2001 18:02:42 -0700 (PDT)
From:      Jim.Pirzyk@disney.com
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/27759: linux module does not support sysinfo system call
Message-ID:  <200105300102.f4U12gc11399@snoopy.fan.fa.disney.com>

next in thread | raw e-mail | index | archive | help

>Number:         27759
>Category:       kern
>Synopsis:       linux sysinfo system call is needed for maya batch mode to work.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue May 29 18:10:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     
>Release:        FreeBSD 4.3-RELEASE i386
>Organization:
>Environment:
System: FreeBSD snoopy 4.3-RELEASE FreeBSD 4.3-RELEASE #6: Tue May 29 10:01:46 PDT 2001 root@snoopy:/auto/roy/dist/pub/FreeBSD/4.3-RELEASE/sys/compile/UP_WORKSTATION i386


	
>Description:
	The maya batch mode renderer uses sysinfo from the linux kernel to
	get information about memory & etc from the system.  The linux
	kernel module does not have this system call.
>How-To-Repeat:
	Run a maya render and you get error messages of the following...

	linux: syscall %s is obsoleted or not implemented (pid=%ld)

>Fix:

	This patch was sent to me by Charles Henrich <henrich@sigbus.com>


*** ./sys/i386/linux/linux_dummy.c.orig	Wed Jul 19 22:31:56 2000
--- ./sys/i386/linux/linux_dummy.c	Fri Dec  1 08:51:52 2000
***************
*** 74,80 ****
  DUMMY(idle);
  DUMMY(vm86old);
  DUMMY(swapoff);
- DUMMY(sysinfo);
  DUMMY(adjtimex);
  DUMMY(create_module);
  DUMMY(init_module);
--- 74,79 ----
***************
*** 109,112 ****
  DUMMY(ftruncate64);
  DUMMY(stat64);
  DUMMY(lstat64);
- DUMMY(fstat64);
--- 108,110 ----
*** ./sys/i386/linux/linux_sysent.c.orig	Tue Aug  8 16:28:16 2000
--- ./sys/i386/linux/linux_sysent.c	Thu Nov 30 17:42:29 2000
***************
*** 133,139 ****
  	{ 0, (sy_call_t *)linux_vm86old },		/* 113 = linux_vm86old */
  	{ AS(linux_wait4_args), (sy_call_t *)linux_wait4 },	/* 114 = linux_wait4 */
  	{ 0, (sy_call_t *)linux_swapoff },		/* 115 = linux_swapoff */
! 	{ 0, (sy_call_t *)linux_sysinfo },		/* 116 = linux_sysinfo */
  	{ AS(linux_ipc_args), (sy_call_t *)linux_ipc },	/* 117 = linux_ipc */
  	{ AS(fsync_args), (sy_call_t *)fsync },		/* 118 = fsync */
  	{ AS(linux_sigreturn_args), (sy_call_t *)linux_sigreturn },	/* 119 = linux_sigreturn */
--- 133,139 ----
  	{ 0, (sy_call_t *)linux_vm86old },		/* 113 = linux_vm86old */
  	{ AS(linux_wait4_args), (sy_call_t *)linux_wait4 },	/* 114 = linux_wait4 */
  	{ 0, (sy_call_t *)linux_swapoff },		/* 115 = linux_swapoff */
! 	{ AS(linux_sysinfo_args), (sy_call_t *)linux_sysinfo },		/* 116 = linux_sysinfo */
  	{ AS(linux_ipc_args), (sy_call_t *)linux_ipc },	/* 117 = linux_ipc */
  	{ AS(fsync_args), (sy_call_t *)fsync },		/* 118 = fsync */
  	{ AS(linux_sigreturn_args), (sy_call_t *)linux_sigreturn },	/* 119 = linux_sigreturn */
*** ./sys/i386/linux/linux_proto.h.orig	Tue Aug  8 16:28:16 2000
--- ./sys/i386/linux/linux_proto.h	Thu Nov 30 17:41:12 2000
***************
*** 312,318 ****
  	register_t dummy;
  };
  struct	linux_sysinfo_args {
! 	register_t dummy;
  };
  struct	linux_ipc_args {
  	int	what;	char what_[PAD_(int)];
--- 312,318 ----
  	register_t dummy;
  };
  struct	linux_sysinfo_args {
! 	struct linux_sysinfo *  buf;    char buf_[PAD_(struct linux_sysinfo *)];
  };
  struct	linux_ipc_args {
  	int	what;	char what_[PAD_(int)];
*** ./sys/compat/linux/linux_misc.c.orig	Tue Mar 27 18:33:47 2001
--- ./sys/compat/linux/linux_misc.c	Fri May  4 15:53:46 2001
***************
*** 40,45 ****
--- 40,46 ----
  #include <sys/imgact_aout.h>
  #include <sys/mount.h>
  #include <sys/namei.h>
+ #include <sys/resource.h>
  #include <sys/resourcevar.h>
  #include <sys/stat.h>
  #include <sys/sysctl.h>
***************
*** 48,59 ****
--- 49,64 ----
  #include <sys/wait.h>
  #include <sys/time.h>
  #include <sys/signalvar.h>
+ #include <sys/blist.h>
+ #include <sys/vmmeter.h>
  
  #include <vm/vm.h>
  #include <vm/pmap.h>
  #include <vm/vm_kern.h>
  #include <vm/vm_map.h>
  #include <vm/vm_extern.h>
+ #include <vm/vm_object.h>
+ #include <vm/swap_pager.h>
  
  #include <machine/frame.h>
  #include <machine/limits.h>
***************
*** 93,98 ****
--- 98,176 ----
    RLIMIT_MEMLOCK, -1
  };
  #endif /*!__alpha__*/
+ 
+ struct linux_sysinfo {
+      long uptime;              /* Seconds since boot */
+      unsigned long loads[3];   /* 1, 5, and 15 minute load averages */
+      unsigned long totalram;   /* Total usable main memory size */
+      unsigned long freeram;    /* Available memory size */
+      unsigned long sharedram;  /* Amount of shared memory */
+      unsigned long bufferram;  /* Memory used by buffers */
+      unsigned long totalswap;  /* Total swap space size */
+      unsigned long freeswap;   /* swap space still available */
+      unsigned short procs;     /* Number of current processes */
+      char _f[22];              /* Pads structure to 64 bytes */
+ };
+ 
+ int
+ linux_sysinfo(struct proc *p, struct linux_sysinfo_args *args)
+ {
+ 	struct linux_sysinfo sysinfo;
+ 	vm_object_t object;
+ 	int i;
+ 	struct timespec ts;
+ 
+ 	/* Uptime is copied out of print_uptime() procedure in kern_shutdown.c */
+ 	getnanouptime(&ts);
+      i = 0;
+      if (ts.tv_sec >= 86400) {
+           printf("%ldd", ts.tv_sec / 86400);
+           ts.tv_sec %= 86400;
+           i = 1;
+      }
+      if (i || ts.tv_sec >= 3600) {
+           printf("%ldh", ts.tv_sec / 3600);
+           ts.tv_sec %= 3600;
+           i = 1;
+      }
+      if (i || ts.tv_sec >= 60) {
+           printf("%ldm", ts.tv_sec / 60);
+           ts.tv_sec %= 60;
+           i = 1;
+      }
+ 	sysinfo.uptime=ts.tv_sec;
+ 
+ 	/* Use the information from the mib to get our load averages */
+ 	for (i = 0; i < 3; i++)
+ 		sysinfo.loads[i] = (double) averunnable.ldavg[i] / averunnable.fscale;
+ 
+ 	sysinfo.totalram = physmem * PAGE_SIZE;
+ 	sysinfo.freeram = sysinfo.totalram - cnt.v_wire_count * PAGE_SIZE;
+ 
+ 	sysinfo.sharedram = 0;
+ 	for (object = TAILQ_FIRST(&vm_object_list); object != NULL;
+      	object = TAILQ_NEXT(object, object_list))
+               	if (object->shadow_count > 1)
+                   	sysinfo.sharedram += object->resident_page_count;
+ 
+ 	sysinfo.sharedram *= PAGE_SIZE;
+ 
+ 	sysinfo.bufferram = 0;
+ 
+ 	if (swapblist == NULL) {
+      	sysinfo.totalswap= 0;
+      	sysinfo.freeswap = 0;
+ 	} else {
+      	sysinfo.totalswap = swapblist->bl_blocks * 1024;
+      	sysinfo.freeswap = swapblist->bl_root->u.bmu_avail * PAGE_SIZE;
+ 	}
+ 
+ 	sysinfo.procs = 20; /* Hack */
+ 
+ 	return copyout((caddr_t)&sysinfo, (caddr_t)args->buf,
+                sizeof(struct linux_sysinfo));
+ }
+ 
  
  #ifndef __alpha__
  int
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105300102.f4U12gc11399>