Date: Sat, 26 Feb 2000 17:43:01 +0000 (GMT) From: Doug Rabson <dfr@nlsystems.com> To: Peter Wemm <peter@netplex.com.au> Cc: Vladimir Kravchuk <adm@smr.ru>, Andrew Gallatin <gallatin@cs.duke.edu>, freebsd-alpha@FreeBSD.ORG Subject: Re: UP2000/DP264 Message-ID: <Pine.BSF.4.21.0002261739171.8714-100000@salmon.nlsystems.com> In-Reply-To: <20000225143538.5E0B31CE0@overcee.netplex.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 25 Feb 2000, Peter Wemm wrote: > Doug Rabson wrote: > > On Fri, 25 Feb 2000, Vladimir Kravchuk wrote: > > > > > Feb 25 11:37:05 up2 /kernel: WARNING: 8192 bytes not available for > > > msgbuf in last cluster (32768 used) > > > !!!!!!!!!What does this warning mean? > > > > I would like to see the memory map for this machine. Please add '#defined > > DEBUG_CLUSTER' to the top of machdep.c to make it print out more > > information about the memory it uses. Unfortunately, this will be printed > > before the message buffer is initialised so you will have to transcribe > > the results by hand if you don't have a serial console. > > Actually, this is because of a bug in alpha/machdep.c. MSGBUF_SIZE is 32K > by default now, and the alpha machdep.c code assumes that anything other > than PAGE_SIZE is an allocation error. I'm not sure what's right, I've been > tempted to comment out the printf. It seems there are two different variables > in use for the same thing, but one is out of date. Ok, I propose making these changes. This patch nukes the bogus MSGBUFSIZE and fixes a nasty looking bug if the message buffer size really was truncated. It also simplifies the MDDT parsing code so that it should work whatever or not pmap_uses_prom_console() returns. I incorporated Andrew's patch to pmap to note that we only use the prom console on turbochannel boxes. This is a good thing - with this patch, I get an extra 1Mb of memory on my Miata. Index: include/param.h =================================================================== RCS file: /home/ncvs/src/sys/alpha/include/param.h,v retrieving revision 1.16 diff -u -r1.16 param.h --- include/param.h 1999/11/22 15:14:55 1.16 +++ include/param.h 2000/02/26 12:12:41 @@ -114,10 +114,6 @@ #define UPAGES 2 /* pages of u-area */ #define USPACE (UPAGES * PAGE_SIZE) /* total size of u-area */ -#ifndef MSGBUFSIZE -#define MSGBUFSIZE PAGE_SIZE /* default message buffer size */ -#endif - /* * Constants related to network buffer management. * MCLBYTES must be no larger than CLBYTES (the software page size), and, Index: alpha/machdep.c =================================================================== RCS file: /home/ncvs/src/sys/alpha/alpha/machdep.c,v retrieving revision 1.67 diff -u -r1.67 machdep.c --- alpha/machdep.c 2000/02/13 03:31:48 1.67 +++ alpha/machdep.c 2000/02/26 12:13:32 @@ -817,6 +817,7 @@ mddtp->mddt_cluster_cnt); } +#define DEBUG_CLUSTER #ifdef DEBUG_CLUSTER printf("Memory cluster count: %d\n", mddtp->mddt_cluster_cnt); #endif @@ -859,57 +860,55 @@ * XXX memory after the kernel in the first system segment, * XXX to avoid clobbering prom mapping, data, etc. */ - if (!pmap_uses_prom_console() || physmem == 0) { - physmem += memc->mddt_pg_cnt; - pfn0 = memc->mddt_pfn; - pfn1 = memc->mddt_pfn + memc->mddt_pg_cnt; - if (pfn0 <= kernendpfn && kernstartpfn <= pfn1) { - /* - * Must compute the location of the kernel - * within the segment. - */ -#ifdef DEBUG_CLUSTER - printf("Cluster %d contains kernel\n", i); -#endif - if (!pmap_uses_prom_console()) { - if (pfn0 < kernstartpfn) { - /* - * There is a chunk before the kernel. - */ -#ifdef DEBUG_CLUSTER - printf("Loading chunk before kernel: " - "0x%lx / 0x%lx\n", pfn0, kernstartpfn); -#endif - phys_avail[phys_avail_cnt] = alpha_ptob(pfn0); - phys_avail[phys_avail_cnt+1] = alpha_ptob(kernstartpfn); - phys_avail_cnt += 2; - } - } - if (kernendpfn < pfn1) { - /* - * There is a chunk after the kernel. - */ + physmem += memc->mddt_pg_cnt; + pfn0 = memc->mddt_pfn; + pfn1 = memc->mddt_pfn + memc->mddt_pg_cnt; + if (pfn0 <= kernendpfn && kernstartpfn <= pfn1) { + /* + * Must compute the location of the kernel + * within the segment. + */ +#ifdef DEBUG_CLUSTER + printf("Cluster %d contains kernel\n", i); +#endif + if (!pmap_uses_prom_console()) { + if (pfn0 < kernstartpfn) { + /* + * There is a chunk before the kernel. + */ #ifdef DEBUG_CLUSTER - printf("Loading chunk after kernel: " - "0x%lx / 0x%lx\n", kernendpfn, pfn1); + printf("Loading chunk before kernel: " + "0x%lx / 0x%lx\n", pfn0, kernstartpfn); #endif - phys_avail[phys_avail_cnt] = alpha_ptob(kernendpfn); - phys_avail[phys_avail_cnt+1] = alpha_ptob(pfn1); + phys_avail[phys_avail_cnt] = alpha_ptob(pfn0); + phys_avail[phys_avail_cnt+1] = alpha_ptob(kernstartpfn); phys_avail_cnt += 2; } - } else { + } + if (kernendpfn < pfn1) { /* - * Just load this cluster as one chunk. + * There is a chunk after the kernel. */ #ifdef DEBUG_CLUSTER - printf("Loading cluster %d: 0x%lx / 0x%lx\n", i, - pfn0, pfn1); + printf("Loading chunk after kernel: " + "0x%lx / 0x%lx\n", kernendpfn, pfn1); #endif - phys_avail[phys_avail_cnt] = alpha_ptob(pfn0); + phys_avail[phys_avail_cnt] = alpha_ptob(kernendpfn); phys_avail[phys_avail_cnt+1] = alpha_ptob(pfn1); phys_avail_cnt += 2; - } + } else { + /* + * Just load this cluster as one chunk. + */ +#ifdef DEBUG_CLUSTER + printf("Loading cluster %d: 0x%lx / 0x%lx\n", i, + pfn0, pfn1); +#endif + phys_avail[phys_avail_cnt] = alpha_ptob(pfn0); + phys_avail[phys_avail_cnt+1] = alpha_ptob(pfn1); + phys_avail_cnt += 2; + } } phys_avail[phys_avail_cnt] = 0; @@ -956,16 +955,16 @@ phys_avail[i+1] -= sz; msgbufp = (struct msgbuf*) ALPHA_PHYS_TO_K0SEG(phys_avail[i+1]); - msgbufinit(msgbufp, MSGBUF_SIZE); + msgbufinit(msgbufp, sz); /* Remove the last segment if it now has no pages. */ if (phys_avail[i] == phys_avail[i+1]) phys_avail[i] = 0; /* warn if the message buffer had to be shrunk */ - if (sz != round_page(MSGBUFSIZE)) + if (sz != round_page(MSGBUF_SIZE)) printf("WARNING: %ld bytes not available for msgbuf in last cluster (%ld used)\n", - round_page(MSGBUFSIZE), sz); + round_page(MSGBUF_SIZE), sz); } Index: alpha/pmap.c =================================================================== RCS file: /home/ncvs/src/sys/alpha/alpha/pmap.c,v retrieving revision 1.34 diff -u -r1.34 pmap.c --- alpha/pmap.c 1999/11/19 21:34:50 1.34 +++ alpha/pmap.c 2000/02/26 17:35:25 @@ -172,6 +172,7 @@ #include <sys/user.h> #include <machine/md_var.h> +#include <machine/rpb.h> #ifndef PMAP_SHPGPERPROC #define PMAP_SHPGPERPROC 200 @@ -606,19 +607,14 @@ int pmap_uses_prom_console() { -#if 0 - extern int cputype; + int cputype; -#if defined(NEW_SCC_DRIVER) - return (cputype == ST_DEC_21000); -#else + cputype = hwrpb->rpb_type; return (cputype == ST_DEC_21000 || cputype == ST_DEC_3000_300 || cputype == ST_DEC_3000_500); -#endif /* NEW_SCC_DRIVER */ -#endif - return 1; + return 0; } /* -- Doug Rabson Mail: dfr@nlsystems.com Nonlinear Systems Ltd. Phone: +44 181 442 9037 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0002261739171.8714-100000>