Index: xc/programs/Xserver/os/utils.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/os/utils.c,v retrieving revision 1.9 diff -u -2 -0 -r1.9 utils.c --- xc/programs/Xserver/os/utils.c 29 Sep 2004 04:17:44 -0000 1.9 +++ xc/programs/Xserver/os/utils.c 9 Oct 2004 06:39:56 -0000 @@ -73,40 +73,54 @@ #include #undef _POSIX_C_SOURCE #else #if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE) #include #else #define _POSIX_SOURCE #include #undef _POSIX_SOURCE #endif #endif #include #if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4) #include #endif #include #include #include /* for isspace */ #include +#if defined(sun) +#include +#endif /* defined(sun) */ + +/* Use multiple pagesize support (Solaris >= 9) */ +#ifdef MHA_MAPSIZE_STACK +# define USE_MPSS 1 +#endif /* MHA_MAPSIZE_STACK */ +#ifdef USE_MPSS +static long preferredpagesize = -1; +#define DEFAULT_MPSS_PAGESIZE (512*1024) /* 512k pages for UltraSPARC */ +static void SetPreferredPageSize(long size); +#endif /* USE_MPSS */ + #if defined(DGUX) #include #include #endif #include /* for malloc() */ #if defined(TCPCONN) || defined(STREAMSCONN) # ifndef WIN32 # include # endif #endif #include "opaque.h" #ifdef SMART_SCHEDULE #include "dixstruct.h" #endif #ifdef XKB @@ -645,40 +659,44 @@ ErrorF("-r turns off auto-repeat\n"); ErrorF("r turns on auto-repeat \n"); #ifdef RENDER ErrorF("-render [default|mono|gray|color] set render color alloc policy\n"); #endif ErrorF("-s # screen-saver timeout (minutes)\n"); #ifdef XCSECURITY ErrorF("-sp file security policy file\n"); #endif ErrorF("-su disable any save under support\n"); ErrorF("-t # mouse threshold (pixels)\n"); ErrorF("-terminate terminate at server reset\n"); ErrorF("-to # connection time out\n"); ErrorF("-tst disable testing extensions\n"); ErrorF("ttyxx server started from init on /dev/ttyxx\n"); ErrorF("v video blanking for screen-saver\n"); ErrorF("-v screen-saver without video blanking\n"); ErrorF("-wm WhenMapped default backing-store\n"); ErrorF("-x string loads named extension at init time \n"); ErrorF("-maxbigreqsize set maximal bigrequest size \n"); +#ifdef USE_MPSS + /* ToDO: We should list the supported page sizes here... */ + ErrorF("-pagesize Set stack and heap pagesize (in kb)\n"); +#endif /* USE_MPSS */ #ifdef PANORAMIX ErrorF("+xinerama Enable XINERAMA extension\n"); ErrorF("-xinerama Disable XINERAMA extension\n"); #endif #ifdef SMART_SCHEDULE ErrorF("-dumbSched Disable smart scheduling, enable old behavior\n"); ErrorF("-schedInterval int Set scheduler interval in msec\n"); #endif ErrorF("+extension name Enable extension\n"); ErrorF("-extension name Disable extension\n"); #ifdef XDMCP XdmcpUseMsg(); #endif #endif /* !AIXrt && ! AIX386 */ #ifdef XKB XkbUseMsg(); #endif ddxUseMsg(); } @@ -1007,40 +1025,61 @@ else if ( strcmp( argv[i], "-wm") == 0) defaultBackingStore = WhenMapped; else if ( strcmp( argv[i], "-maxbigreqsize") == 0) { if(++i < argc) { long reqSizeArg = atol(argv[i]); /* Request size > 128MB does not make much sense... */ if( reqSizeArg > 0L && reqSizeArg < 128L ) { maxBigRequestSize = (reqSizeArg * 1048576L) - 1L; } else { UseMsg(); } } else { UseMsg(); } } +#ifdef USE_MPSS + else if ( strcmp( argv[i], "-pagesize") == 0) { + if(++i < argc) { + long ps = atol(argv[i]); + + if( ps > 0L ) { + /* Save the page size to remember that we already set it here */ + preferredpagesize = ps * 1024L; + SetPreferredPageSize(preferredpagesize); + } + else + { + UseMsg(); + } + } + else + { + UseMsg(); + } + } +#endif /* USE_MPSS */ #ifdef PANORAMIX else if ( strcmp( argv[i], "+xinerama") == 0){ noPanoramiXExtension = FALSE; } else if ( strcmp( argv[i], "-xinerama") == 0){ noPanoramiXExtension = TRUE; } #endif else if ( strcmp( argv[i], "-x") == 0) { if(++i >= argc) UseMsg(); /* For U**x, which doesn't support dynamic loading, there's nothing * to do when we see a -x. Either the extension is linked in or * it isn't */ } else if ( strcmp( argv[i], "-I") == 0) { /* ignore all remaining arguments */ break; @@ -1132,40 +1171,48 @@ else UseMsg(); } else if ( strcmp( argv[i], "-extension") == 0) { if (++i < argc) { if (!EnableDisableExtension(argv[i], FALSE)) EnableDisableExtensionError(argv[i], FALSE); } else UseMsg(); } else { ErrorF("Unrecognized option: %s\n", argv[i]); UseMsg(); FatalError("Unrecognized option: %s\n", argv[i]); } } + +#ifdef USE_MPSS + /* Set the page size to the (fallback) default if it wasn't set yet */ + if (preferredpagesize == -1) + { + SetPreferredPageSize(DEFAULT_MPSS_PAGESIZE); + } +#endif /* USE_MPSS */ } #ifdef COMMANDLINE_CHALLENGED_OPERATING_SYSTEMS static void InsertFileIntoCommandLine( int *resargc, char ***resargv, int prefix_argc, char **prefix_argv, char *filename, int suffix_argc, char **suffix_argv) { struct stat st; FILE *f; char *p; char *q; int insert_argc; char *buf; int len; int i; f = fopen(filename, "r"); @@ -2198,20 +2245,51 @@ retval = pam_authenticate(pamh, 0); if (retval != PAM_SUCCESS) { pam_end(pamh, retval); FatalError("PAM authentication failed, cannot start X server.\n" "\tPerhaps you do not have console ownership?\n"); } retval = pam_acct_mgmt(pamh, 0); if (retval != PAM_SUCCESS) { pam_end(pamh, retval); FatalError("PAM authentication failed, cannot start X server.\n" "\tPerhaps you do not have console ownership?\n"); } /* this is not a session, so do not do session management */ pam_end(pamh, PAM_SUCCESS); } #endif } + +#ifdef USE_MPSS +static +void SetPreferredPageSize(long size) +{ + struct memcntl_mha arg = { 0 }; + int retval; + + puts("start."); + + arg.mha_cmd = MHA_MAPSIZE_STACK; + arg.mha_flags = 0; + arg.mha_pagesize = size; + retval = memcntl(NULL, 0, MC_HAT_ADVISE, &arg, 0, 0); + if (retval != 0) { + ErrorF("memcntl(NULL, 0, MC_HAT_ADVISE, &arg, 0, 0) returned %d\n", retval); + } + + arg.mha_cmd = MHA_MAPSIZE_BSSBRK; + arg.mha_flags = 0; + arg.mha_pagesize = size; + retval = memcntl(NULL, 0, MC_HAT_ADVISE, &arg, 0, 0); + + if (retval != 0) { + ErrorF("memcntl(NULL, 0, MHA_MAPSIZE_BSSBRK, &arg, 0, 0) returned %d\n", retval); + } +} +#endif /* USE_MPSS */ + + +