We generally build the SMP kernel everywhere these days, and install using it. --- isys/isys.c | 17 -- isys/isys.py | 6 +- isys/smp.c | 651 --------------------------------------------------------- isys/smp.h | 26 --- yuminstall.py | 2 +- 5 files changed, 4 insertions(+), 698 deletions(-) delete mode 100644 isys/smp.c delete mode 100644 isys/smp.h diff --git a/isys/isys.c b/isys/isys.c index 0813e50..33b3782 100644 --- a/isys/isys.c +++ b/isys/isys.c @@ -77,7 +77,6 @@ #include "isys.h" #include "imount.h" #include "ethtool.h" -#include "smp.h" #include "lang.h" #include "eddsupport.h" #include "auditd.h" @@ -89,8 +88,6 @@ static PyObject * doMount(PyObject * s, PyObject * args); static PyObject * doUMount(PyObject * s, PyObject * args); -static PyObject * smpAvailable(PyObject * s, PyObject * args); -static PyObject * htAvailable(PyObject * s, PyObject * args); static PyObject * doSwapon(PyObject * s, PyObject * args); static PyObject * doSwapoff(PyObject * s, PyObject * args); static PyObject * doLoSetup(PyObject * s, PyObject * args); @@ -144,8 +141,6 @@ static PyMethodDef isysModuleMethods[] = { { "unlosetup", (PyCFunction) doUnLoSetup, METH_VARARGS, NULL }, { "ddfile", (PyCFunction) doDdFile, METH_VARARGS, NULL }, { "mount", (PyCFunction) doMount, METH_VARARGS, NULL }, - { "smpavailable", (PyCFunction) smpAvailable, METH_VARARGS, NULL }, - { "htavailable", (PyCFunction) htAvailable, METH_VARARGS, NULL }, { "umount", (PyCFunction) doUMount, METH_VARARGS, NULL }, { "resetresolv", (PyCFunction) doResetResolv, METH_VARARGS, NULL }, { "swapon", (PyCFunction) doSwapon, METH_VARARGS, NULL }, @@ -335,18 +330,6 @@ static PyObject * doSwapon (PyObject * s, PyObject * args) { return Py_None; } -static PyObject * smpAvailable(PyObject * s, PyObject * args) { - if (!PyArg_ParseTuple(args, "")) return NULL; - - return Py_BuildValue("i", detectSMP()); -} - -static PyObject * htAvailable(PyObject * s, PyObject * args) { - if (!PyArg_ParseTuple(args, "")) return NULL; - - return Py_BuildValue("i", detectHT()); -} - void init_isys(void) { PyObject * m, * d; diff --git a/isys/isys.py b/isys/isys.py index 5894617..ab905c9 100755 --- a/isys/isys.py +++ b/isys/isys.py @@ -387,9 +387,9 @@ def umount(what, removeDir = 1): ## Get the SMP status of the system. # @return True if this is an SMP system, False otherwise. def smpAvailable(): - return _isys.smpavailable() - -htavailable = _isys.htavailable + if os.sysconf(os.sysconf_names["SC_NPROCESSORS_CONF"]) > 1: + return 1 + return 0 ## Disable swap. # @param path The full path of the swap device to disable. diff --git a/isys/smp.c b/isys/smp.c deleted file mode 100644 index 6b01796..0000000 --- a/isys/smp.c +++ /dev/null @@ -1,651 +0,0 @@ -/* - * smp.c - * - * Copyright (C) 2007 Red Hat, Inc. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* -[_Anarchy_(alan@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)] you should do one check - though - if the board seems to be SMP and the CPU in /proc/cpuinfo is non - intel dont install an SMP kernel - thats a dual pentium board with a cyrix - or similar single cpu in it -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <string.h> -#include <errno.h> -#include <stdint.h> -#include <sys/types.h> - -#ifdef __alpha__ -int alphaDetectSMP(void) -{ - int issmp = 0; - FILE *f; - - f = fopen("/proc/cpuinfo", "r"); - if (f) { - char buff[1024]; - - while (fgets (buff, 1024, f) != NULL) { - if (!strncmp (buff, "cpus detected\t\t: ", 17)) { - if (strtoul (buff + 17, NULL, 0) > 1) - issmp = 1; - break; - } - } - fclose(f); - } else - return -1; - - return issmp; -} -#endif /* __alpha__ */ - - -#if defined (__s390__) || defined (__s390x__) -int s390DetectSMP(void) -{ - int issmp = 0; - FILE *f; - - f = fopen("/proc/cpuinfo", "r"); - if (f) { - char buff[1024]; - - while (fgets (buff, 1024, f) != NULL) { - if (!strncmp (buff, "# processors : ", 18)) { - if (strtoul (buff + 18, NULL, 0) > 1) - issmp = 1; - break; - } - } - fclose(f); - } else - return -1; - - return issmp; -} -#endif /* __s390__ */ - -#ifdef __sparc__ -int sparcDetectSMP(void) -{ - int issmp = 0; - FILE *f; - - f = fopen("/proc/cpuinfo", "r"); - if (f) { - char buff[1024]; - - while (fgets (buff, 1024, f) != NULL) { - if (!strncmp (buff, "ncpus probed\t: ", 15)) { - if (strtoul (buff + 15, NULL, 0) > 1) - issmp = 1; - break; - } - } - fclose(f); - } else - return -1; - - return issmp; -} -#endif /* __sparc__ */ - -#ifdef __powerpc__ -#include "minifind.h" - -/* FIXME: this won't work on iSeries */ -int powerpcDetectSMP(void) -{ - int issmp = -1; - FILE *f; - struct findNode *list = (struct findNode *) malloc(sizeof(struct findNode)); - struct pathNode *n; - - list->result = (struct pathNode *) malloc(sizeof(struct pathNode)); - list->result->path = NULL; - list->result->next = list->result; - - minifind("/proc/device-tree/cpus", "device_type", list); - - for (n = list->result->next; n != list->result; n = n->next) - { - f = fopen(n->path, "r"); - if (f) { - char buff[1024]; - while (fgets (buff, 1024, f) != NULL) { - if (!strncmp (buff, "cpu", 3)) - { - issmp++; - break; - } - } - fclose(f); - } - } - - return issmp; -} -#endif /* __powerpc__ */ - -#if defined(__i386__) || defined(__x86_64__) -/* - * Copyright (c) 1996, by Steve Passe - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the developer may NOT be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Id$ - */ - -/* - * mptable.c - */ - -#define VMAJOR 2 -#define VMINOR 0 -#define VDELTA 12 - -/* - * this will cause the raw mp table to be dumped to /tmp/mpdump - * -#define RAW_DUMP - */ - -#define MP_SIG 0x5f504d5f /* _MP_ */ -#define EXTENDED_PROCESSING_READY -#define OEM_PROCESSING_READY_NOT - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/types.h> - -#define LINUX 1 -#if LINUX -typedef uint32_t vm_offset_t; -#else -#include <machine/types.h> -#endif - -/* EBDA is @ 40:0e in real-mode terms */ -#define EBDA_POINTER 0x040e /* location of EBDA pointer */ - -/* CMOS 'top of mem' is @ 40:13 in real-mode terms */ -#define TOPOFMEM_POINTER 0x0413 /* BIOS: base memory size */ - -#define DEFAULT_TOPOFMEM 0xa0000 - -#define BIOS_BASE 0xf0000 -#define BIOS_BASE2 0xe0000 -#define BIOS_SIZE 0x10000 -#define ONE_KBYTE 1024 - -#define GROPE_AREA1 0x80000 -#define GROPE_AREA2 0x90000 -#define GROPE_SIZE 0x10000 - -/* MP Floating Pointer Structure */ -typedef struct MPFPS { - char signature[ 4 ]; - int32_t pap; - u_char length; - u_char spec_rev; - u_char checksum; - u_char mpfb1; - u_char mpfb2; - u_char mpfb3; - u_char mpfb4; - u_char mpfb5; -} mpfps_t; - -/* MP Configuration Table Header */ -typedef struct MPCTH { - char signature[ 4 ]; - uint16_t base_table_length; - u_char spec_rev; - u_char checksum; - char oem_id[ 8 ]; - char product_id[ 12 ]; - int32_t oem_table_pointer; - uint16_t oem_table_size; - uint16_t entry_count; - int32_t apic_address; - uint16_t extended_table_length; - u_char extended_table_checksum; - u_char reserved; -} mpcth_t; - -typedef struct PROCENTRY { - u_char type; - u_char apicID; - u_char apicVersion; - u_char cpuFlags; - uint32_t cpuSignature; - uint32_t featureFlags; - uint32_t reserved1; - uint32_t reserved2; -} ProcEntry; - -#define PROCENTRY_FLAG_EN 0x01 - -static int seekEntry( vm_offset_t addr ); -static void apic_probe( vm_offset_t* paddr, int* where ); -static void readEntry( void* entry, int size ); - -/* global data */ -static int pfd; /* physical /dev/mem fd */ -static int verbose = 0; -static int grope = 0; - -static int -readType() -{ - u_char type; - - if ( read( pfd, &type, sizeof( u_char ) ) != sizeof( u_char ) ) { -/* perror( "type read" ); */ -/* fprintf( stderr, "\npfd: %d", pfd ); */ -/* fflush( stderr ); */ -/* exit( 1 ); */ - return -1; - } - - if ( lseek( pfd, -1, SEEK_CUR ) < 0 ) { -/* perror( "type seek" ); */ -/* exit( 1 ); */ - return -1; - } - - return (int)type; -} - -#define MODE_SMP_CHECK 1 - -static int groupForSMP(int mode) -{ - vm_offset_t paddr; - int where; - mpfps_t mpfps; - int rc = 0; - int ncpus = 0; - - /* open physical memory for access to MP structures */ - if ( (pfd = open( "/dev/mem", O_RDONLY )) < 0 ) { - return 0; - } - - /* probe for MP structures */ - apic_probe( &paddr, &where ); - if ( where <= 0 ) - return 0; - - if (seekEntry( paddr )) - return 0; - readEntry( &mpfps, sizeof( mpfps_t ) ); - - if (mpfps.mpfb1) - /* old style */ - rc = 1; - else { - /* go to the config table */ - mpcth_t cth; - int count, i; - - paddr = (vm_offset_t) mpfps.pap; - if (seekEntry( paddr )) - return 0; - readEntry( &cth, sizeof( cth ) ); - /* if we don't have any entries, the kernel sure - won't be able to set up mp. Needs at least one entry - for smp kernel */ - if (cth.entry_count <= 1) { - close (pfd); - return 0; - } - - count = cth.entry_count; - for (i = 0; i < count; i++) { - if ( readType() == 0 ) { - ProcEntry entry; - readEntry( &entry, sizeof( entry ) ); - if (entry.cpuFlags & PROCENTRY_FLAG_EN) - ncpus++; - } - } - if (ncpus > 1) - rc = 1; - } - - close (pfd); - return rc; -} - -/* - * set PHYSICAL address of MP floating pointer structure - */ -#define NEXT(X) ((X) += 4) -static void -apic_probe( vm_offset_t* paddr, int* where ) -{ - /* - * c rewrite of apic_probe() by Jack F. Vogel - */ - - unsigned int x; - uint16_t segment; - vm_offset_t target; - uint32_t buffer[ BIOS_SIZE / sizeof( int32_t ) ]; - - if ( verbose ) - printf( "\n" ); - - /* search Extended Bios Data Area, if present */ - if ( verbose ) - printf( " looking for EBDA pointer @ 0x%04x, ", EBDA_POINTER ); - if (seekEntry( (vm_offset_t)EBDA_POINTER )) { - *where = 0; - *paddr = (vm_offset_t)0; - return; - } - readEntry( &segment, 2 ); - if ( segment ) { /* search EBDA */ - target = (vm_offset_t)segment << 4; - if ( verbose ) - printf( "found, searching EBDA @ 0x%08x\n", target ); - if (seekEntry( target )) { - *where = 0; - *paddr = (vm_offset_t)0; - return; - } - readEntry( buffer, ONE_KBYTE ); - - for ( x = 0; x < ONE_KBYTE / sizeof ( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 1; - *paddr = (x * sizeof( uint32_t )) + target; - return; - } - } - - } - else { - if ( verbose ) - printf( "NOT found\n" ); - } - - /* read CMOS for real top of mem */ - if (seekEntry( (vm_offset_t)TOPOFMEM_POINTER )) { - *where = 0; - *paddr = (vm_offset_t)0; - return; - } - readEntry( &segment, 2 ); - --segment; /* less ONE_KBYTE */ - target = segment * 1024; - if ( verbose ) - printf( " searching CMOS 'top of mem' @ 0x%08x (%dK)\n", - target, segment ); - seekEntry( target ); - readEntry( buffer, ONE_KBYTE ); - - for ( x = 0; x < ONE_KBYTE / sizeof ( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 2; - *paddr = (x * sizeof( uint32_t )) + target; - return; - } - } - - /* we don't necessarily believe CMOS, check base of the last 1K of 640K */ - if ( target != (DEFAULT_TOPOFMEM - 1024)) { - target = (DEFAULT_TOPOFMEM - 1024); - if ( verbose ) - printf( " searching default 'top of mem' @ 0x%08x (%dK)\n", - target, (target / 1024) ); - seekEntry( target ); - readEntry( buffer, ONE_KBYTE ); - - for ( x = 0; x < ONE_KBYTE / sizeof ( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 3; - *paddr = (x * sizeof( uint32_t )) + target; - return; - } - } - } - - /* search the BIOS */ - if ( verbose ) - printf( " searching BIOS @ 0x%08x\n", BIOS_BASE ); - seekEntry( BIOS_BASE ); - readEntry( buffer, BIOS_SIZE ); - - for ( x = 0; x < BIOS_SIZE / sizeof( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 4; - *paddr = (x * sizeof( uint32_t )) + BIOS_BASE; - return; - } - } - - /* search the extended BIOS */ - if ( verbose ) - printf( " searching extended BIOS @ 0x%08x\n", BIOS_BASE2 ); - seekEntry( BIOS_BASE2 ); - readEntry( buffer, BIOS_SIZE ); - - for ( x = 0; x < BIOS_SIZE / sizeof( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 5; - *paddr = (x * sizeof( uint32_t )) + BIOS_BASE2; - return; - } - } - - if ( grope ) { - /* search additional memory */ - target = GROPE_AREA1; - if ( verbose ) - printf( " groping memory @ 0x%08x\n", target ); - seekEntry( target ); - readEntry( buffer, GROPE_SIZE ); - - for ( x = 0; x < GROPE_SIZE / sizeof( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 6; - *paddr = (x * sizeof( uint32_t )) + GROPE_AREA1; - return; - } - } - - target = GROPE_AREA2; - if ( verbose ) - printf( " groping memory @ 0x%08x\n", target ); - seekEntry( target ); - readEntry( buffer, GROPE_SIZE ); - - for ( x = 0; x < GROPE_SIZE / sizeof( uint32_t ); NEXT(x) ) { - if ( buffer[ x ] == MP_SIG ) { - *where = 7; - *paddr = (x * sizeof( uint32_t )) + GROPE_AREA2; - return; - } - } - } - - *where = 0; - *paddr = (vm_offset_t)0; -} - - -/* - * - */ -static int -seekEntry( vm_offset_t addr ) -{ - if ( lseek( pfd, (off_t)addr, SEEK_SET ) < 0 ) { - return 1; - } - return 0; -} - - -/* - * - */ -static void -readEntry( void* entry, int size ) -{ - if ( read( pfd, entry, size ) != size ) { - return; - perror( "readEntry" ); - exit( 1 ); - } -} - -static int intelDetectSMP(void) -{ - return groupForSMP(MODE_SMP_CHECK); -} - -/* ---- end mptable mess ---- */ -#endif /* __i386__ || __x86_64__ */ - -#if defined(__i386__) -static inline unsigned int cpuid_ebx(int op) -{ - unsigned int eax, ebx; - - __asm__("pushl %%ebx; cpuid; movl %%ebx,%1; popl %%ebx" - : "=a" (eax), "=g" (ebx) - : "0" (op) - : "cx", "dx"); - return ebx; -} -#elif defined(__x86_64__) -static inline unsigned int cpuid_ebx(int op) -{ - unsigned int eax, ebx; - - __asm__("cpuid" - : "=a" (eax), "=b" (ebx) - : "0" (op) - : "cx", "dx"); - return ebx; -} -#endif - -#if defined(__i386__) || defined(__x86_64__) -/* XXX: rewrite using /proc/cpuinfo info if it there. Only fall - back to inline asm if it is not */ -int detectHT(void) -{ - FILE *f; - int htflag = 0; - uint32_t ebx = 0; - int smp_num_siblings = 0; - - f = fopen("/proc/cpuinfo", "r"); - if (f) { - char buff[1024]; - - while (fgets (buff, 1024, f) != NULL) { - if (!strncmp (buff, "flags\t\t:", 8)) { - if (strstr(buff, " ht ") || - /* buff includes \n, so back up 4 bytes from the end - and check there too to catch the end case */ - !strncmp(buff + strlen(buff) - 4, " ht", 3)) { - htflag = 1; - } - break; - } - } - fclose(f); - } - if (!htflag) - return 0; - - ebx = cpuid_ebx(1); - smp_num_siblings = (ebx & 0xff0000) >> 16; - - if (smp_num_siblings >= 2) - return 1; - return 0; -} - -#else /* ndef __i386__ */ - -int detectHT(void) -{ - return 0; -} - -#endif /* __i386__ */ - -int detectSMP(void) -{ - static int isSMP = -1; - - if (isSMP != -1) - return isSMP; - -#if defined (__i386__) || defined(__x86_64__) - return isSMP = intelDetectSMP(); -#elif defined (__sparc__) - return isSMP = sparcDetectSMP(); -#elif defined (__alpha__) - return isSMP = alphaDetectSMP(); -#elif defined (__s390__) || defined (__s390x__) - return isSMP = s390DetectSMP(); -#elif defined (__ia64__) || defined (__x86_64__) - return isSMP = 1; -#elif defined (__powerpc__) - return isSMP = powerpcDetectSMP(); -#elif defined (__arm__) - return isSMP = 0; -#else - #error unknown architecture -#endif -} diff --git a/isys/smp.h b/isys/smp.h deleted file mode 100644 index 651fa33..0000000 --- a/isys/smp.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * smp.h - * - * Copyright (C) 2007 Red Hat, Inc. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef SMP_H -#define SMP_H - -int detectSMP(void); -int detectHT(void); - -#endif /* SMP_H */ diff --git a/yuminstall.py b/yuminstall.py index c62c09b..7012fa4 100644 --- a/yuminstall.py +++ b/yuminstall.py @@ -1233,7 +1233,7 @@ reposdir=/etc/anaconda.repos.d,/tmp/updates/anaconda.repos.d,/tmp/product/anacon self.selectModulePackages(anaconda, k) foundkernel = True - if not foundkernel and (isys.smpAvailable() or isys.htavailable()): + if not foundkernel and isys.smpAvailable(): try: ksmp = getBestKernelByArch("kernel-smp", self.ayum) except PackageSackError: -- 1.6.1 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list