Re: RC2 seems to need kern.smp.disabled=1

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <[email protected]>

On 2018-Nov-26, at 11:13, Dennis Clarke <dclarke at blastwave.org> wrote:


> Hello ppc64 types:
> 
> Merely an observation that RC1 was running more or less fine without the
> need to castrate the smp feature whereas RC2 won't even boot.

If you were able to smp boot a PowerMac G5 based on a version that
was based on:

#define VM_MAX_KERNEL_ADDRESS           0xe0000007ffffffffUL

from sys/powerpc/include/vmparam.h that is interesting.

This is the value I (and others?) have been reverting to:

#define VM_MAX_KERNEL_ADDRESS           0xe0000001c7ffffffUL

in order to allow smp use on such G5's. Quoting an old reply
from 2018-Oct-11 (-r??????'s are from 13-CURRENT):

QUOTE
Until the problems with -r334498 's adjustment to VM_MAX_KERNEL_ADDRESS
are dealt with, PowerMac G5's have boot problems (and possibly other
problems), at least those with multiple sockets (for what I can test).
(I've no access to other forms of PowerMac G5's.)
See:
https://lists.freebsd.org/pipermail/freebsd-ppc/2018-October/009669.html
and later in that thread. (Earlier in the thread is likely a waste of time
to read, given what is now known.)
My G5 contexts are operational by reverting -r334498 . The contexts are
otherwise based on -r339076 currently.
Note:
My boot test on a 8 GiByte, dual-socket, one "CPU" per socket,
PowerMac G5 met the conditions of Andreas Tobler's requested test
conditions and the machine boot fine (VM_MAX_KERNEL_ADDRESS near
the RAM size, on the low side).
The G5 so-called "Quad Core"s, 4 cores total in each system but
split evenly across 2 sockets in each), one with 12 GiByte and
one with 16 GiByte of RAM, booted fine as well. But
VM_MAX_KERNEL_ADDRESS was somewhat under 8GiByte and so not near
those sizes.
ENDQUOTE

> The fans
> just roar and it sits there roaring. So RC2 :
> 
> root@eris:~ # uname -a
> FreeBSD eris 12.0-RC2 FreeBSD 12.0-RC2 r340839 GENERIC  powerpc
> root@eris:~ # getconf -a | grep -i "NPROC"
> getconf: sysconf: _POSIX_FILE_LOCKING: Invalid argument
> getconf: sysconf: _POSIX_THREAD_SPORADIC_SERVER: Invalid argument
> getconf: sysconf: _POSIX_TRACE_EVENT_FILTER: Invalid argument
> getconf: sysconf: _POSIX_TRACE_INHERIT: Invalid argument
> getconf: sysconf: _POSIX_TRACE_LOG: Invalid argument
> getconf: sysconf: _XOPEN_VERSION: Invalid argument
> NPROCESSORS_CONF: 1
> NPROCESSORS_ONLN: 1
> root@eris:~ #
> 
> However the exact same machine was fine yesterday with RC1 :
> 
> eris$ /usr/bin/time -p ./factorial 20
> -------------------------------------------------------------
>        system name = FreeBSD
>          node name = eris
>            release = 12.0-RC1
>            version = FreeBSD 12.0-RC1 r340470 GENERIC
>            machine = powerpc
> -------------------------------------------------------------
> GMP  library version : 6.1.2
> inf : pagesize seems to be 4096
> inf : physical pages number seems to be 2085549
> inf : total memory seems to be 8542408704
> inf : number of configured processors seems to be 4
> inf : number of online processors seems to be 4
> -------------------------------------------------------------
> 
>             n       approx time in nanosecs
>       ---------+----------------------------
>         10000                 28782119 nsec
>         20000                113344390 nsec
>         30000                264088884 nsec
>         40000                482695132 nsec
>         50000                772446957 nsec
>         60000               1130731802 nsec
>         70000               1564791040 nsec
>         80000               2069463850 nsec
>         90000               2649433561 nsec
>        100000               3302860225 nsec
>        110000               4031924958 nsec
>        120000               4841946952 nsec
>        130000               5725338148 nsec
>        140000               6684564457 nsec
>        150000               7726752108 nsec
>        160000               8842535135 nsec
>        170000              10032317230 nsec
>        180000              11316147413 nsec
>        190000              12666156577 nsec
>        200000              14101113493 nsec
>       --------------------------------------
> real 98.35
> user 98.23
> sys 0.02
> 
> 
> Would love to see what anyone else gets from that same code.  Also what the heck is this double underscore "__BSD_VISIBLE" requirement in order to get reasonable data from sysconf()?
> 
> 
> /*********************************************************************
> * The Open Group Base Specifications Issue 6
> * IEEE Std 1003.1, 2004 Edition
> *
> *    An XSI-conforming application should ensure that the feature
> *    test macro _XOPEN_SOURCE is defined with the value 600 before
> *    inclusion of any header. This is needed to enable the
> *    functionality described in The _POSIX_C_SOURCE Feature Test
> *    Macro and in addition to enable the XSI extension.
> *
> *********************************************************************/
> #define _XOPEN_SOURCE 600
> #define __BSD_VISIBLE 1
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <stdint.h>
> #include <stddef.h>
> #include <string.h>
> #include <errno.h>
> #include <time.h>
> #include <assert.h>
> #include <locale.h>
> #include <unistd.h>
> #include <sys/utsname.h>
> 
> #include "gmp.h"
> 
> uint64_t timediff( struct timespec start, struct timespec end )
> {
>    /* return the delta time as a 64-bit positive number of
>     * nanoseconds.  Regardless of the time direction between
>     * start and end we always get a positive result. */
> 
>    struct timespec temp;
>    uint64_t s, n;
> 
>    if ( ( end.tv_nsec - start.tv_nsec ) < 0 ) {
>        /* make a full second adjustment to tv_sec */
>        temp.tv_sec = end.tv_sec - start.tv_sec - 1;
>        /* we have to add a full second to temp.tv_nsec */
>        temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
>    } else {
>        temp.tv_sec = end.tv_sec - start.tv_sec;
>        temp.tv_nsec = end.tv_nsec - start.tv_nsec;
>    }
>    s = (uint64_t) temp.tv_sec;
>    n = (uint64_t) temp.tv_nsec;
>    return ( s * (uint64_t)1000000000 + n );
> }
> 
> void gmp_fact( int n )
> {
>    int         i;
>    mpz_t       p;
> 
>    mpz_init_set_ui( p, 1 ); /* p = 1 */
>    for ( i = 1; i <= n ; ++i ) {
>        mpz_mul_ui( p, p, i ); /* p = p * i */
>    }
>    /* will fail wonderfully if n is large */
>    /******************************************************
>     ***** actually lets not bother to print anything *****
>     * fprintf ( stdout, "\n    %d!  =  ", n );
>     * mpz_out_str( stdout, 10, p );
>     * fprintf ( stdout, "\n\n" );
>     ******************************************************/
>    mpz_clear( p );
> 
> }
> 
> int main(int argc, char *argv[])
> {
>    int    n, k, state;
>    long pagesize, phypages, nproc_onln, nproc_cfg;
>    struct timespec    start, end;
>    struct utsname uname_data;
>    uint64_t t_delta;
> 
>    if ( argc <= 1) {
> usage:  fprintf ( stderr, "Usage: %s <number> \n", argv[0] );
>        fprintf ( stderr, "     : Where <number> is a positive " );
>        fprintf ( stderr, "integer for the number of loops to\n" );
>        fprintf ( stderr, "     : perform. In each loop a factorial" );
>        fprintf ( stderr, " shall be computed which is a\n" );
>        fprintf ( stderr, "     : multiple of ten thousand.\n" );
>        return ( EXIT_FAILURE );
>    } else {
>        n = (int) strtol( argv[1], (char **)NULL, 10);
>        if ( n < 0 ) goto usage;
>    }
> 
>    setlocale( LC_MESSAGES, "C" );
>    if ( uname( &uname_data ) < 0 ) {
>        fprintf ( stderr,
>                 "WARNING : Could not attain system uname data.\n" );
>        perror ( "uname" );
>    } else {
>        printf ( "-------------------------------" );
>        printf ( "------------------------------\n" );
>        printf ( "        system name = %s\n", uname_data.sysname );
>        printf ( "          node name = %s\n", uname_data.nodename );
>        printf ( "            release = %s\n", uname_data.release );
>        printf ( "            version = %s\n", uname_data.version );
>        printf ( "            machine = %s\n", uname_data.machine );
>        printf ( "-------------------------------" );
>        printf ( "------------------------------" );
>    }
>    printf ("\n");
> 
>    printf("GMP  library version : %d.%d.%d\n",
>            __GNU_MP_VERSION,
>            __GNU_MP_VERSION_MINOR,
>            __GNU_MP_VERSION_PATCHLEVEL );
> 
>    /* try to get an idea of system processors available and memory */
>    state = 1;
>    pagesize = sysconf(_SC_PAGESIZE);
>    if (pagesize == -1){
>        fprintf(stderr,
>                 "dbg : could not attain _SC_PAGESIZE\n     : %s\n",
>                                                     strerror(errno));
>        state = 0;
>    }else{
>        printf("inf : pagesize seems to be %i\n", pagesize);
>    }
>    phypages = sysconf(_SC_PHYS_PAGES);
>    if (phypages == -1){
>        fprintf(stderr,
>                 "dbg : could not attain _SC_PHYS_PAGES\n     : %s\n",
>                                                     strerror(errno));
>        state = 0;
>    }else{
>        printf("inf : physical pages number seems to be %i\n", phypages);
>    }
>    if(state){
>        printf("inf : total memory seems to be %llu\n",
>                            (uint64_t)pagesize * (uint64_t)phypages);
>    }else{
>        fprintf(stderr,"dbg : there is no way to determine system memory.\n");
>    }
> 
>    nproc_cfg = sysconf(_SC_NPROCESSORS_CONF);
>    if (nproc_cfg == -1){
>        fprintf(stderr,
>                 "dbg : could not attain _SC_NPROCESSORS_CONF\n     : %s\n",
>                                                     strerror(errno));
>    }else{
>        printf("inf : number of configured processors seems to be %i\n", nproc_cfg);
>    }
>    nproc_onln = sysconf(_SC_NPROCESSORS_ONLN);
>    if (nproc_onln == -1){
>        fprintf(stderr,
>                 "dbg : could not attain _SC_NPROCESSORS_ONLN\n     : %s\n",
>                                                      strerror(errno));
>    }else{
>        printf("inf : number of online processors seems to be %i\n", nproc_onln);
>    }
> 
>    printf("-------------------------------");
>    printf("------------------------------\n\n");
> 
>    printf("             n       approx time in nanosecs\n");
>    printf("       ---------+----------------------------\n");
> 
>    for ( k=0; k<n; k++ ) {
>        clock_gettime( CLOCK_MONOTONIC, &start );
>        gmp_fact( (k+1) * 10000 );
>        clock_gettime( CLOCK_MONOTONIC, &end );
> 
>        t_delta = timediff( start, end );
>        fprintf ( stdout, "        %6i         %16lld nsec\n",
>                                              (k+1) * 10000, t_delta );
>    }
>    printf ( "       --------------------------------------\n" );
> 
>    return ( EXIT_SUCCESS );
> }
> 
> Anyways I am going to see if there is a way around this ugly
> kern.smp.disabled requirement. Hope there is one.



===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.