From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 08:59:46 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 91AE71065670; Sun, 13 Mar 2011 08:59:46 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7EF8E8FC13; Sun, 13 Mar 2011 08:59:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2D8xkHf047844; Sun, 13 Mar 2011 08:59:46 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2D8xkTi047841; Sun, 13 Mar 2011 08:59:46 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103130859.p2D8xkTi047841@svn.freebsd.org> From: Alexander Motin Date: Sun, 13 Mar 2011 08:59:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219593 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 08:59:46 -0000 Author: mav Date: Sun Mar 13 08:59:46 2011 New Revision: 219593 URL: http://svn.freebsd.org/changeset/base/219593 Log: Add support for SiI spare disks creation. Bunch of small improvements. Modified: projects/graid/head/sys/geom/raid/md_jmicron.c projects/graid/head/sys/geom/raid/md_sii.c Modified: projects/graid/head/sys/geom/raid/md_jmicron.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_jmicron.c Sun Mar 13 08:46:58 2011 (r219592) +++ projects/graid/head/sys/geom/raid/md_jmicron.c Sun Mar 13 08:59:46 2011 (r219593) @@ -235,7 +235,7 @@ jmicron_meta_put_name(struct jmicron_rai { memset(meta->name, 0x20, 16); - memcpy(meta->name, buf, MIN(strlen(meta->name), 16)); + memcpy(meta->name, buf, MIN(strlen(buf), 16)); } static int Modified: projects/graid/head/sys/geom/raid/md_sii.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_sii.c Sun Mar 13 08:46:58 2011 (r219592) +++ projects/graid/head/sys/geom/raid/md_sii.c Sun Mar 13 08:59:46 2011 (r219593) @@ -91,8 +91,7 @@ struct sii_raid_conf { uint8_t dummy_3; uint8_t name[16]; /* 151 - 158 */ uint16_t checksum; /* 159 */ - uint8_t ata_params_160_254[190]; - uint16_t ata_checksum; /* 255 */ + uint16_t ata_params_160_255[96]; } __packed; struct g_raid_md_sii_perdisk { @@ -254,7 +253,7 @@ sii_meta_put_name(struct sii_raid_conf * { memset(meta->name, 0x20, 16); - memcpy(meta->name, buf, MIN(strlen(meta->name), 16)); + memcpy(meta->name, buf, MIN(strlen(buf), 16)); } static struct sii_raid_conf * @@ -280,6 +279,14 @@ sii_meta_read(struct g_consumer *cp) memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize)); g_free(buf); + /* Check vendor ID. */ + if (meta->vendor_id != 0x1095) { + G_RAID_DEBUG(1, "SiI vendor ID check failed on %s (0x%04x)", + pp->name, meta->vendor_id); + free(meta, M_MD_SII); + return (NULL); + } + /* Check metadata major version. */ if (meta->version_major != 2) { G_RAID_DEBUG(1, "SiI version check failed on %s (%d.%d)", @@ -370,6 +377,33 @@ sii_meta_erase(struct g_consumer *cp) return (error); } +static int +sii_meta_write_spare(struct g_consumer *cp) +{ + struct sii_raid_conf *meta; + int error; + + meta = malloc(sizeof(*meta), M_MD_SII, M_WAITOK | M_ZERO); + meta->total_sectors = cp->provider->mediasize / + cp->provider->sectorsize - 0x800; + meta->vendor_id = 0x1095; + meta->version_minor = 0; + meta->version_major = 2; + meta->timestamp[0] = arc4random(); + meta->timestamp[1] = arc4random(); + meta->timestamp[2] = arc4random(); + meta->timestamp[3] = arc4random(); + meta->timestamp[4] = arc4random(); + meta->timestamp[5] = arc4random(); + meta->type = SII_T_SPARE; + meta->generation = 1; + meta->raid1_ident = 0xff; + meta->raid_location = arc4random(); + error = sii_meta_write(cp, meta); + free(meta, M_MD_SII); + return (error); +} + static struct g_raid_disk * g_raid_md_sii_get_disk(struct g_raid_softc *sc, int id) { @@ -1436,8 +1470,10 @@ g_raid_md_ctl_sii(struct g_raid_md_objec /* Welcome the "new" disk. */ update += g_raid_md_sii_start_disk(disk); - if (disk->d_state != G_RAID_DISK_S_ACTIVE && - disk->d_state != G_RAID_DISK_S_SPARE) { + if (disk->d_state == G_RAID_DISK_S_SPARE) { + sii_meta_write_spare(cp); + g_raid_destroy_disk(disk); + } else if (disk->d_state != G_RAID_DISK_S_ACTIVE) { gctl_error(req, "Disk '%s' doesn't fit.", diskname); g_raid_destroy_disk(disk); @@ -1549,14 +1585,14 @@ g_raid_md_write_sii(struct g_raid_md_obj if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) { pd->pd_meta->disk_number = sd->sd_pos; pd->pd_meta->raid0_ident = 0xff; - pd->pd_meta->raid1_ident = sd->sd_pos; + pd->pd_meta->raid1_ident = 0; } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { pd->pd_meta->disk_number = sd->sd_pos / meta->raid1_disks; pd->pd_meta->raid0_ident = sd->sd_pos % meta->raid1_disks; pd->pd_meta->raid1_ident = sd->sd_pos / meta->raid1_disks; } else { pd->pd_meta->disk_number = sd->sd_pos; - pd->pd_meta->raid0_ident = sd->sd_pos; + pd->pd_meta->raid0_ident = 0; pd->pd_meta->raid1_ident = 0xff; } } From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 19:07:59 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 02597106566C; Sun, 13 Mar 2011 19:07:59 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E49F98FC1C; Sun, 13 Mar 2011 19:07:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2DJ7wkV063418; Sun, 13 Mar 2011 19:07:58 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2DJ7wrD063414; Sun, 13 Mar 2011 19:07:58 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103131907.p2DJ7wrD063414@svn.freebsd.org> From: Alexander Motin Date: Sun, 13 Mar 2011 19:07:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219619 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 19:07:59 -0000 Author: mav Date: Sun Mar 13 19:07:58 2011 New Revision: 219619 URL: http://svn.freebsd.org/changeset/base/219619 Log: Add few more bricks to the Promise metadata module. Add free_volume() method to metadata API to allow private data cleanup on volume destruction. Unlike previous, Promise uses many per-volume data. Modified: projects/graid/head/sys/geom/raid/g_raid.c projects/graid/head/sys/geom/raid/g_raid_md_if.m projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Sun Mar 13 18:26:16 2011 (r219618) +++ projects/graid/head/sys/geom/raid/g_raid.c Sun Mar 13 19:07:58 2011 (r219619) @@ -1704,6 +1704,8 @@ g_raid_create_volume(struct g_raid_softc vol->v_softc = sc; strlcpy(vol->v_name, name, G_RAID_MAX_VOLUMENAME); vol->v_state = G_RAID_VOLUME_S_STARTING; + vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; + vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_UNKNOWN; bioq_init(&vol->v_inflight); bioq_init(&vol->v_locked); LIST_INIT(&vol->v_locks); @@ -1878,6 +1880,8 @@ g_raid_destroy_volume(struct g_raid_volu TAILQ_REMOVE(&disk->d_subdisks, &vol->v_subdisks[i], sd_next); } G_RAID_DEBUG1(2, sc, "Volume %s destroyed.", vol->v_name); + if (sc->sc_md) + G_RAID_MD_FREE_VOLUME(sc->sc_md, vol); free(vol, M_RAID); if (sc->sc_stopping == G_RAID_DESTROY_HARD) { /* Wake up worker to let it selfdestruct. */ @@ -1905,8 +1909,6 @@ g_raid_destroy_disk(struct g_raid_disk * sd->sd_disk = NULL; } TAILQ_REMOVE(&sc->sc_disks, disk, d_next); - if (sc->sc_md) - G_RAID_MD_FREE_DISK(sc->sc_md, disk); free(disk, M_RAID); return (0); } Modified: projects/graid/head/sys/geom/raid/g_raid_md_if.m ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid_md_if.m Sun Mar 13 18:26:16 2011 (r219618) +++ projects/graid/head/sys/geom/raid/g_raid_md_if.m Sun Mar 13 19:07:58 2011 (r219619) @@ -62,6 +62,22 @@ CODE { return (-1); } + + static int + g_raid_md_free_disk_default(struct g_raid_md_object *md, + struct g_raid_volume *vol) + { + + return (0); + } + + static int + g_raid_md_free_volume_default(struct g_raid_md_object *md, + struct g_raid_volume *vol) + { + + return (0); + } }; # create() - create new node from scratch. @@ -111,7 +127,13 @@ METHOD int fail_disk { METHOD int free_disk { struct g_raid_md_object *md; struct g_raid_disk *disk; -}; +} DEFAULT g_raid_md_free_disk_default; + +# free_volume() - volume destructor. +METHOD int free_volume { + struct g_raid_md_object *md; + struct g_raid_volume *vol; +} DEFAULT g_raid_md_free_volume_default; # free() - destructor. METHOD int free { Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Sun Mar 13 18:26:16 2011 (r219618) +++ projects/graid/head/sys/geom/raid/md_promise.c Sun Mar 13 19:07:58 2011 (r219619) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2010 Alexander Motin + * Copyright (c) 2011 Alexander Motin * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,6 +46,7 @@ static MALLOC_DEFINE(M_MD_PROMISE, "md_p #define PROMISE_MAX_DISKS 8 #define PROMISE_MAX_SUBDISKS 4 +#define PROMISE_META_OFFSET 14 struct promise_raid_disk { uint8_t flags; /* Subdisk status. */ @@ -121,17 +122,22 @@ struct promise_raid_conf { struct g_raid_md_promise_perdisk { int pd_subdisks; - struct { - struct promise_raid_conf *pd_meta; - int pd_disk_pos; - struct promise_raid_disk pd_disk_meta; - } pd_subdisk[PROMISE_MAX_SUBDISKS]; + struct promise_raid_conf *pd_meta[PROMISE_MAX_SUBDISKS]; +// struct { +// int pd_disk_pos; +// struct promise_raid_disk pd_disk_meta; +// } pd_subdisk[PROMISE_MAX_SUBDISKS]; +}; + +struct g_raid_md_promise_pervolume { + uint64_t pv_id; + uint16_t pv_generation; + int pv_disks_present; + struct promise_raid_conf *pv_meta; }; struct g_raid_md_promise_object { struct g_raid_md_object mdio_base; - uint32_t mdio_generation; - struct promise_raid_conf *mdio_meta; struct callout mdio_start_co; /* STARTING state timer. */ int mdio_disks_present; int mdio_started; @@ -146,6 +152,7 @@ static g_raid_md_ctl_t g_raid_md_ctl_pro static g_raid_md_write_t g_raid_md_write_promise; static g_raid_md_fail_disk_t g_raid_md_fail_disk_promise; static g_raid_md_free_disk_t g_raid_md_free_disk_promise; +static g_raid_md_free_volume_t g_raid_md_free_volume_promise; static g_raid_md_free_t g_raid_md_free_promise; static kobj_method_t g_raid_md_promise_methods[] = { @@ -156,6 +163,7 @@ static kobj_method_t g_raid_md_promise_m KOBJMETHOD(g_raid_md_write, g_raid_md_write_promise), KOBJMETHOD(g_raid_md_fail_disk, g_raid_md_fail_disk_promise), KOBJMETHOD(g_raid_md_free_disk, g_raid_md_free_disk_promise), + KOBJMETHOD(g_raid_md_free_volume, g_raid_md_free_volume_promise), KOBJMETHOD(g_raid_md_free, g_raid_md_free_promise), { 0, 0 } }; @@ -207,7 +215,6 @@ g_raid_md_promise_print(struct promise_r printf("=================================================\n"); } -#if 0 static struct promise_raid_conf * promise_meta_copy(struct promise_raid_conf *meta) { @@ -217,8 +224,8 @@ promise_meta_copy(struct promise_raid_co memcpy(nmeta, meta, sizeof(*nmeta)); return (nmeta); } -#endif +#if 0 static int promise_meta_find_disk(struct promise_raid_conf *meta, uint64_t id) { @@ -230,26 +237,28 @@ promise_meta_find_disk(struct promise_ra } return (-1); } +#endif -static struct promise_raid_conf * -promise_meta_read(struct g_consumer *cp) +static int +promise_meta_read(struct g_consumer *cp, struct promise_raid_conf **metaarr) { struct g_provider *pp; struct promise_raid_conf *meta; char *buf; - int error, i; + int error, i, subdisks; uint32_t checksum, *ptr; pp = cp->provider; - - /* Read the anchor sector. */ - buf = g_read_data(cp, - pp->mediasize - pp->sectorsize * 63, + subdisks = 0; +next: + /* Read metadata block. */ + buf = g_read_data(cp, pp->mediasize - pp->sectorsize * + (63 - subdisks * PROMISE_META_OFFSET), pp->sectorsize * 4, &error); if (buf == NULL) { G_RAID_DEBUG(1, "Cannot read metadata from %s (error=%d).", pp->name, error); - return (NULL); + return (subdisks); } meta = (struct promise_raid_conf *)buf; @@ -258,7 +267,7 @@ promise_meta_read(struct g_consumer *cp) strncmp(meta->promise_id, FREEBSD_MAGIC, strlen(FREEBSD_MAGIC))) { G_RAID_DEBUG(1, "Promise signature check failed on %s", pp->name); g_free(buf); - return (NULL); + return (subdisks); } meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK); memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize * 4)); @@ -270,16 +279,23 @@ promise_meta_read(struct g_consumer *cp) if (checksum != meta->checksum) { G_RAID_DEBUG(1, "Promise checksum check failed on %s", pp->name); free(meta, M_MD_PROMISE); - return (NULL); + return (subdisks); } if ((meta->integrity & PROMISE_I_VALID) == 0) { G_RAID_DEBUG(1, "Promise metadata is invalid on %s", pp->name); free(meta, M_MD_PROMISE); - return (NULL); + return (subdisks); } - return (meta); + /* Save this part and look for next. */ + *metaarr = meta; + metaarr++; + subdisks++; + if (subdisks < PROMISE_MAX_SUBDISKS) + goto next; + + return (subdisks); } #if 0 @@ -376,19 +392,21 @@ g_raid_md_promise_get_disk(struct g_raid } return (disk); } +#endif static struct g_raid_volume * -g_raid_md_promise_get_volume(struct g_raid_softc *sc, int id) +g_raid_md_promise_get_volume(struct g_raid_softc *sc, uint64_t id) { - struct g_raid_volume *mvol; + struct g_raid_volume *vol; + struct g_raid_md_promise_pervolume *pv; - TAILQ_FOREACH(mvol, &sc->sc_volumes, v_next) { - if ((intptr_t)(mvol->v_md_data) == id) + TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { + pv = vol->v_md_data; + if (pv->pv_id == id) break; } - return (mvol); + return (vol); } -#endif static int g_raid_md_promise_supported(int level, int qual, int disks, int force) @@ -656,6 +674,7 @@ nofit: return (0); } +#if 0 static void g_disk_md_promise_retaste(void *arg, int pending) { @@ -664,10 +683,12 @@ g_disk_md_promise_retaste(void *arg, int g_retaste(&g_raid_class); free(arg, M_MD_PROMISE); } +#endif static void g_raid_md_promise_refill(struct g_raid_softc *sc) { +#if 0 struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; struct promise_raid_conf *meta; @@ -727,6 +748,7 @@ g_raid_md_promise_refill(struct g_raid_s TASK_INIT(task, 0, g_disk_md_promise_retaste, task); taskqueue_enqueue(taskqueue_swi, task); } +#endif } static void @@ -845,40 +867,61 @@ g_raid_md_promise_start(struct g_raid_so static void g_raid_md_promise_new_disk(struct g_raid_disk *disk) { -#if 0 struct g_raid_softc *sc; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; struct promise_raid_conf *pdmeta; struct g_raid_md_promise_perdisk *pd; + struct g_raid_md_promise_pervolume *pv; + struct g_raid_volume *vol; + int i; sc = disk->d_softc; md = sc->sc_md; mdi = (struct g_raid_md_promise_object *)md; pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - pdmeta = pd->pd_meta; - if (mdi->mdio_started) { - if (g_raid_md_promise_start_disk(disk)) - g_raid_md_write_promise(md, NULL, NULL, NULL); - } else { + for (i = 0; i < pd->pd_subdisks; i++) { + pdmeta = pd->pd_meta[i]; + + /* Look for volume with matching ID. */ + vol = g_raid_md_promise_get_volume(sc, + pdmeta->volume_id); + if (vol == NULL) { + vol = g_raid_create_volume(sc, pdmeta->name); + pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO); + pv->pv_id = pdmeta->volume_id; + vol->v_md_data = pv; + g_raid_start_volume(vol); + } else + pv = vol->v_md_data; + /* If we haven't started yet - check metadata freshness. */ - if (mdi->mdio_meta == NULL || - ((int32_t)(pdmeta->generation - mdi->mdio_generation)) > 0) { + if (pv->pv_meta != NULL && mdi->mdio_started) + continue; + if (pv->pv_meta == NULL || + ((int16_t)(pdmeta->generation - pv->pv_generation)) > 0) { G_RAID_DEBUG1(1, sc, "Newer disk"); - if (mdi->mdio_meta != NULL) - free(mdi->mdio_meta, M_MD_PROMISE); - mdi->mdio_meta = promise_meta_copy(pdmeta); - mdi->mdio_generation = mdi->mdio_meta->generation; - mdi->mdio_disks_present = 1; - } else if (pdmeta->generation == mdi->mdio_generation) { - mdi->mdio_disks_present++; + if (pv->pv_meta != NULL) + free(pv->pv_meta, M_MD_PROMISE); + pv->pv_meta = promise_meta_copy(pdmeta); + pv->pv_generation = pv->pv_meta->generation; + pv->pv_disks_present = 1; + } else if (pdmeta->generation == pv->pv_generation) { + pv->pv_disks_present++; G_RAID_DEBUG1(1, sc, "Matching disk (%d of %d up)", - mdi->mdio_disks_present, - mdi->mdio_meta->total_disks); + pv->pv_disks_present, + pv->pv_meta->total_disks); } else { G_RAID_DEBUG1(1, sc, "Older disk"); } + } + +#if 0 + if (mdi->mdio_started) { + if (g_raid_md_promise_start_disk(disk)) + g_raid_md_write_promise(md, NULL, NULL, NULL); + } else { /* If we collected all needed disks - start array. */ if (mdi->mdio_disks_present == mdi->mdio_meta->total_disks) g_raid_md_promise_start(sc); @@ -913,7 +956,6 @@ g_raid_md_create_promise(struct g_raid_m char name[16]; mdi = (struct g_raid_md_promise_object *)md; - mdi->mdio_generation = 0; snprintf(name, sizeof(name), "Promise"); sc = g_raid_create_node(mp, name, md); if (sc == NULL) @@ -932,10 +974,10 @@ g_raid_md_taste_promise(struct g_raid_md struct g_raid_md_promise_object *mdi, *mdi1; struct g_raid_softc *sc; struct g_raid_disk *disk; - struct promise_raid_conf *meta; + struct promise_raid_conf *meta, *metaarr[4]; struct g_raid_md_promise_perdisk *pd; struct g_geom *geom; - int error, disk_pos, result, spare, len; + int error, i, result, spare, len, subdisks; char name[16]; uint16_t vendor; @@ -947,43 +989,36 @@ g_raid_md_taste_promise(struct g_raid_md meta = NULL; spare = 0; vendor = 0xffff; - disk_pos = 0; if (g_access(cp, 1, 0, 0) != 0) return (G_RAID_MD_TASTE_FAIL); g_topology_unlock(); len = 2; if (pp->geom->rank == 1) g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); - meta = promise_meta_read(cp); + subdisks = promise_meta_read(cp, metaarr); g_topology_lock(); g_access(cp, -1, 0, 0); - if (meta == NULL) { + if (subdisks == 0) { if (g_raid_aggressive_spare) { - if (vendor == 0x8086) { + if (vendor == 0x105a || vendor == 0x1002) { G_RAID_DEBUG(1, "No Promise metadata, forcing spare."); spare = 2; goto search; } else { G_RAID_DEBUG(1, - "Promise vendor mismatch 0x%04x != 0x8086", + "Promise vendor mismatch " + "0x%04x != 0x105a/0x1002", vendor); } } return (G_RAID_MD_TASTE_FAIL); } - /* Check this disk position in obtained metadata. */ - disk_pos = promise_meta_find_disk(meta, meta->disk.id); - if (disk_pos < 0) { - G_RAID_DEBUG(1, "Promise id 0x%016jx not found", meta->disk.id); - goto fail1; - } - /* Metadata valid. Print it. */ - g_raid_md_promise_print(meta); - G_RAID_DEBUG(1, "Promise disk position %d", disk_pos); - spare = meta->disks[disk_pos].flags & PROMISE_F_SPARE; + for (i = 0; i < subdisks; i++) + g_raid_md_promise_print(metaarr[i]); + spare = 0;//meta->disks[disk_pos].flags & PROMISE_F_SPARE; search: /* Search for matching node. */ @@ -1028,8 +1063,10 @@ search: sx_xlock(&sc->sc_lock); pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); + pd->pd_subdisks = subdisks; + for (i = 0; i < subdisks; i++) + pd->pd_meta[i] = metaarr[i]; #if 0 - pd->pd_meta = meta; pd->pd_disk_pos = -1; if (spare == 2) { // pd->pd_disk_meta.sectors = pp->mediasize / pp->sectorsize; @@ -1059,9 +1096,9 @@ search: g_topology_lock(); *gp = geom; return (result); -fail1: - free(meta, M_MD_PROMISE); - return (G_RAID_MD_TASTE_FAIL); +//fail1: +// free(meta, M_MD_PROMISE); +// return (G_RAID_MD_TASTE_FAIL); } static int @@ -2033,9 +2070,9 @@ g_raid_md_free_disk_promise(struct g_rai pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; for (i = 0; i < pd->pd_subdisks; i++) { - if (pd->pd_subdisk[i].pd_meta != NULL) { - free(pd->pd_subdisk[i].pd_meta, M_MD_PROMISE); - pd->pd_subdisk[i].pd_meta = NULL; + if (pd->pd_meta[i] != NULL) { + free(pd->pd_meta[i], M_MD_PROMISE); + pd->pd_meta[i] = NULL; } } free(pd, M_MD_PROMISE); @@ -2044,6 +2081,20 @@ g_raid_md_free_disk_promise(struct g_rai } static int +g_raid_md_free_volume_promise(struct g_raid_md_object *md, + struct g_raid_volume *vol) +{ + struct g_raid_md_promise_pervolume *pv; + + pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; + if (pv && pv->pv_meta != NULL) { + free(pv->pv_meta, M_MD_PROMISE); + pv->pv_meta = NULL; + } + return (0); +} + +static int g_raid_md_free_promise(struct g_raid_md_object *md) { struct g_raid_md_promise_object *mdi; @@ -2057,10 +2108,6 @@ g_raid_md_free_promise(struct g_raid_md_ root_mount_rel(mdi->mdio_rootmount); mdi->mdio_rootmount = NULL; } - if (mdi->mdio_meta != NULL) { - free(mdi->mdio_meta, M_MD_PROMISE); - mdi->mdio_meta = NULL; - } return (0); } From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 20:01:00 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D96B7106566C; Sun, 13 Mar 2011 20:01:00 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C8B1C8FC0A; Sun, 13 Mar 2011 20:01:00 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2DK10jx064615; Sun, 13 Mar 2011 20:01:00 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2DK10NC064613; Sun, 13 Mar 2011 20:01:00 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103132001.p2DK10NC064613@svn.freebsd.org> From: Alexander Motin Date: Sun, 13 Mar 2011 20:01:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219622 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 20:01:00 -0000 Author: mav Date: Sun Mar 13 20:01:00 2011 New Revision: 219622 URL: http://svn.freebsd.org/changeset/base/219622 Log: Restore accidentally removed free_disk() call. Modified: projects/graid/head/sys/geom/raid/g_raid.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Sun Mar 13 19:35:13 2011 (r219621) +++ projects/graid/head/sys/geom/raid/g_raid.c Sun Mar 13 20:01:00 2011 (r219622) @@ -1909,6 +1909,8 @@ g_raid_destroy_disk(struct g_raid_disk * sd->sd_disk = NULL; } TAILQ_REMOVE(&sc->sc_disks, disk, d_next); + if (sc->sc_md) + G_RAID_MD_FREE_DISK(sc->sc_md, disk); free(disk, M_RAID); return (0); } From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 21:51:47 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B1C1A106566B; Sun, 13 Mar 2011 21:51:47 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9F5A78FC14; Sun, 13 Mar 2011 21:51:47 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2DLpljo066951; Sun, 13 Mar 2011 21:51:47 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2DLplTY066942; Sun, 13 Mar 2011 21:51:47 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103132151.p2DLplTY066942@svn.freebsd.org> From: Jeff Roberson Date: Sun, 13 Mar 2011 21:51:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219625 - in projects/ofed/head/sys/ofed: drivers/infiniband/core include/linux include/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 21:51:47 -0000 Author: jeff Date: Sun Mar 13 21:51:47 2011 New Revision: 219625 URL: http://svn.freebsd.org/changeset/base/219625 Log: - Fix several object reference leaks that prevent module unloading. - Acquire and release Giant in the right places for devclass. - Don't include opt_inet6.h in module builds. - Fix missing dev_t assignment in the cdev code. - Add kobject types for cdevs. Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/sysfs.c projects/ofed/head/sys/ofed/drivers/infiniband/core/uverbs_main.c projects/ofed/head/sys/ofed/include/linux/cdev.h projects/ofed/head/sys/ofed/include/linux/device.h projects/ofed/head/sys/ofed/include/linux/in6.h projects/ofed/head/sys/ofed/include/linux/list.h projects/ofed/head/sys/ofed/include/linux/pci.h projects/ofed/head/sys/ofed/include/net/ipv6.h Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/sysfs.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/core/sysfs.c Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/drivers/infiniband/core/sysfs.c Sun Mar 13 21:51:47 2011 (r219625) @@ -522,7 +522,7 @@ static int add_port(struct ib_device *de p->port_num = port_num; ret = kobject_init_and_add(&p->kobj, &port_type, - kobject_get(device->ports_parent), + device->ports_parent, "%d", port_num); if (ret) goto err_put; @@ -810,7 +810,7 @@ int ib_device_register_sysfs(struct ib_d } device->ports_parent = kobject_create_and_add("ports", - kobject_get(&class_dev->kobj)); + &class_dev->kobj); if (!device->ports_parent) { ret = -ENOMEM; goto err_put; Modified: projects/ofed/head/sys/ofed/drivers/infiniband/core/uverbs_main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/core/uverbs_main.c Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/drivers/infiniband/core/uverbs_main.c Sun Mar 13 21:51:47 2011 (r219625) @@ -891,6 +891,7 @@ static void ib_uverbs_remove_one(struct if (!uverbs_dev) return; + sysfs_remove_group(&uverbs_dev->dev->kobj, &device_group); dev_set_drvdata(uverbs_dev->dev, NULL); device_destroy(uverbs_class, uverbs_dev->cdev->dev); cdev_del(uverbs_dev->cdev); Modified: projects/ofed/head/sys/ofed/include/linux/cdev.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/cdev.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/linux/cdev.h Sun Mar 13 21:51:47 2011 (r219625) @@ -48,10 +48,39 @@ struct linux_cdev { }; static inline void +cdev_release(struct kobject *kobj) +{ + struct linux_cdev *cdev; + + cdev = container_of(kobj, struct linux_cdev, kobj); + if (cdev->cdev) + destroy_dev(cdev->cdev); + kfree(cdev); +} + +static inline void +cdev_static_release(struct kobject *kobj) +{ + struct linux_cdev *cdev; + + cdev = container_of(kobj, struct linux_cdev, kobj); + if (cdev->cdev) + destroy_dev(cdev->cdev); +} + +static struct kobj_type cdev_ktype = { + .release = cdev_release, +}; + +static struct kobj_type cdev_static_ktype = { + .release = cdev_static_release, +}; + +static inline void cdev_init(struct linux_cdev *cdev, const struct file_operations *ops) { - kobject_init(&cdev->kobj, NULL); + kobject_init(&cdev->kobj, &cdev_static_ktype); cdev->ops = ops; } @@ -60,10 +89,9 @@ cdev_alloc(void) { struct linux_cdev *cdev; - /* XXX Need cdev_ktype */ cdev = kzalloc(sizeof(struct linux_cdev), M_WAITOK); if (cdev) - kobject_init(&cdev->kobj, NULL); + kobject_init(&cdev->kobj, &cdev_ktype); return (cdev); } @@ -80,6 +108,7 @@ cdev_add(struct linux_cdev *cdev, dev_t panic("cdev_add: Unsupported count: %d", count); cdev->cdev = make_dev(&linuxcdevsw, MINOR(dev), 0, 0, 0700, kobject_name(&cdev->kobj)); + cdev->dev = dev; cdev->cdev->si_drv1 = cdev; return (0); @@ -88,10 +117,11 @@ cdev_add(struct linux_cdev *cdev, dev_t static inline void cdev_del(struct linux_cdev *cdev) { - if (cdev->cdev) + if (cdev->cdev) { destroy_dev(cdev->cdev); + cdev->cdev = NULL; + } kobject_put(&cdev->kobj); - kfree(cdev); /* XXX ref cnt */ } #define cdev linux_cdev Modified: projects/ofed/head/sys/ofed/include/linux/device.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/device.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/linux/device.h Sun Mar 13 21:51:47 2011 (r219625) @@ -275,16 +275,15 @@ device_register(struct device *dev) unit = -1; if (bsddev == NULL) bsddev = device_add_child(dev->parent->bsddev, - dev->kobj.name, unit); + dev->class->kobj.name, unit); if (bsddev) { if (dev->devt == 0) - dev->devt = device_get_unit(bsddev); + dev->devt = makedev(0, device_get_unit(bsddev)); device_set_softc(bsddev, dev); } dev->bsddev = bsddev; kobject_init(&dev->kobj, &dev_ktype); kobject_add(&dev->kobj, &dev->class->kobj, dev_name(dev)); - get_device(dev); return (0); } @@ -308,17 +307,13 @@ struct device *device_create(struct clas static inline void device_destroy(struct class *class, dev_t devt) { - struct device *dev; device_t bsddev; int unit; unit = MINOR(devt); bsddev = devclass_get_device(class->bsdclass, unit); - if (bsddev) { - dev = device_get_softc(bsddev); - device_unregister(dev); - put_device(dev); - } + if (bsddev) + device_unregister(device_get_softc(bsddev)); } static inline void Modified: projects/ofed/head/sys/ofed/include/linux/in6.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/in6.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/linux/in6.h Sun Mar 13 21:51:47 2011 (r219625) @@ -29,6 +29,8 @@ #ifndef _LINUX_IN6_H_ #define _LINUX_IN6_H_ +#ifndef KLD_MODULE #include "opt_inet6.h" +#endif #endif /* _LINUX_IN6_H_ */ Modified: projects/ofed/head/sys/ofed/include/linux/list.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/list.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/linux/list.h Sun Mar 13 21:51:47 2011 (r219625) @@ -49,15 +49,13 @@ #include #include #include +#include #include #include -#include "opt_inet6.h" -#ifdef INET6 #include #include -#endif #include #include Modified: projects/ofed/head/sys/ofed/include/linux/pci.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/pci.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/linux/pci.h Sun Mar 13 21:51:47 2011 (r219625) @@ -178,7 +178,7 @@ pci_resource_len(struct pci_dev *pdev, i } /* - * XXX All drivers just seem to want to inspect the type not flags. + * All drivers just seem to want to inspect the type not flags. */ static inline int pci_resource_flags(struct pci_dev *pdev, int bar) @@ -429,6 +429,7 @@ linux_pci_attach(device_t dev) spin_lock(&pci_lock); list_del(&pdev->links); spin_unlock(&pci_lock); + put_device(&pdev->dev); return (-error); } return (0); @@ -440,10 +441,14 @@ linux_pci_detach(device_t dev) struct pci_dev *pdev; pdev = device_get_softc(dev); + mtx_unlock(&Giant); pdev->pdrv->remove(pdev); + mtx_lock(&Giant); spin_lock(&pci_lock); list_del(&pdev->links); spin_unlock(&pci_lock); + put_device(&pdev->dev); + return (0); } @@ -483,7 +488,9 @@ pci_unregister_driver(struct pci_driver list_del(&pdrv->links); bus = devclass_find("pci"); + mtx_lock(&Giant); devclass_delete_driver(bus, &pdrv->driver); + mtx_unlock(&Giant); } struct msix_entry { Modified: projects/ofed/head/sys/ofed/include/net/ipv6.h ============================================================================== --- projects/ofed/head/sys/ofed/include/net/ipv6.h Sun Mar 13 21:23:25 2011 (r219624) +++ projects/ofed/head/sys/ofed/include/net/ipv6.h Sun Mar 13 21:51:47 2011 (r219625) @@ -29,7 +29,9 @@ #ifndef _LINUX_NET_IPV6_H_ #define _LINUX_NET_IPV6_H_ +#ifndef KLD_MODULE #include "opt_inet6.h" +#endif #define ipv6_addr_loopback IN6_IS_ADDR_LOOPBACK #define ipv6_addr_copy(dst, src) \ From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 22:04:19 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EB21E106566B; Sun, 13 Mar 2011 22:04:19 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D9B8E8FC15; Sun, 13 Mar 2011 22:04:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2DM4JUO067330; Sun, 13 Mar 2011 22:04:19 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2DM4JN0067327; Sun, 13 Mar 2011 22:04:19 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103132204.p2DM4JN0067327@svn.freebsd.org> From: Marcel Moolenaar Date: Sun, 13 Mar 2011 22:04:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219626 - projects/altix/sys/boot/ia64/common X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 22:04:20 -0000 Author: marcel Date: Sun Mar 13 22:04:19 2011 New Revision: 219626 URL: http://svn.freebsd.org/changeset/base/219626 Log: o Make sure the page table has a size that is mappable. Certain page sizes are not supported. o Map the PBVM page table. o Map the PBVM using the largest possible power of 2 that is less than the amount of PBVM used and round down to a valid page size. Note that the current kernel is between 8MB and 16MB in size, which would mean that 8MB would be the typical size of the mapping, if only 8MB wasn't an invalid page size. In practice, we end up mapping the first 4MB of PBVM in most cases. Modified: projects/altix/sys/boot/ia64/common/copy.c projects/altix/sys/boot/ia64/common/exec.c Modified: projects/altix/sys/boot/ia64/common/copy.c ============================================================================== --- projects/altix/sys/boot/ia64/common/copy.c Sun Mar 13 21:51:47 2011 (r219625) +++ projects/altix/sys/boot/ia64/common/copy.c Sun Mar 13 22:04:19 2011 (r219626) @@ -43,6 +43,8 @@ pgtbl_extend(u_int idx) u_int pot; pgtblsz = (idx + 1) << 3; + + /* The minimum size is 4KB. */ if (pgtblsz < 4096) pgtblsz = 4096; @@ -52,6 +54,14 @@ pgtbl_extend(u_int idx) pgtblsz = pgtblsz | (pgtblsz >> pot); pgtblsz++; + /* The maximum size is 1MB. */ + if (pgtblsz > 1048576) + return (ENOMEM); + + /* Make sure the size is a valid (mappable) page size. */ + if (pgtblsz == 32*1024 || pgtblsz == 128*1024 || pgtblsz == 512*1024) + pgtblsz <<= 1; + /* Allocate naturally aligned memory. */ pgtbl = (void *)ia64_platform_alloc(0, pgtblsz); if (pgtbl == NULL) Modified: projects/altix/sys/boot/ia64/common/exec.c ============================================================================== --- projects/altix/sys/boot/ia64/common/exec.c Sun Mar 13 21:51:47 2011 (r219625) +++ projects/altix/sys/boot/ia64/common/exec.c Sun Mar 13 22:04:19 2011 (r219626) @@ -85,9 +85,52 @@ enter_kernel(uint64_t start, struct boot } static void -mmu_setup_legacy(uint64_t entry) +mmu_wire(vm_offset_t va, vm_paddr_t pa, u_int sz, u_int acc) { + static u_int iidx = 0, didx = 0; pt_entry_t pte; + u_int shft; + + /* Round up to the smallest possible page size. */ + if (sz < 4096) + sz = 4096; + /* Determine the exponent (base 2). */ + shft = 0; + while (sz > 1) { + shft++; + sz >>= 1; + } + /* Truncate to the largest possible page size (256MB). */ + if (shft > 28) + shft = 28; + /* Round down to a valid (mappable) page size. */ + if (shft > 14 && (shft & 1) != 0) + shft--; + + pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY | + PTE_PL_KERN | (acc & PTE_AR_MASK) | (pa & PTE_PPN_MASK); + + __asm __volatile("mov cr.ifa=%0" :: "r"(va)); + __asm __volatile("mov cr.itir=%0" :: "r"(shft << 2)); + __asm __volatile("srlz.d;;"); + __asm __volatile("ptr.d %0,%1" :: "r"(va), "r"(shft << 2)); + __asm __volatile("srlz.d;;"); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(didx), "r"(pte)); + __asm __volatile("srlz.d;;"); + didx++; + + if (acc == PTE_AR_RWX) { + __asm __volatile("ptr.i %0,%1;;" :: "r"(va), "r"(shft << 2)); + __asm __volatile("srlz.i;;"); + __asm __volatile("itr.i itr[%0]=%1;;" :: "r"(iidx), "r"(pte)); + __asm __volatile("srlz.i;;"); + iidx++; + } +} + +static void +mmu_setup_legacy(uint64_t entry) +{ /* * Region 6 is direct mapped UC and region 7 is direct mapped @@ -99,53 +142,28 @@ mmu_setup_legacy(uint64_t entry) ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (28 << 2)); __asm __volatile("srlz.i;;"); - pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY | - PTE_PL_KERN | PTE_AR_RWX | PTE_ED; - pte |= IA64_RR_MASK(entry) & PTE_PPN_MASK; - - __asm __volatile("mov cr.ifa=%0" :: "r"(entry)); - __asm __volatile("mov cr.itir=%0" :: "r"(28 << 2)); - __asm __volatile("ptr.i %0,%1" :: "r"(entry), "r"(28<<2)); - __asm __volatile("ptr.d %0,%1" :: "r"(entry), "r"(28<<2)); - __asm __volatile("srlz.i;;"); - __asm __volatile("itr.i itr[%0]=%1;;" :: "r"(0), "r"(pte)); - __asm __volatile("srlz.i;;"); - __asm __volatile("itr.d dtr[%0]=%1;;" :: "r"(0), "r"(pte)); - __asm __volatile("srlz.i;;"); + mmu_wire(entry, IA64_RR_MASK(entry), 1UL << 28, PTE_AR_RWX); } static void -mmu_setup_paged(void) +mmu_setup_paged(vm_offset_t pbvm_top) { - pt_entry_t pte; u_int sz; - ia64_set_rr(IA64_RR_BASE(4), (4 << 8) | (IA64_PBVM_PAGE_SHIFT << 2)); + ia64_set_rr(IA64_RR_BASE(IA64_PBVM_RR), + (IA64_PBVM_RR << 8) | (IA64_PBVM_PAGE_SHIFT << 2)); __asm __volatile("srlz.i;;"); - /* - * Wire the PBVM page table. - */ - - pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY | - PTE_PL_KERN | PTE_AR_RWX | PTE_ED; - pte |= ia64_pgtbl[0] & PTE_PPN_MASK; - - /* - * Size of the translation. This should be the largest power of 2 - * smaller than the LVM in use. - */ - sz = 24; - - __asm __volatile("mov cr.ifa=%0" :: "r"(IA64_PBVM_BASE)); - __asm __volatile("mov cr.itir=%0" :: "r"(sz << 2)); - __asm __volatile("ptr.i %0,%1" :: "r"(IA64_PBVM_BASE), "r"(sz << 2)); - __asm __volatile("ptr.d %0,%1" :: "r"(IA64_PBVM_BASE), "r"(sz << 2)); - __asm __volatile("srlz.i;;"); - __asm __volatile("itr.i itr[%0]=%1;;" :: "r"(0), "r"(pte)); - __asm __volatile("srlz.i;;"); - __asm __volatile("itr.d dtr[%0]=%1;;" :: "r"(0), "r"(pte)); - __asm __volatile("srlz.i;;"); + /* Wire the PBVM page table. */ + mmu_wire(IA64_PBVM_PGTBL, (uintptr_t)ia64_pgtbl, ia64_pgtblsz, + PTE_AR_RW); + + /* Wire as much of the PBVM we can. This must be a power of 2. */ + pbvm_top = (pbvm_top + IA64_PBVM_PAGE_MASK) & ~IA64_PBVM_PAGE_MASK; + sz = pbvm_top - IA64_PBVM_BASE; + while (sz & (sz - 1)) + sz -= IA64_PBVM_PAGE_SIZE; + mmu_wire(IA64_PBVM_BASE, ia64_pgtbl[0], sz, PTE_AR_RWX); } static int @@ -177,7 +195,7 @@ elf64_exec(struct preloaded_file *fp) if (IS_LEGACY_KERNEL()) mmu_setup_legacy(hdr->e_entry); else - mmu_setup_paged(); + mmu_setup_paged((uintptr_t)(bi + 1)); enter_kernel(hdr->e_entry, bi); /* NOTREACHED */ From owner-svn-src-projects@FreeBSD.ORG Sun Mar 13 23:35:43 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EFE90106566B; Sun, 13 Mar 2011 23:35:43 +0000 (UTC) (envelope-from bzeeb-lists@lists.zabbadoz.net) Received: from mx1.sbone.de (bird.sbone.de [46.4.1.90]) by mx1.freebsd.org (Postfix) with ESMTP id A4F898FC08; Sun, 13 Mar 2011 23:35:43 +0000 (UTC) Received: from mail.sbone.de (mail.sbone.de [IPv6:fde9:577b:c1a9:31::2013:587]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mx1.sbone.de (Postfix) with ESMTPS id A1B7925D37C4; Sun, 13 Mar 2011 23:10:19 +0000 (UTC) Received: from content-filter.sbone.de (content-filter.sbone.de [IPv6:fde9:577b:c1a9:31::2013:2742]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sbone.de (Postfix) with ESMTPS id 54A18159ABDB; Sun, 13 Mar 2011 23:10:18 +0000 (UTC) X-Virus-Scanned: amavisd-new at sbone.de Received: from mail.sbone.de ([IPv6:fde9:577b:c1a9:31::2013:587]) by content-filter.sbone.de (content-filter.sbone.de [fde9:577b:c1a9:31::2013:2742]) (amavisd-new, port 10024) with ESMTP id HBxYBE0sd03X; Sun, 13 Mar 2011 23:10:17 +0000 (UTC) Received: from nv.sbone.de (nv.sbone.de [IPv6:fde9:577b:c1a9:31::2013:138]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sbone.de (Postfix) with ESMTPSA id 389DC159ABFB; Sun, 13 Mar 2011 23:10:17 +0000 (UTC) Date: Sun, 13 Mar 2011 23:10:16 +0000 (UTC) From: "Bjoern A. Zeeb" To: Jeff Roberson In-Reply-To: <201103132151.p2DLplTY066942@svn.freebsd.org> Message-ID: References: <201103132151.p2DLplTY066942@svn.freebsd.org> X-OpenPGP-Key: 0x14003F198FEFA3E77207EE8D2B58B8F83CCF1842 MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r219625 - in projects/ofed/head/sys/ofed: drivers/infiniband/core include/linux include/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Mar 2011 23:35:44 -0000 On Sun, 13 Mar 2011, Jeff Roberson wrote: > Author: jeff > Date: Sun Mar 13 21:51:47 2011 > New Revision: 219625 > URL: http://svn.freebsd.org/changeset/base/219625 > > Log: .. > - Don't include opt_inet6.h in module builds. uhm, why not? -- Bjoern A. Zeeb You have to have visions! Stop bit received. Insert coin for new address family. From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 05:13:52 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7934C1065679; Mon, 14 Mar 2011 05:13:52 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6799E8FC0C; Mon, 14 Mar 2011 05:13:52 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2E5Dqjl077885; Mon, 14 Mar 2011 05:13:52 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2E5Dq3Q077883; Mon, 14 Mar 2011 05:13:52 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103140513.p2E5Dq3Q077883@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 14 Mar 2011 05:13:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219629 - projects/altix/sys/boot/ia64/common X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 05:13:52 -0000 Author: marcel Date: Mon Mar 14 05:13:52 2011 New Revision: 219629 URL: http://svn.freebsd.org/changeset/base/219629 Log: Change the sz argumnt to mmu_wire() from u_int to vm_size_t. It's a size in bytes... Modified: projects/altix/sys/boot/ia64/common/exec.c Modified: projects/altix/sys/boot/ia64/common/exec.c ============================================================================== --- projects/altix/sys/boot/ia64/common/exec.c Mon Mar 14 02:32:10 2011 (r219628) +++ projects/altix/sys/boot/ia64/common/exec.c Mon Mar 14 05:13:52 2011 (r219629) @@ -85,7 +85,7 @@ enter_kernel(uint64_t start, struct boot } static void -mmu_wire(vm_offset_t va, vm_paddr_t pa, u_int sz, u_int acc) +mmu_wire(vm_offset_t va, vm_paddr_t pa, vm_size_t sz, u_int acc) { static u_int iidx = 0, didx = 0; pt_entry_t pte; @@ -113,6 +113,7 @@ mmu_wire(vm_offset_t va, vm_paddr_t pa, __asm __volatile("mov cr.ifa=%0" :: "r"(va)); __asm __volatile("mov cr.itir=%0" :: "r"(shft << 2)); __asm __volatile("srlz.d;;"); + __asm __volatile("ptr.d %0,%1" :: "r"(va), "r"(shft << 2)); __asm __volatile("srlz.d;;"); __asm __volatile("itr.d dtr[%0]=%1" :: "r"(didx), "r"(pte)); @@ -148,7 +149,7 @@ mmu_setup_legacy(uint64_t entry) static void mmu_setup_paged(vm_offset_t pbvm_top) { - u_int sz; + vm_size_t sz; ia64_set_rr(IA64_RR_BASE(IA64_PBVM_RR), (IA64_PBVM_RR << 8) | (IA64_PBVM_PAGE_SHIFT << 2)); From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 05:16:13 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0A276106566C; Mon, 14 Mar 2011 05:16:13 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D376E8FC19; Mon, 14 Mar 2011 05:16:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2E5GCLl077969; Mon, 14 Mar 2011 05:16:12 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2E5GCHq077967; Mon, 14 Mar 2011 05:16:12 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103140516.p2E5GCHq077967@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 14 Mar 2011 05:16:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219630 - projects/altix/sys/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 05:16:13 -0000 Author: marcel Date: Mon Mar 14 05:16:12 2011 New Revision: 219630 URL: http://svn.freebsd.org/changeset/base/219630 Log: Move the actual code to the front of the segment and make sure the IVT can be put right at the front when put in its own section. This makes sure that when the loader can only map a relatively small part of the PBVM, the IVT and the startup code is wired. Modified: projects/altix/sys/conf/ldscript.ia64 Modified: projects/altix/sys/conf/ldscript.ia64 ============================================================================== --- projects/altix/sys/conf/ldscript.ia64 Mon Mar 14 05:13:52 2011 (r219629) +++ projects/altix/sys/conf/ldscript.ia64 Mon Mar 14 05:16:12 2011 (r219630) @@ -9,6 +9,22 @@ SECTIONS /* Read-only sections, merged into text segment: */ . = kernel_text + SIZEOF_HEADERS; .interp : { *(.interp) } + + PROVIDE (btext = .); + .ivt : { *(.ivt) } + .text : + { + *(.text.ivt) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } = 0x00300000010070000002000001000400 + .init : { *(.init) } = 0x00300000010070000002000001000400 + .plt : { *(.plt) } + .fini : { *(.fini) } = 0x00300000010070000002000001000400 + _etext = .; + PROVIDE (etext = .); + .hash : { *(.hash) } .dynsym : { *(.dynsym) } .dynstr : { *(.dynstr) } @@ -30,34 +46,20 @@ SECTIONS .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } .rela.plt : { *(.rela.plt) } .rela.IA_64.pltoff : { *(.rela.IA_64.pltoff) } - PROVIDE (btext = .); - .init : - { - *(.init) - } =0x00300000010070000002000001000400 - .plt : { *(.plt) } - .text : - { - *(.text .stub .text.* .gnu.linkonce.t.*) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - } =0x00300000010070000002000001000400 - .fini : - { - *(.fini) - } =0x00300000010070000002000001000400 - _etext = .; - PROVIDE (etext = .); + + .IA_64.unwind_info : { *(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*) } + .IA_64.unwind : { *(.IA_64.unwind* .gnu.linkonce.ia64unw.*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } .rodata1 : { *(.rodata1) } .sdata2 : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) } .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } .opd : { *(.opd) } - .IA_64.unwind_info : { *(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*) } - .IA_64.unwind : { *(.IA_64.unwind* .gnu.linkonce.ia64unw.*) } + /* Adjust the address for the data segment. We want to start in the next page in the loader virtual memory. */ . = ALIGN(65536); + .data : { *(.data.kstack .data .data.* .gnu.linkonce.d.*) From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 05:18:27 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 643AE106564A; Mon, 14 Mar 2011 05:18:27 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 52F8E8FC0A; Mon, 14 Mar 2011 05:18:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2E5IRRF078048; Mon, 14 Mar 2011 05:18:27 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2E5IRgi078046; Mon, 14 Mar 2011 05:18:27 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103140518.p2E5IRgi078046@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 14 Mar 2011 05:18:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219631 - projects/altix/sys/ia64/ia64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 05:18:27 -0000 Author: marcel Date: Mon Mar 14 05:18:27 2011 New Revision: 219631 URL: http://svn.freebsd.org/changeset/base/219631 Log: Expose the PBVM constants to assembly. Modified: projects/altix/sys/ia64/ia64/genassym.c Modified: projects/altix/sys/ia64/ia64/genassym.c ============================================================================== --- projects/altix/sys/ia64/ia64/genassym.c Mon Mar 14 05:16:12 2011 (r219630) +++ projects/altix/sys/ia64/ia64/genassym.c Mon Mar 14 05:18:27 2011 (r219631) @@ -77,6 +77,11 @@ ASSYM(ERESTART, ERESTART); ASSYM(FRAME_SYSCALL, FRAME_SYSCALL); +ASSYM(IA64_PBVM_BASE, IA64_PBVM_BASE); +ASSYM(IA64_PBVM_PAGE_SHIFT, IA64_PBVM_PAGE_SHIFT); +ASSYM(IA64_PBVM_PGTBL, IA64_PBVM_PGTBL); +ASSYM(IA64_PBVM_RR, IA64_PBVM_RR); + ASSYM(KSTACK_PAGES, KSTACK_PAGES); ASSYM(MC_PRESERVED, offsetof(mcontext_t, mc_preserved)); From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 05:29:46 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 44FBC106566C; Mon, 14 Mar 2011 05:29:46 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3208E8FC16; Mon, 14 Mar 2011 05:29:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2E5TkLl078308; Mon, 14 Mar 2011 05:29:46 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2E5Tkhc078301; Mon, 14 Mar 2011 05:29:46 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103140529.p2E5Tkhc078301@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 14 Mar 2011 05:29:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219632 - in projects/altix/sys/ia64: ia64 include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 05:29:46 -0000 Author: marcel Date: Mon Mar 14 05:29:45 2011 New Revision: 219632 URL: http://svn.freebsd.org/changeset/base/219632 Log: o Deal with unmapped PBVM in the alternate instruction and data TLB fault handlers. o Put the IVT in its own section and keep the supporting code close. o Make sure the VHPT is sized so that it can be mapped using a single translation. o Map the PAL code and VHPT with a translation that has the right size. Assume the platform has a PAL code size that can be mapped with a single translations. o Pass the pointer to the bootinfo structure as an argument to ia64_init(). o Get rid of LOG2_ID_PAGE_SIZE and IA64_ID_PAGE_SIZE. It was used to map the regions 6 & 7 and was as large as possible. The problem is that we can't support memory attributes easily if the granuratity is not a page. We need to support memory attributes because the new USB stack violates the BUS_DMA(9) interface. o Update some comments... NOTE: this is broken for SMP kernels, because the AP startup code hasn't been updated yet. Modified: projects/altix/sys/ia64/ia64/exception.S projects/altix/sys/ia64/ia64/locore.S projects/altix/sys/ia64/ia64/machdep.c projects/altix/sys/ia64/ia64/pmap.c projects/altix/sys/ia64/include/md_var.h projects/altix/sys/ia64/include/vmparam.h Modified: projects/altix/sys/ia64/ia64/exception.S ============================================================================== --- projects/altix/sys/ia64/ia64/exception.S Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/ia64/exception.S Mon Mar 14 05:29:45 2011 (r219632) @@ -101,7 +101,7 @@ xhead: data8 xtrace #endif - .text + .section .text.ivt, "ax" /* * exception_save: save interrupted state @@ -725,7 +725,7 @@ ivt_##name: \ * bundles per vector and 48 slots with 16 bundles per vector. */ - .section .text.ivt,"ax" + .section .ivt, "ax" .align 32768 .global ia64_vector_table @@ -812,7 +812,7 @@ IVT_ENTRY(Instruction_TLB, 0x0400) 3: add r20=24,r20 // next in chain ;; ld8 r20=[r20] // read chain - br.cond.sptk.few 2b // loop + br.sptk 2b // loop ;; 9: ssm psr.dt mov pr=r17,0x1ffff // restore predicates @@ -898,7 +898,7 @@ IVT_ENTRY(Data_TLB, 0x0800) 3: add r20=24,r20 // next in chain ;; ld8 r20=[r20] // read chain - br.cond.sptk.few 2b // loop + br.sptk 2b // loop ;; 9: ssm psr.dt mov pr=r17,0x1ffff // restore predicates @@ -913,25 +913,40 @@ IVT_ENTRY(Alternate_Instruction_TLB, 0x0 mov r18=pr // save predicates ;; extr.u r17=r16,61,3 // get region number + mov r19=PTE_PRESENT+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+PTE_AR_RWX ;; - cmp.ge p13,p0=5,r17 // RR0-RR5? - cmp.eq p15,p14=7,r17 // RR7->p15, RR6->p14 -(p13) br.spnt 9f + cmp.eq p13,p0=4,r17 // RR4? +(p13) br.cond.sptk.few 4f ;; -(p15) movl r17=PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \ - PTE_AR_RX+PTE_ED -(p14) movl r17=PTE_PRESENT+PTE_MA_UC+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \ - PTE_AR_RX + cmp.ge p13,p0=5,r17 // RR0-RR5? + cmp.eq p14,p15=7,r17 // RR7? +(p13) br.cond.spnt.few 9f ;; - dep r16=0,r16,50,14 // clear bits above PPN +(p14) add r19=PTE_MA_WB,r19 +(p15) add r19=PTE_MA_UC,r19 + dep r17=0,r16,50,14 // clear bits above PPN ;; - dep r16=r17,r16,0,12 // put pte bits in 0..11 +1: dep r16=r19,r17,0,12 // put pte bits in 0..11 ;; itc.i r16 mov pr=r18,0x1ffff // restore predicates ;; rfi ;; +4: + add r19=PTE_MA_WB,r19 + movl r17=IA64_PBVM_BASE + ;; + sub r17=r16,r17 + movl r16=IA64_PBVM_PGTBL + ;; + extr.u r17=r17,IA64_PBVM_PAGE_SHIFT,61-IA64_PBVM_PAGE_SHIFT + ;; + shladd r16=r17,3,r16 + ;; + ld8 r17=[r16] + br.sptk 1b + ;; 9: mov pr=r18,0x1ffff // restore predicates CALL(trap, 3, cr.ifa) IVT_END(Alternate_Instruction_TLB) @@ -941,25 +956,40 @@ IVT_ENTRY(Alternate_Data_TLB, 0x1000) mov r18=pr // save predicates ;; extr.u r17=r16,61,3 // get region number + mov r19=PTE_PRESENT+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+PTE_AR_RWX ;; - cmp.ge p13,p0=5,r17 // RR0-RR5? - cmp.eq p15,p14=7,r17 // RR7->p15, RR6->p14 -(p13) br.spnt 9f + cmp.eq p13,p0=4,r17 // RR4? +(p13) br.cond.sptk.few 4f ;; -(p15) movl r17=PTE_PRESENT+PTE_MA_WB+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \ - PTE_AR_RW+PTE_ED -(p14) movl r17=PTE_PRESENT+PTE_MA_UC+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+ \ - PTE_AR_RW + cmp.ge p13,p0=5,r17 // RR0-RR5? + cmp.eq p14,p15=7,r17 // RR7? +(p13) br.cond.spnt.few 9f ;; - dep r16=0,r16,50,14 // clear bits above PPN +(p14) add r19=PTE_MA_WB,r19 +(p15) add r19=PTE_MA_UC,r19 + dep r17=0,r16,50,14 // clear bits above PPN ;; - dep r16=r17,r16,0,12 // put pte bits in 0..11 +1: dep r16=r19,r17,0,12 // put pte bits in 0..11 ;; itc.d r16 mov pr=r18,0x1ffff // restore predicates ;; rfi ;; +4: + add r19=PTE_MA_WB,r19 + movl r17=IA64_PBVM_BASE + ;; + sub r17=r16,r17 + movl r16=IA64_PBVM_PGTBL + ;; + extr.u r17=r17,IA64_PBVM_PAGE_SHIFT,61-IA64_PBVM_PAGE_SHIFT + ;; + shladd r16=r17,3,r16 + ;; + ld8 r17=[r16] + br.sptk 1b + ;; 9: mov pr=r18,0x1ffff // restore predicates CALL(trap, 4, cr.ifa) IVT_END(Alternate_Data_TLB) @@ -1045,13 +1075,13 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400) { .mib srlz.d cmp.eq p13,p0=r29,r27 -(p12) br.sptk exception_save_restart +(p12) br.cond.sptk.few exception_save_restart ;; } { .mib nop 0 nop 0 -(p13) br.sptk exception_restore_restart +(p13) br.cond.sptk.few exception_restore_restart ;; } { .mlx @@ -1147,7 +1177,7 @@ IVT_ENTRY(Dirty_Bit, 0x2000) 2: add r20=24,r20 // next in chain ;; ld8 r20=[r20] // read chain - br.cond.sptk.few 1b // loop + br.sptk 1b // loop ;; 9: ssm psr.dt mov pr=r17,0x1ffff // restore predicates @@ -1221,7 +1251,7 @@ IVT_ENTRY(Instruction_Access_Bit, 0x2400 2: add r20=24,r20 // next in chain ;; ld8 r20=[r20] // read chain - br.cond.sptk.few 1b // loop + br.sptk 1b // loop ;; 9: ssm psr.dt mov pr=r17,0x1ffff // restore predicates @@ -1295,7 +1325,7 @@ IVT_ENTRY(Data_Access_Bit, 0x2800) 2: add r20=24,r20 // next in chain ;; ld8 r20=[r20] // read chain - br.cond.sptk.few 1b // loop + br.sptk 1b // loop ;; 9: ssm psr.dt mov pr=r17,0x1ffff // restore predicates Modified: projects/altix/sys/ia64/ia64/locore.S ============================================================================== --- projects/altix/sys/ia64/ia64/locore.S Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/ia64/locore.S Mon Mar 14 05:29:45 2011 (r219632) @@ -77,17 +77,13 @@ ENTRY_NOPROFILE(__start, 1) movl gp=__gp // find kernel globals ;; } -{ .mlx + mov ar.bspstore=r16 // switch backing store - movl r16=bootinfo ;; -} -{ .mmi - st8 [r16]=r8 // save the PA of the bootinfo block loadrs // invalidate regs mov r17=IA64_DCR_DEFAULT ;; -} + { .mmi mov cr.dcr=r17 mov ar.rsc=3 // turn rse back on @@ -101,13 +97,13 @@ ENTRY_NOPROFILE(__start, 1) ;; // we just need to process fptrs } { .mib - nop 0 + mov r9=r8 // Save pointer to bootinfo. nop 0 br.call.sptk.many rp=_reloc ;; } { .mib - nop 0 + mov out0=r9 // Pass pointer to bootinfo. nop 0 br.call.sptk.many rp=ia64_init ;; Modified: projects/altix/sys/ia64/ia64/machdep.c ============================================================================== --- projects/altix/sys/ia64/ia64/machdep.c Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/ia64/machdep.c Mon Mar 14 05:29:45 2011 (r219632) @@ -127,8 +127,9 @@ extern u_int64_t epc_sigtramp[]; struct fpswa_iface *fpswa_iface; -u_int64_t ia64_pal_base; -u_int64_t ia64_port_base; +vm_size_t ia64_pal_size; +vm_paddr_t ia64_pal_base; +vm_offset_t ia64_port_base; u_int64_t ia64_lapic_addr = PAL_PIB_DEFAULT_ADDR; @@ -627,13 +628,13 @@ map_vhpt(uintptr_t vhpt) pte |= vhpt & PTE_PPN_MASK; __asm __volatile("ptr.d %0,%1" :: "r"(vhpt), - "r"(IA64_ID_PAGE_SHIFT<<2)); + "r"(pmap_vhpt_log2size << 2)); __asm __volatile("mov %0=psr" : "=r"(psr)); __asm __volatile("rsm psr.ic|psr.i"); ia64_srlz_i(); ia64_set_ifa(vhpt); - ia64_set_itir(IA64_ID_PAGE_SHIFT << 2); + ia64_set_itir(pmap_vhpt_log2size << 2); ia64_srlz_d(); __asm __volatile("itr.d dtr[%0]=%1" :: "r"(2), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); @@ -644,27 +645,38 @@ void map_pal_code(void) { pt_entry_t pte; + vm_offset_t va; + vm_size_t sz; uint64_t psr; + u_int shft; - if (ia64_pal_base == 0) + if (ia64_pal_size == 0) return; + va = IA64_PHYS_TO_RR7(ia64_pal_base); + + sz = ia64_pal_size; + shft = 0; + while (sz > 1) { + shft++; + sz >>= 1; + } + pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY | PTE_PL_KERN | PTE_AR_RWX; pte |= ia64_pal_base & PTE_PPN_MASK; - __asm __volatile("ptr.d %0,%1; ptr.i %0,%1" :: - "r"(IA64_PHYS_TO_RR7(ia64_pal_base)), "r"(IA64_ID_PAGE_SHIFT<<2)); + __asm __volatile("ptr.d %0,%1; ptr.i %0,%1" :: "r"(va), "r"(shft<<2)); __asm __volatile("mov %0=psr" : "=r"(psr)); __asm __volatile("rsm psr.ic|psr.i"); ia64_srlz_i(); - ia64_set_ifa(IA64_PHYS_TO_RR7(ia64_pal_base)); - ia64_set_itir(IA64_ID_PAGE_SHIFT << 2); + ia64_set_ifa(va); + ia64_set_itir(shft << 2); ia64_srlz_d(); - __asm __volatile("itr.d dtr[%0]=%1" :: "r"(1), "r"(pte)); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte)); ia64_srlz_d(); - __asm __volatile("itr.i itr[%0]=%1" :: "r"(1), "r"(pte)); + __asm __volatile("itr.i itr[%0]=%1" :: "r"(3), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); ia64_srlz_i(); } @@ -688,9 +700,9 @@ map_gateway_page(void) ia64_set_ifa(VM_MAXUSER_ADDRESS); ia64_set_itir(PAGE_SHIFT << 2); ia64_srlz_d(); - __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte)); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(4), "r"(pte)); ia64_srlz_d(); - __asm __volatile("itr.i itr[%0]=%1" :: "r"(3), "r"(pte)); + __asm __volatile("itr.i itr[%0]=%1" :: "r"(4), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); ia64_srlz_i(); @@ -736,7 +748,7 @@ calculate_frequencies(void) } struct ia64_init_return -ia64_init(void) +ia64_init(struct bootinfo *bi) { struct ia64_init_return ret; int phys_avail_cnt; @@ -748,6 +760,8 @@ ia64_init(void) /* NO OUTPUT ALLOWED UNTIL FURTHER NOTICE */ + bootinfo = bi; + /* * TODO: Disable interrupts, floating point etc. * Maybe flush cache and tlb @@ -770,6 +784,7 @@ ia64_init(void) md->md_pages * EFI_PAGE_SIZE); break; case EFI_MD_TYPE_PALCODE: + ia64_pal_size = md->md_pages * EFI_PAGE_SIZE; ia64_pal_base = md->md_phys; break; } @@ -819,7 +834,6 @@ ia64_init(void) ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (PAGE_SHIFT << 2)); ia64_srlz_d(); - /* * Wire things up so we can call the firmware. */ Modified: projects/altix/sys/ia64/ia64/pmap.c ============================================================================== --- projects/altix/sys/ia64/ia64/pmap.c Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/ia64/pmap.c Mon Mar 14 05:29:45 2011 (r219632) @@ -102,17 +102,11 @@ __FBSDID("$FreeBSD$"); * We reserve region ID 0 for the kernel and allocate the remaining * IDs for user pmaps. * - * Region 0..4 - * User virtually mapped - * - * Region 5 - * Kernel virtually mapped - * - * Region 6 - * Kernel physically mapped uncacheable - * - * Region 7 - * Kernel physically mapped cacheable + * Region 0..3: User virtually mapped [VHPT] + * Region 4: Pre-Boot Virtual Memory (PBVM) and wired mappings [non-VHPT] + * Region 5: Kernel Virtual Memory (KVM) [VHPT] + * Region 6: Uncacheable identity mappings [non-VHPT] + * Region 7: Cacheable identity mappings [non-VHPT] */ /* XXX move to a header. */ @@ -346,9 +340,9 @@ pmap_bootstrap() * Setup RIDs. RIDs 0..7 are reserved for the kernel. * * We currently need at least 19 bits in the RID because PID_MAX - * can only be encoded in 17 bits and we need RIDs for 5 regions + * can only be encoded in 17 bits and we need RIDs for 4 regions * per process. With PID_MAX equalling 99999 this means that we - * need to be able to encode 499995 (=5*PID_MAX). + * need to be able to encode 399996 (=4*PID_MAX). * The Itanium processor only has 18 bits and the architected * minimum is exactly that. So, we cannot use a PID based scheme * in those cases. Enter pmap_ridmap... @@ -396,13 +390,18 @@ pmap_bootstrap() ; count = i+2; + /* + * Determine a valid (mappable) VHPT size. + */ TUNABLE_INT_FETCH("machdep.vhpt.log2size", &pmap_vhpt_log2size); if (pmap_vhpt_log2size == 0) pmap_vhpt_log2size = 20; - else if (pmap_vhpt_log2size < 15) - pmap_vhpt_log2size = 15; - else if (pmap_vhpt_log2size > 61) - pmap_vhpt_log2size = 61; + else if (pmap_vhpt_log2size < 16) + pmap_vhpt_log2size = 16; + else if (pmap_vhpt_log2size > 28) + pmap_vhpt_log2size = 28; + if (pmap_vhpt_log2size & 1) + pmap_vhpt_log2size--; base = 0; size = 1UL << pmap_vhpt_log2size; @@ -456,11 +455,8 @@ pmap_bootstrap() TAILQ_INIT(&kernel_pmap->pm_pvlist); PCPU_SET(md.current_pmap, kernel_pmap); - /* - * Region 5 is mapped via the vhpt. - */ - ia64_set_rr(IA64_RR_BASE(5), - (5 << 8) | (PAGE_SHIFT << 2) | 1); + /* Region 5 is mapped via the vhpt. */ + ia64_set_rr(IA64_RR_BASE(5), (5 << 8) | (PAGE_SHIFT << 2) | 1); /* * Clear out any random TLB entries left over from booting. Modified: projects/altix/sys/ia64/include/md_var.h ============================================================================== --- projects/altix/sys/ia64/include/md_var.h Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/include/md_var.h Mon Mar 14 05:29:45 2011 (r219632) @@ -61,6 +61,7 @@ ia64_bsp_adjust(uint64_t bsp, int nslots #ifdef _KERNEL struct _special; +struct bootinfo; struct pcpu; struct thread; struct trapframe; @@ -93,7 +94,7 @@ int ia64_highfp_drop(struct thread *); int ia64_highfp_enable(struct thread *, struct trapframe *); int ia64_highfp_save(struct thread *); int ia64_highfp_save_ipi(void); -struct ia64_init_return ia64_init(void); +struct ia64_init_return ia64_init(struct bootinfo *); u_int ia64_itc_freq(void); void ia64_probe_sapics(void); void ia64_sync_icache(vm_offset_t, vm_size_t); Modified: projects/altix/sys/ia64/include/vmparam.h ============================================================================== --- projects/altix/sys/ia64/include/vmparam.h Mon Mar 14 05:18:27 2011 (r219631) +++ projects/altix/sys/ia64/include/vmparam.h Mon Mar 14 05:29:45 2011 (r219632) @@ -132,17 +132,6 @@ #define IA64_PHYS_TO_RR7(x) ((x) | IA64_RR_BASE(7)) /* - * Page size of the identity mappings in region 7. - */ -#ifndef LOG2_ID_PAGE_SIZE -#define LOG2_ID_PAGE_SIZE 28 /* 256M */ -#endif - -#define IA64_ID_PAGE_SHIFT (LOG2_ID_PAGE_SIZE) -#define IA64_ID_PAGE_SIZE (1<<(LOG2_ID_PAGE_SIZE)) -#define IA64_ID_PAGE_MASK (IA64_ID_PAGE_SIZE-1) - -/* * The Itanium architecture defines that all implementations support at * least 51 virtual address bits (i.e. IMPL_VA_MSB=50). The unimplemented * bits are sign-extended from VA{IMPL_VA_MSB}. As such, there's a gap in From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 09:54:17 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 74F271065676; Mon, 14 Mar 2011 09:54:17 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 62A168FC1E; Mon, 14 Mar 2011 09:54:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2E9sHuQ084319; Mon, 14 Mar 2011 09:54:17 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2E9sH7M084314; Mon, 14 Mar 2011 09:54:17 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103140954.p2E9sH7M084314@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 09:54:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219634 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 09:54:17 -0000 Author: mav Date: Mon Mar 14 09:54:16 2011 New Revision: 219634 URL: http://svn.freebsd.org/changeset/base/219634 Log: Since Promise metadata are volume-centric (previous were array-centric), give each volume own root mount hold token, timeout and start event to allow them operate independently. Add volume_event() method to MD API to handle volume level metadata events. Modified: projects/graid/head/sys/geom/raid/g_raid.c projects/graid/head/sys/geom/raid/g_raid.h projects/graid/head/sys/geom/raid/g_raid_md_if.m projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Mon Mar 14 09:50:14 2011 (r219633) +++ projects/graid/head/sys/geom/raid/g_raid.c Mon Mar 14 09:54:16 2011 (r219634) @@ -259,6 +259,8 @@ g_raid_volume_event2str(int event) return ("DOWN"); case G_RAID_VOLUME_E_START: return ("START"); + case G_RAID_VOLUME_E_STARTMD: + return ("STARTMD"); default: return ("INVALID"); } @@ -1525,6 +1527,10 @@ g_raid_update_volume(struct g_raid_volum if (vol->v_tr) G_RAID_TR_START(vol->v_tr); return (0); + default: + if (sc->sc_md) + G_RAID_MD_VOLUME_EVENT(sc->sc_md, vol, event); + return (0); } /* Manage root mount release. */ Modified: projects/graid/head/sys/geom/raid/g_raid.h ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 09:50:14 2011 (r219633) +++ projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 09:54:16 2011 (r219634) @@ -211,6 +211,7 @@ struct g_raid_subdisk { #define G_RAID_VOLUME_E_DOWN 0x00 #define G_RAID_VOLUME_E_UP 0x01 #define G_RAID_VOLUME_E_START 0x10 +#define G_RAID_VOLUME_E_STARTMD 0x11 #define G_RAID_VOLUME_RL_RAID0 0x00 #define G_RAID_VOLUME_RL_RAID1 0x01 Modified: projects/graid/head/sys/geom/raid/g_raid_md_if.m ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid_md_if.m Mon Mar 14 09:50:14 2011 (r219633) +++ projects/graid/head/sys/geom/raid/g_raid_md_if.m Mon Mar 14 09:54:16 2011 (r219634) @@ -64,6 +64,14 @@ CODE { } static int + g_raid_md_volume_event_default(struct g_raid_md_object *md, + struct g_raid_volume *vol, u_int event) + { + + return (-1); + } + + static int g_raid_md_free_disk_default(struct g_raid_md_object *md, struct g_raid_volume *vol) { @@ -108,6 +116,13 @@ METHOD int event { u_int event; }; +# volume_event() - events handling method. +METHOD int volume_event { + struct g_raid_md_object *md; + struct g_raid_volume *vol; + u_int event; +} DEFAULT g_raid_md_volume_event_default; + # write() - metadata write method. METHOD int write { struct g_raid_md_object *md; Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 09:50:14 2011 (r219633) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 09:54:16 2011 (r219634) @@ -116,8 +116,8 @@ struct promise_raid_conf { /* Subdisks in this volume. */ char name[32]; /* Volume label. */ - uint32_t filler2[338]; - uint32_t checksum; + uint32_t filler2[338]; + uint32_t checksum; } __packed; struct g_raid_md_promise_perdisk { @@ -130,24 +130,26 @@ struct g_raid_md_promise_perdisk { }; struct g_raid_md_promise_pervolume { + struct promise_raid_conf *pv_meta; uint64_t pv_id; uint16_t pv_generation; int pv_disks_present; - struct promise_raid_conf *pv_meta; + int pv_started; + struct callout pv_start_co; /* STARTING state timer. */ + struct root_hold_token *pv_rootmount; /* Root mount delay token. */ }; struct g_raid_md_promise_object { struct g_raid_md_object mdio_base; - struct callout mdio_start_co; /* STARTING state timer. */ int mdio_disks_present; int mdio_started; int mdio_incomplete; - struct root_hold_token *mdio_rootmount; /* Root mount delay token. */ }; static g_raid_md_create_t g_raid_md_create_promise; static g_raid_md_taste_t g_raid_md_taste_promise; static g_raid_md_event_t g_raid_md_event_promise; +static g_raid_md_volume_event_t g_raid_md_volume_event_promise; static g_raid_md_ctl_t g_raid_md_ctl_promise; static g_raid_md_write_t g_raid_md_write_promise; static g_raid_md_fail_disk_t g_raid_md_fail_disk_promise; @@ -159,6 +161,7 @@ static kobj_method_t g_raid_md_promise_m KOBJMETHOD(g_raid_md_create, g_raid_md_create_promise), KOBJMETHOD(g_raid_md_taste, g_raid_md_taste_promise), KOBJMETHOD(g_raid_md_event, g_raid_md_event_promise), + KOBJMETHOD(g_raid_md_volume_event, g_raid_md_volume_event_promise), KOBJMETHOD(g_raid_md_ctl, g_raid_md_ctl_promise), KOBJMETHOD(g_raid_md_write, g_raid_md_write_promise), KOBJMETHOD(g_raid_md_fail_disk, g_raid_md_fail_disk_promise), @@ -446,7 +449,7 @@ g_raid_md_promise_supported(int level, i } static int -g_raid_md_promise_start_disk(struct g_raid_disk *disk) +g_raid_md_promise_start_disk(struct g_raid_disk *disk, int sdn) { #if 0 struct g_raid_softc *sc; @@ -752,10 +755,12 @@ g_raid_md_promise_refill(struct g_raid_s } static void -g_raid_md_promise_start(struct g_raid_softc *sc) +g_raid_md_promise_start(struct g_raid_volume *vol) { + struct g_raid_softc *sc; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; + struct g_raid_md_promise_pervolume *pv; #if 0 struct g_raid_md_promise_perdisk *pd; struct promise_raid_conf *meta; @@ -767,8 +772,10 @@ g_raid_md_promise_start(struct g_raid_so int i, j, disk_pos; #endif + sc = vol->v_softc; md = sc->sc_md; mdi = (struct g_raid_md_promise_object *)md; + pv = vol->v_md_data; #if 0 meta = mdi->mdio_meta; @@ -858,10 +865,29 @@ g_raid_md_promise_start(struct g_raid_so } #endif - callout_stop(&mdi->mdio_start_co); - G_RAID_DEBUG1(1, sc, "root_mount_rel %p", mdi->mdio_rootmount); - root_mount_rel(mdi->mdio_rootmount); - mdi->mdio_rootmount = NULL; + callout_stop(&pv->pv_start_co); + G_RAID_DEBUG1(1, sc, "root_mount_rel %p", pv->pv_rootmount); + root_mount_rel(pv->pv_rootmount); + pv->pv_rootmount = NULL; +} + +static void +g_raid_promise_go(void *arg) +{ + struct g_raid_volume *vol; + struct g_raid_softc *sc; + struct g_raid_md_promise_pervolume *pv; + + vol = arg; + pv = vol->v_md_data; + sc = vol->v_softc; + sx_xlock(&sc->sc_lock); + if (!pv->pv_started) { + G_RAID_DEBUG1(0, sc, "Force volume start due to timeout."); + g_raid_event_send(vol, G_RAID_VOLUME_E_STARTMD, + G_RAID_EVENT_VOLUME); + } + sx_xunlock(&sc->sc_lock); } static void @@ -892,6 +918,12 @@ g_raid_md_promise_new_disk(struct g_raid pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO); pv->pv_id = pdmeta->volume_id; vol->v_md_data = pv; + callout_init(&pv->pv_start_co, 1); + callout_reset(&pv->pv_start_co, + g_raid_start_timeout * hz, + g_raid_promise_go, vol); + pv->pv_rootmount = root_mount_hold("GRAID-Promise"); + G_RAID_DEBUG1(1, sc, "root_mount_hold %p", pv->pv_rootmount); g_raid_start_volume(vol); } else pv = vol->v_md_data; @@ -915,36 +947,16 @@ g_raid_md_promise_new_disk(struct g_raid } else { G_RAID_DEBUG1(1, sc, "Older disk"); } - } -#if 0 - if (mdi->mdio_started) { - if (g_raid_md_promise_start_disk(disk)) - g_raid_md_write_promise(md, NULL, NULL, NULL); - } else { - /* If we collected all needed disks - start array. */ - if (mdi->mdio_disks_present == mdi->mdio_meta->total_disks) - g_raid_md_promise_start(sc); - } -#endif -} - -static void -g_raid_promise_go(void *arg) -{ - struct g_raid_softc *sc; - struct g_raid_md_object *md; - struct g_raid_md_promise_object *mdi; - - sc = arg; - md = sc->sc_md; - mdi = (struct g_raid_md_promise_object *)md; - sx_xlock(&sc->sc_lock); - if (!mdi->mdio_started) { - G_RAID_DEBUG1(0, sc, "Force array start due to timeout."); - g_raid_event_send(sc, G_RAID_NODE_E_START, 0); + if (pv->pv_started) { + if (g_raid_md_promise_start_disk(disk, i)) + g_raid_md_write_promise(md, NULL, NULL, NULL); + } else { + /* If we collected all needed disks - start array. */ + if (pv->pv_disks_present == pv->pv_meta->total_disks) + g_raid_md_promise_start(vol); + } } - sx_xunlock(&sc->sc_lock); } static int @@ -1007,7 +1019,7 @@ g_raid_md_taste_promise(struct g_raid_md goto search; } else { G_RAID_DEBUG(1, - "Promise vendor mismatch " + "Promise/ATI vendor mismatch " "0x%04x != 0x105a/0x1002", vendor); } @@ -1047,11 +1059,6 @@ search: sc = g_raid_create_node(mp, name, md); md->mdo_softc = sc; geom = sc->sc_geom; - callout_init(&mdi->mdio_start_co, 1); - callout_reset(&mdi->mdio_start_co, g_raid_start_timeout * hz, - g_raid_promise_go, sc); - mdi->mdio_rootmount = root_mount_hold("GRAID-Promise"); - G_RAID_DEBUG1(1, sc, "root_mount_hold %p", mdi->mdio_rootmount); } rcp = g_new_consumer(geom); @@ -1112,15 +1119,8 @@ g_raid_md_event_promise(struct g_raid_md sc = md->mdo_softc; mdi = (struct g_raid_md_promise_object *)md; - if (disk == NULL) { - switch (event) { - case G_RAID_NODE_E_START: - if (!mdi->mdio_started) - g_raid_md_promise_start(sc); - return (0); - } + if (disk == NULL) return (-1); - } pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; switch (event) { case G_RAID_DISK_E_DISCONNECTED: @@ -1158,6 +1158,24 @@ g_raid_md_event_promise(struct g_raid_md } static int +g_raid_md_volume_event_promise(struct g_raid_md_object *md, + struct g_raid_volume *vol, u_int event) +{ + struct g_raid_softc *sc; + struct g_raid_md_promise_pervolume *pv; + + sc = md->mdo_softc; + pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; + switch (event) { + case G_RAID_VOLUME_E_STARTMD: + if (!pv->pv_started) + g_raid_md_promise_start(vol); + return (0); + } + return (-2); +} + +static int g_raid_md_ctl_promise(struct g_raid_md_object *md, struct gctl_req *req) { @@ -1756,7 +1774,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o // pd->pd_disk_meta.flags = PROMISE_F_SPARE; /* Welcome the "new" disk. */ - update += g_raid_md_promise_start_disk(disk); + update += g_raid_md_promise_start_disk(disk, 0); if (disk->d_state == G_RAID_DISK_S_SPARE) { // promise_meta_write_spare(cp, &pd->pd_disk_meta); g_raid_destroy_disk(disk); @@ -2091,6 +2109,14 @@ g_raid_md_free_volume_promise(struct g_r free(pv->pv_meta, M_MD_PROMISE); pv->pv_meta = NULL; } + if (pv && !pv->pv_started) { + pv->pv_started = 1; + callout_stop(&pv->pv_start_co); + G_RAID_DEBUG1(1, md->mdo_softc, + "root_mount_rel %p", pv->pv_rootmount); + root_mount_rel(pv->pv_rootmount); + pv->pv_rootmount = NULL; + } return (0); } @@ -2100,14 +2126,6 @@ g_raid_md_free_promise(struct g_raid_md_ struct g_raid_md_promise_object *mdi; mdi = (struct g_raid_md_promise_object *)md; - if (!mdi->mdio_started) { - mdi->mdio_started = 0; - callout_stop(&mdi->mdio_start_co); - G_RAID_DEBUG1(1, md->mdo_softc, - "root_mount_rel %p", mdi->mdio_rootmount); - root_mount_rel(mdi->mdio_rootmount); - mdi->mdio_rootmount = NULL; - } return (0); } From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 10:51:24 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EAF731065673; Mon, 14 Mar 2011 10:51:24 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D9E408FC14; Mon, 14 Mar 2011 10:51:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2EApOOG091293; Mon, 14 Mar 2011 10:51:24 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EApOmK091291; Mon, 14 Mar 2011 10:51:24 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103141051.p2EApOmK091291@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 10:51:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219635 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 10:51:25 -0000 Author: mav Date: Mon Mar 14 10:51:24 2011 New Revision: 219635 URL: http://svn.freebsd.org/changeset/base/219635 Log: Parse volume parameters. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 09:54:16 2011 (r219634) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 10:51:24 2011 (r219635) @@ -761,9 +761,9 @@ g_raid_md_promise_start(struct g_raid_vo struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_pervolume *pv; + struct promise_raid_conf *meta; #if 0 struct g_raid_md_promise_perdisk *pd; - struct promise_raid_conf *meta; struct promise_raid_vol *mvol; struct promise_raid_map *mmap; struct g_raid_volume *vol; @@ -776,72 +776,33 @@ g_raid_md_promise_start(struct g_raid_vo md = sc->sc_md; mdi = (struct g_raid_md_promise_object *)md; pv = vol->v_md_data; -#if 0 - meta = mdi->mdio_meta; + meta = pv->pv_meta; - /* Create volumes and subdisks. */ - for (i = 0; i < meta->total_volumes; i++) { - mvol = promise_get_volume(meta, i); - mmap = promise_get_map(mvol, 0); - vol = g_raid_create_volume(sc, mvol->name); - vol->v_md_data = (void *)(intptr_t)i; - if (mmap->type == PROMISE_T_RAID0) - vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; - else if (mmap->type == PROMISE_T_RAID1 && - mmap->total_domains >= 2 && - mmap->total_domains <= mmap->total_disks) { - /* Assume total_domains is correct. */ - if (mmap->total_domains == mmap->total_disks) - vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; - else - vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; - } else if (mmap->type == PROMISE_T_RAID1) { - /* total_domains looks wrong. */ - if (mmap->total_disks <= 2) - vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; - else - vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; - } else if (mmap->type == PROMISE_T_RAID5) - vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; + if (meta->type == PROMISE_T_RAID0) + vol->v_raid_level = G_RAID_VOLUME_RL_RAID0; + else if (meta->type == PROMISE_T_RAID1) { + if (meta->array_width == 1) + vol->v_raid_level = G_RAID_VOLUME_RL_RAID1; else - vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; - vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; - vol->v_strip_size = (u_int)mmap->strip_sectors * 512; //ZZZ - vol->v_disks_count = mmap->total_disks; - vol->v_mediasize = (off_t)mvol->total_sectors * 512; //ZZZ - vol->v_sectorsize = 512; //ZZZ - for (j = 0; j < vol->v_disks_count; j++) { - sd = &vol->v_subdisks[j]; - sd->sd_offset = (off_t)mmap->offset * 512; //ZZZ - sd->sd_size = (off_t)mmap->disk_sectors * 512; //ZZZ - } - g_raid_start_volume(vol); - } - - /* Create disk placeholders to store data for later writing. */ - for (disk_pos = 0; disk_pos < meta->total_disks; disk_pos++) { - pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); - pd->pd_disk_pos = disk_pos; - pd->pd_disk_meta = meta->disk[disk_pos]; - disk = g_raid_create_disk(sc); - disk->d_md_data = (void *)pd; - disk->d_state = G_RAID_DISK_S_OFFLINE; - for (i = 0; i < meta->total_volumes; i++) { - mvol = promise_get_volume(meta, i); - mmap = promise_get_map(mvol, 0); - for (j = 0; j < mmap->total_disks; j++) { - if ((mmap->disk_idx[j] & PROMISE_DI_IDX) == disk_pos) - break; - } - if (j == mmap->total_disks) - continue; - vol = g_raid_md_promise_get_volume(sc, i); - sd = &vol->v_subdisks[j]; - sd->sd_disk = disk; - TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); - } - } + vol->v_raid_level = G_RAID_VOLUME_RL_RAID1E; + } else if (meta->type == PROMISE_T_RAID3) + vol->v_raid_level = G_RAID_VOLUME_RL_RAID3; + else if (meta->type == PROMISE_T_RAID5) + vol->v_raid_level = G_RAID_VOLUME_RL_RAID5; + else if (meta->type == PROMISE_T_SPAN) + vol->v_raid_level = G_RAID_VOLUME_RL_CONCAT; + else if (meta->type == PROMISE_T_JBOD) + vol->v_raid_level = G_RAID_VOLUME_RL_SINGLE; + else + vol->v_raid_level = G_RAID_VOLUME_RL_UNKNOWN; + vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; + vol->v_strip_size = 512 << meta->stripe_shift; //ZZZ + vol->v_disks_count = meta->total_disks; + vol->v_mediasize = (off_t)meta->total_sectors * 512; //ZZZ + vol->v_sectorsize = 512; //ZZZ + g_raid_start_volume(vol); +#if 0 /* Make all disks found till the moment take their places. */ do { TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { @@ -851,19 +812,16 @@ g_raid_md_promise_start(struct g_raid_vo } } } while (disk != NULL); +#endif - mdi->mdio_started = 1; - G_RAID_DEBUG1(0, sc, "Array started."); + pv->pv_started = 1; + G_RAID_DEBUG1(0, sc, "Volume started."); g_raid_md_write_promise(md, NULL, NULL, NULL); /* Pickup any STALE/SPARE disks to refill array if needed. */ - g_raid_md_promise_refill(sc); +// g_raid_md_promise_refill(sc); - TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { - g_raid_event_send(vol, G_RAID_VOLUME_E_START, - G_RAID_EVENT_VOLUME); - } -#endif + g_raid_event_send(vol, G_RAID_VOLUME_E_START, G_RAID_EVENT_VOLUME); callout_stop(&pv->pv_start_co); G_RAID_DEBUG1(1, sc, "root_mount_rel %p", pv->pv_rootmount); @@ -924,28 +882,27 @@ g_raid_md_promise_new_disk(struct g_raid g_raid_promise_go, vol); pv->pv_rootmount = root_mount_hold("GRAID-Promise"); G_RAID_DEBUG1(1, sc, "root_mount_hold %p", pv->pv_rootmount); - g_raid_start_volume(vol); } else pv = vol->v_md_data; /* If we haven't started yet - check metadata freshness. */ - if (pv->pv_meta != NULL && mdi->mdio_started) - continue; - if (pv->pv_meta == NULL || - ((int16_t)(pdmeta->generation - pv->pv_generation)) > 0) { - G_RAID_DEBUG1(1, sc, "Newer disk"); - if (pv->pv_meta != NULL) - free(pv->pv_meta, M_MD_PROMISE); - pv->pv_meta = promise_meta_copy(pdmeta); - pv->pv_generation = pv->pv_meta->generation; - pv->pv_disks_present = 1; - } else if (pdmeta->generation == pv->pv_generation) { - pv->pv_disks_present++; - G_RAID_DEBUG1(1, sc, "Matching disk (%d of %d up)", - pv->pv_disks_present, - pv->pv_meta->total_disks); - } else { - G_RAID_DEBUG1(1, sc, "Older disk"); + if (pv->pv_meta == NULL || !pv->pv_started) { + if (pv->pv_meta == NULL || + ((int16_t)(pdmeta->generation - pv->pv_generation)) > 0) { + G_RAID_DEBUG1(1, sc, "Newer disk"); + if (pv->pv_meta != NULL) + free(pv->pv_meta, M_MD_PROMISE); + pv->pv_meta = promise_meta_copy(pdmeta); + pv->pv_generation = pv->pv_meta->generation; + pv->pv_disks_present = 1; + } else if (pdmeta->generation == pv->pv_generation) { + pv->pv_disks_present++; + G_RAID_DEBUG1(1, sc, "Matching disk (%d of %d up)", + pv->pv_disks_present, + pv->pv_meta->total_disks); + } else { + G_RAID_DEBUG1(1, sc, "Older disk"); + } } if (pv->pv_started) { From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 17:22:35 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 138071065670; Mon, 14 Mar 2011 17:22:35 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F3C678FC0C; Mon, 14 Mar 2011 17:22:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2EHMYTg001175; Mon, 14 Mar 2011 17:22:34 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EHMYSV001172; Mon, 14 Mar 2011 17:22:34 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103141722.p2EHMYSV001172@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 17:22:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219643 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 17:22:35 -0000 Author: mav Date: Mon Mar 14 17:22:34 2011 New Revision: 219643 URL: http://svn.freebsd.org/changeset/base/219643 Log: Few more bricks making Promise volumes reading basically working. Extend volume name fields from 16 to 32 characters, supported by Promise. Modified: projects/graid/head/sys/geom/raid/g_raid.h projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/g_raid.h ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 17:08:30 2011 (r219642) +++ projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 17:22:34 2011 (r219643) @@ -193,7 +193,7 @@ struct g_raid_subdisk { }; #define G_RAID_MAX_SUBDISKS 16 -#define G_RAID_MAX_VOLUMENAME 16 +#define G_RAID_MAX_VOLUMENAME 32 #define G_RAID_VOLUME_S_STARTING 0x00 #define G_RAID_VOLUME_S_BROKEN 0x01 Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 17:08:30 2011 (r219642) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 17:22:34 2011 (r219643) @@ -214,7 +214,7 @@ g_raid_md_promise_print(struct promise_r meta->disks[i].channel, meta->disks[i].device, meta->disks[i].id); } - printf("name <%.24s>\n", meta->name); + printf("name <%.32s>\n", meta->name); printf("=================================================\n"); } @@ -228,7 +228,6 @@ promise_meta_copy(struct promise_raid_co return (nmeta); } -#if 0 static int promise_meta_find_disk(struct promise_raid_conf *meta, uint64_t id) { @@ -240,6 +239,29 @@ promise_meta_find_disk(struct promise_ra } return (-1); } + +static void +promise_meta_get_name(struct promise_raid_conf *meta, char *buf) +{ + int i; + + strncpy(buf, meta->name, 32); + buf[32] = 0; + for (i = 31; i >= 0; i--) { + if (buf[i] > 0x20) + break; + buf[i] = 0; + } +} + +#if 0 +static void +promise_meta_put_name(struct promise_raid_conf *meta, char *buf) +{ + + memset(meta->name, 0x20, 32); + memcpy(meta->name, buf, MIN(strlen(buf), 32)); +} #endif static int @@ -381,20 +403,6 @@ promise_meta_write_spare(struct g_consum free(meta, M_MD_PROMISE); return (error); } - -static struct g_raid_disk * -g_raid_md_promise_get_disk(struct g_raid_softc *sc, int id) -{ - struct g_raid_disk *disk; - struct g_raid_md_promise_perdisk *pd; - - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - if (pd->pd_disk_pos == id) - break; - } - return (disk); -} #endif static struct g_raid_volume * @@ -451,41 +459,46 @@ g_raid_md_promise_supported(int level, i static int g_raid_md_promise_start_disk(struct g_raid_disk *disk, int sdn) { -#if 0 struct g_raid_softc *sc; - struct g_raid_subdisk *sd, *tmpsd; - struct g_raid_disk *olddisk, *tmpdisk; + struct g_raid_volume *vol; + struct g_raid_subdisk *sd; + struct g_raid_disk *olddisk; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd, *oldpd; + struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - struct promise_raid_vol *mvol; - struct promise_raid_map *mmap0, *mmap1; int disk_pos, resurrection = 0; sc = disk->d_softc; md = sc->sc_md; mdi = (struct g_raid_md_promise_object *)md; - meta = mdi->mdio_meta; pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; olddisk = NULL; + vol = g_raid_md_promise_get_volume(sc, pd->pd_meta[sdn]->volume_id); + KASSERT(vol != NULL, ("No Promise volume with ID %16jx", + pd->pd_meta[sdn]->volume_id)); + pv = vol->v_md_data; + meta = pv->pv_meta; + /* Find disk position in metadata by it's serial. */ - disk_pos = promise_meta_find_disk(meta, pd->pd_disk_meta.id); + disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id); if (disk_pos < 0) { G_RAID_DEBUG1(1, sc, "Unknown, probably new or stale disk"); /* Failed stale disk is useless for us. */ - if (pd->pd_disk_meta.flags & PROMISE_F_FAILED) { - g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); - return (0); - } +// if (pd->pd_disk_meta.flags & PROMISE_F_FAILED) { +// g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); +// return (0); +// } /* If we are in the start process, that's all for now. */ - if (!mdi->mdio_started) + if (!pv->pv_started) goto nofit; /* * If we have already started - try to get use of the disk. * Try to replace OFFLINE disks first, then FAILED. */ +#if 0 TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) { if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE && tmpdisk->d_state != G_RAID_DISK_S_FAILED) @@ -511,29 +524,32 @@ g_raid_md_promise_start_disk(struct g_ra } else if (olddisk == NULL) olddisk = tmpdisk; } +#endif if (olddisk == NULL) { nofit: +#if 0 if (pd->pd_disk_meta.flags & PROMISE_F_SPARE) { g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); return (1); } else { +#endif g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE); return (0); - } +// } } oldpd = (struct g_raid_md_promise_perdisk *)olddisk->d_md_data; - disk_pos = oldpd->pd_disk_pos; +// disk_pos = oldpd->pd_disk_pos; resurrection = 1; } + sd = &vol->v_subdisks[disk_pos]; + if (olddisk == NULL) { - /* Find placeholder by position. */ - olddisk = g_raid_md_promise_get_disk(sc, disk_pos); - if (olddisk == NULL) - panic("No disk at position %d!", disk_pos); - if (olddisk->d_state != G_RAID_DISK_S_OFFLINE) { + /* Look for disk at position. */ + olddisk = sd->sd_disk; + if (olddisk != NULL) { G_RAID_DEBUG1(1, sc, "More then one disk for pos %d", disk_pos); g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE); @@ -542,6 +558,7 @@ nofit: oldpd = (struct g_raid_md_promise_perdisk *)olddisk->d_md_data; } +#if 0 /* Replace failed disk or placeholder with new disk. */ TAILQ_FOREACH_SAFE(sd, &olddisk->d_subdisks, sd_next, tmpsd) { TAILQ_REMOVE(&olddisk->d_subdisks, sd, sd_next); @@ -552,25 +569,33 @@ nofit: pd->pd_disk_pos = disk_pos; /* If it was placeholder -- destroy it. */ - if (olddisk->d_state == G_RAID_DISK_S_OFFLINE) { - g_raid_destroy_disk(olddisk); - } else { + if (olddisk != NULL) { /* Otherwise, make it STALE_FAILED. */ g_raid_change_disk_state(olddisk, G_RAID_DISK_S_STALE_FAILED); /* Update global metadata just in case. */ memcpy(&meta->disk[disk_pos], &pd->pd_disk_meta, sizeof(struct promise_raid_disk)); } +#endif + + vol->v_subdisks[disk_pos].sd_disk = disk; + TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); /* Welcome the new disk. */ if (resurrection) g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); - else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) +/* else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) g_raid_change_disk_state(disk, G_RAID_DISK_S_FAILED); else if (meta->disk[disk_pos].flags & PROMISE_F_SPARE) g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); - else +*/ else g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); + /* Up to date disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); +#if 0 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { mvol = promise_get_volume(meta, (uintptr_t)(sd->sd_volume->v_md_data)); @@ -671,10 +696,9 @@ nofit: (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < meta->total_disks); } +#endif return (resurrection); -#endif - return (0); } #if 0 @@ -758,19 +782,13 @@ static void g_raid_md_promise_start(struct g_raid_volume *vol) { struct g_raid_softc *sc; + struct g_raid_disk *disk; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; + struct g_raid_md_promise_perdisk *pd; struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; -#if 0 - struct g_raid_md_promise_perdisk *pd; - struct promise_raid_vol *mvol; - struct promise_raid_map *mmap; - struct g_raid_volume *vol; - struct g_raid_subdisk *sd; - struct g_raid_disk *disk; - int i, j, disk_pos; -#endif + int i; sc = vol->v_softc; md = sc->sc_md; @@ -802,17 +820,14 @@ g_raid_md_promise_start(struct g_raid_vo vol->v_sectorsize = 512; //ZZZ g_raid_start_volume(vol); -#if 0 /* Make all disks found till the moment take their places. */ - do { - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state == G_RAID_DISK_S_NONE) { - g_raid_md_promise_start_disk(disk); - break; - } + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = disk->d_md_data; + for (i = 0; i < pd->pd_subdisks; i++) { + if (pd->pd_meta[i]->volume_id == meta->volume_id) + g_raid_md_promise_start_disk(disk, i); } - } while (disk != NULL); -#endif + } pv->pv_started = 1; G_RAID_DEBUG1(0, sc, "Volume started."); @@ -859,6 +874,7 @@ g_raid_md_promise_new_disk(struct g_raid struct g_raid_md_promise_pervolume *pv; struct g_raid_volume *vol; int i; + char buf[33]; sc = disk->d_softc; md = sc->sc_md; @@ -872,7 +888,8 @@ g_raid_md_promise_new_disk(struct g_raid vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); if (vol == NULL) { - vol = g_raid_create_volume(sc, pdmeta->name); + promise_meta_get_name(pdmeta, buf); + vol = g_raid_create_volume(sc, buf); pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO); pv->pv_id = pdmeta->volume_id; vol->v_md_data = pv; From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 19:04:44 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 992711065675; Mon, 14 Mar 2011 19:04:44 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 85BB58FC18; Mon, 14 Mar 2011 19:04:44 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2EJ4iKs003284; Mon, 14 Mar 2011 19:04:44 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EJ4ivX003278; Mon, 14 Mar 2011 19:04:44 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103141904.p2EJ4ivX003278@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 19:04:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219644 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 19:04:44 -0000 Author: mav Date: Mon Mar 14 19:04:44 2011 New Revision: 219644 URL: http://svn.freebsd.org/changeset/base/219644 Log: Do not sleep in callout handler context. Modified: projects/graid/head/sys/geom/raid/g_raid.c projects/graid/head/sys/geom/raid/md_intel.c projects/graid/head/sys/geom/raid/md_jmicron.c projects/graid/head/sys/geom/raid/md_promise.c projects/graid/head/sys/geom/raid/md_sii.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Mon Mar 14 17:22:34 2011 (r219643) +++ projects/graid/head/sys/geom/raid/g_raid.c Mon Mar 14 19:04:44 2011 (r219644) @@ -434,7 +434,6 @@ g_raid_event_send(void *arg, int event, struct g_raid_event *ep; int error; - ep = malloc(sizeof(*ep), M_RAID, M_WAITOK); if ((flags & G_RAID_EVENT_VOLUME) != 0) { sc = ((struct g_raid_volume *)arg)->v_softc; } else if ((flags & G_RAID_EVENT_DISK) != 0) { @@ -444,6 +443,10 @@ g_raid_event_send(void *arg, int event, } else { sc = arg; } + ep = malloc(sizeof(*ep), M_RAID, + sx_xlocked(&sc->sc_lock) ? M_WAITOK : M_NOWAIT); + if (ep == NULL) + return (ENOMEM); ep->e_tgt = arg; ep->e_event = event; ep->e_flags = flags; Modified: projects/graid/head/sys/geom/raid/md_intel.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_intel.c Mon Mar 14 17:22:34 2011 (r219643) +++ projects/graid/head/sys/geom/raid/md_intel.c Mon Mar 14 19:04:44 2011 (r219644) @@ -1077,12 +1077,10 @@ g_raid_intel_go(void *arg) sc = arg; md = sc->sc_md; mdi = (struct g_raid_md_intel_object *)md; - sx_xlock(&sc->sc_lock); if (!mdi->mdio_started) { G_RAID_DEBUG1(0, sc, "Force array start due to timeout."); g_raid_event_send(sc, G_RAID_NODE_E_START, 0); } - sx_xunlock(&sc->sc_lock); } static int Modified: projects/graid/head/sys/geom/raid/md_jmicron.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_jmicron.c Mon Mar 14 17:22:34 2011 (r219643) +++ projects/graid/head/sys/geom/raid/md_jmicron.c Mon Mar 14 19:04:44 2011 (r219644) @@ -785,12 +785,10 @@ g_raid_jmicron_go(void *arg) sc = arg; md = sc->sc_md; mdi = (struct g_raid_md_jmicron_object *)md; - sx_xlock(&sc->sc_lock); if (!mdi->mdio_started) { G_RAID_DEBUG1(0, sc, "Force array start due to timeout."); g_raid_event_send(sc, G_RAID_NODE_E_START, 0); } - sx_xunlock(&sc->sc_lock); } static int Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 17:22:34 2011 (r219643) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 19:04:44 2011 (r219644) @@ -854,13 +854,11 @@ g_raid_promise_go(void *arg) vol = arg; pv = vol->v_md_data; sc = vol->v_softc; - sx_xlock(&sc->sc_lock); if (!pv->pv_started) { G_RAID_DEBUG1(0, sc, "Force volume start due to timeout."); g_raid_event_send(vol, G_RAID_VOLUME_E_STARTMD, G_RAID_EVENT_VOLUME); } - sx_xunlock(&sc->sc_lock); } static void Modified: projects/graid/head/sys/geom/raid/md_sii.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_sii.c Mon Mar 14 17:22:34 2011 (r219643) +++ projects/graid/head/sys/geom/raid/md_sii.c Mon Mar 14 19:04:44 2011 (r219644) @@ -864,12 +864,10 @@ g_raid_sii_go(void *arg) sc = arg; md = sc->sc_md; mdi = (struct g_raid_md_sii_object *)md; - sx_xlock(&sc->sc_lock); if (!mdi->mdio_started) { G_RAID_DEBUG1(0, sc, "Force array start due to timeout."); g_raid_event_send(sc, G_RAID_NODE_E_START, 0); } - sx_xunlock(&sc->sc_lock); } static int From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 19:31:43 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B38AB1065672; Mon, 14 Mar 2011 19:31:43 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A04F38FC0C; Mon, 14 Mar 2011 19:31:43 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2EJVh2s003906; Mon, 14 Mar 2011 19:31:43 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EJVh3N003904; Mon, 14 Mar 2011 19:31:43 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103141931.p2EJVh3N003904@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 19:31:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219645 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 19:31:43 -0000 Author: mav Date: Mon Mar 14 19:31:43 2011 New Revision: 219645 URL: http://svn.freebsd.org/changeset/base/219645 Log: Don't forget to read subdisks position/sizes from metadata. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 19:04:44 2011 (r219644) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 19:31:43 2011 (r219645) @@ -590,6 +590,10 @@ nofit: g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); */ else g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); + + sd->sd_offset = pd->pd_meta[sdn]->disk_offset * 512; + sd->sd_size = pd->pd_meta[sdn]->disk_sectors * 512; + /* Up to date disk. */ g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE); @@ -782,6 +786,7 @@ static void g_raid_md_promise_start(struct g_raid_volume *vol) { struct g_raid_softc *sc; + struct g_raid_subdisk *sd; struct g_raid_disk *disk; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; @@ -818,6 +823,11 @@ g_raid_md_promise_start(struct g_raid_vo vol->v_disks_count = meta->total_disks; vol->v_mediasize = (off_t)meta->total_sectors * 512; //ZZZ vol->v_sectorsize = 512; //ZZZ + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + sd->sd_offset = (off_t)meta->disk_offset * 512; //ZZZ + sd->sd_size = (off_t)meta->disk_sectors * 512; //ZZZ + } g_raid_start_volume(vol); /* Make all disks found till the moment take their places. */ From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:09:16 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1A6A7106564A; Mon, 14 Mar 2011 23:09:16 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0A7508FC1E; Mon, 14 Mar 2011 23:09:16 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2EN9Flq014352; Mon, 14 Mar 2011 23:09:15 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EN9F9u014350; Mon, 14 Mar 2011 23:09:15 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142309.p2EN9F9u014350@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:09:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219649 - projects/ofed/head/sys/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:09:16 -0000 Author: jeff Date: Mon Mar 14 23:09:15 2011 New Revision: 219649 URL: http://svn.freebsd.org/changeset/base/219649 Log: - Add -fms-extensions to the OFED compile line to support anonymous unions. Modified: projects/ofed/head/sys/conf/kern.pre.mk Modified: projects/ofed/head/sys/conf/kern.pre.mk ============================================================================== --- projects/ofed/head/sys/conf/kern.pre.mk Mon Mar 14 22:51:51 2011 (r219648) +++ projects/ofed/head/sys/conf/kern.pre.mk Mon Mar 14 23:09:15 2011 (r219649) @@ -148,7 +148,7 @@ NORMAL_LINT= ${LINT} ${LINTFLAGS} ${CFLA # Infiniband C flags. Correct include paths and omit errors that linux # does not honor. OFEDINCLUDES= -I$S/ofed/include/ -OFEDNOERR= -Wno-cast-qual -Wno-pointer-arith +OFEDNOERR= -Wno-cast-qual -Wno-pointer-arith -fms-extensions OFEDCFLAGS= ${CFLAGS:N-I*} ${OFEDINCLUDES} ${CFLAGS:M-I*} ${OFEDNOERR} OFED_C_NOIMP= ${CC} -c -o ${.TARGET} ${OFEDCFLAGS} ${WERROR} ${PROF} OFED_C= ${OFED_C_NOIMP} ${.IMPSRC} From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:13:02 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2E930106566B; Mon, 14 Mar 2011 23:13:02 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1D31B8FC08; Mon, 14 Mar 2011 23:13:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2END2Xs014474; Mon, 14 Mar 2011 23:13:02 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2END2HI014467; Mon, 14 Mar 2011 23:13:02 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142313.p2END2HI014467@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:13:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219650 - projects/ofed/head/sys/ofed/drivers/net/mlx4 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:13:02 -0000 Author: jeff Date: Mon Mar 14 23:13:01 2011 New Revision: 219650 URL: http://svn.freebsd.org/changeset/base/219650 Log: - Port the Mellanox 10gigE driver. This supports ConnectX-2 cards which can be dual IB/Ethernet adapters. The port supports all of the usual high-end offloads. TSO/LRO/RSS/checksums etc. This is a beta quality driver, work is still underway. Sponsored by: Mellanox Technologies Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_cq.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_ethtool.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_frag.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_netdev.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_port.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_port.h projects/ofed/head/sys/ofed/drivers/net/mlx4/en_rx.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_selftest.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_tx.c projects/ofed/head/sys/ofed/drivers/net/mlx4/main.c projects/ofed/head/sys/ofed/drivers/net/mlx4/mlx4_en.h Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_cq.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_cq.c Mon Mar 14 23:09:15 2011 (r219649) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_cq.c Mon Mar 14 23:13:01 2011 (r219650) @@ -31,12 +31,12 @@ * */ +#include "mlx4_en.h" + #include #include #include -#include "mlx4_en.h" - static void mlx4_en_cq_event(struct mlx4_cq *cq, enum mlx4_event event) { return; @@ -55,14 +55,20 @@ int mlx4_en_create_cq(struct mlx4_en_pri cq->buf_size = cq->size * sizeof(struct mlx4_cqe); cq->vector = (ring + priv->port) % mdev->dev->caps.num_comp_vectors; + TASK_INIT(&cq->cq_task, 0, mlx4_en_rx_que, cq); } else { cq->buf_size = sizeof(struct mlx4_cqe); cq->vector = MLX4_LEAST_ATTACHED_VECTOR; + TASK_INIT(&cq->cq_task, 0, mlx4_en_tx_que, cq); } + cq->tq = taskqueue_create_fast("mlx4_en_que", M_NOWAIT, + taskqueue_thread_enqueue, &cq->tq); + taskqueue_start_threads(&cq->tq, 1, PI_NET, "%s cq", + if_name(priv->dev)); cq->ring = ring; cq->is_tx = mode; - spin_lock_init(&cq->lock); + mtx_init(&cq->lock.m, "mlx4 cq", NULL, MTX_DEF); err = mlx4_alloc_hwq_res(mdev->dev, &cq->wqres, cq->buf_size, 2 * PAGE_SIZE); @@ -105,9 +111,6 @@ int mlx4_en_activate_cq(struct mlx4_en_p init_timer(&cq->timer); cq->timer.function = mlx4_en_poll_tx_cq; cq->timer.data = (unsigned long) cq; - } else { - netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, 64); - napi_enable(&cq->napi); } return 0; @@ -117,22 +120,22 @@ void mlx4_en_destroy_cq(struct mlx4_en_p { struct mlx4_en_dev *mdev = priv->mdev; + taskqueue_drain(cq->tq, &cq->cq_task); + taskqueue_free(cq->tq); mlx4_en_unmap_buffer(&cq->wqres.buf); mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size); cq->buf_size = 0; cq->buf = NULL; + mtx_destroy(&cq->lock.m); } void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) { struct mlx4_en_dev *mdev = priv->mdev; + taskqueue_drain(cq->tq, &cq->cq_task); if (cq->is_tx) del_timer(&cq->timer); - else { - napi_disable(&cq->napi); - netif_napi_del(&cq->napi); - } mlx4_cq_free(mdev->dev, &cq->mcq); } Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_ethtool.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_ethtool.c Mon Mar 14 23:09:15 2011 (r219649) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_ethtool.c Mon Mar 14 23:13:01 2011 (r219650) @@ -390,7 +390,7 @@ static int mlx4_en_set_pauseparam(struct priv->prof->tx_pause = pause->tx_pause != 0; priv->prof->rx_pause = pause->rx_pause != 0; err = mlx4_SET_PORT_general(mdev->dev, priv->port, - priv->rx_skb_size + ETH_FCS_LEN, + priv->rx_mb_size + ETH_FCS_LEN, priv->prof->tx_pause, priv->prof->tx_ppp, priv->prof->rx_pause, Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_frag.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_frag.c Mon Mar 14 23:09:15 2011 (r219649) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_frag.c Mon Mar 14 23:13:01 2011 (r219650) @@ -31,17 +31,14 @@ * */ -#include -#include -#include -#include -#include - #include "mlx4_en.h" +#include +#include +#include static struct mlx4_en_ipfrag *find_session(struct mlx4_en_rx_ring *ring, - struct iphdr *iph) + struct ip *iph) { struct mlx4_en_ipfrag *session; int i; @@ -50,10 +47,10 @@ static struct mlx4_en_ipfrag *find_sessi session = &ring->ipfrag[i]; if (session->fragments == NULL) continue; - if (session->daddr == iph->daddr && - session->saddr == iph->saddr && - session->id == iph->id && - session->protocol == iph->protocol) { + if (session->daddr == iph->ip_dst.s_addr && + session->saddr == iph->ip_src.s_addr && + session->id == iph->ip_id && + session->protocol == iph->ip_p) { return session; } } @@ -61,7 +58,7 @@ static struct mlx4_en_ipfrag *find_sessi } static struct mlx4_en_ipfrag *start_session(struct mlx4_en_rx_ring *ring, - struct iphdr *iph) + struct ip *iph) { struct mlx4_en_ipfrag *session; int index = -1; @@ -86,22 +83,18 @@ static void flush_session(struct mlx4_en struct mlx4_en_ipfrag *session, u16 more) { - struct sk_buff *skb = session->fragments; - struct iphdr *iph = ip_hdr(skb); - struct net_device *dev = skb->dev; + struct mbuf *mb = session->fragments; + struct ip *iph = mb->m_pkthdr.header; + struct net_device *dev = mb->m_pkthdr.rcvif; /* Update IP length and checksum */ - iph->tot_len = htons(session->total_len); - iph->frag_off = htons(more | (session->offset >> 3)); - iph->check = 0; - iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); - - if (session->vlan) - vlan_hwaccel_receive_skb(skb, priv->vlgrp, - be16_to_cpu(session->sl_vid)); - else - netif_receive_skb(skb); - dev->last_rx = jiffies; + iph->ip_len = htons(session->total_len); + iph->ip_off = htons(more | (session->offset >> 3)); + iph->ip_sum = 0; + iph->ip_sum = in_cksum_skip(mb, iph->ip_hl * 4, + (char *)iph - mb->m_data); + + dev->if_input(dev, mb); session->fragments = NULL; session->last = NULL; } @@ -109,89 +102,73 @@ static void flush_session(struct mlx4_en static inline void frag_append(struct mlx4_en_priv *priv, struct mlx4_en_ipfrag *session, - struct sk_buff *skb, + struct mbuf *mb, unsigned int data_len) { - struct sk_buff *parent = session->fragments; + struct mbuf *parent = session->fragments; - /* Update skb bookkeeping */ - parent->len += data_len; - parent->data_len += data_len; + /* Update mb bookkeeping */ + parent->m_pkthdr.len += data_len; session->total_len += data_len; - skb_pull(skb, skb->len - data_len); - parent->truesize += skb->truesize; + m_adj(mb, mb->m_pkthdr.len - data_len); - if (session->last) - session->last->next = skb; - else - skb_shinfo(parent)->frag_list = skb; - - session->last = skb; + session->last->m_next = mb; + for (; mb->m_next != NULL; mb = mb->m_next); + session->last = mb; } int mlx4_en_rx_frags(struct mlx4_en_priv *priv, struct mlx4_en_rx_ring *ring, - struct sk_buff *skb, struct mlx4_cqe *cqe) + struct mbuf *mb, struct mlx4_cqe *cqe) { struct mlx4_en_ipfrag *session; - struct iphdr *iph; + struct ip *iph; u16 ip_len; u16 ip_hlen; int data_len; u16 offset; - skb_reset_network_header(skb); - skb_reset_transport_header(skb); - iph = ip_hdr(skb); - ip_len = ntohs(iph->tot_len); - ip_hlen = iph->ihl * 4; + iph = (struct ip *)(mtod(mb, char *) + ETHER_HDR_LEN); + mb->m_pkthdr.header = iph; + ip_len = ntohs(iph->ip_len); + ip_hlen = iph->ip_hl * 4; data_len = ip_len - ip_hlen; - offset = ntohs(iph->frag_off); - offset &= IP_OFFSET; + offset = ntohs(iph->ip_off); + offset &= IP_OFFMASK; offset <<= 3; session = find_session(ring, iph); - if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) { + if (unlikely(in_cksum_skip(mb, ip_hlen, (char *)iph - mb->m_data))) { if (session) flush_session(priv, session, IP_MF); return -EINVAL; } if (session) { if (unlikely(session->offset + session->total_len != - offset + ip_hlen)) { + offset + ip_hlen || + session->total_len + mb->m_pkthdr.len > 65536)) { flush_session(priv, session, IP_MF); goto new_session; } - /* Packets smaller then 60 bytes are padded to that size - * Need to fix len field of the skb to fit the actual data size - * Since ethernet header already removed, the IP total length - * is exactly the data size (the skb is linear) - */ - skb->len = ip_len; - - frag_append(priv, session, skb, data_len); + frag_append(priv, session, mb, data_len); } else { new_session: session = start_session(ring, iph); if (unlikely(!session)) return -ENOSPC; - session->fragments = skb; - session->daddr = iph->daddr; - session->saddr = iph->saddr; - session->id = iph->id; - session->protocol = iph->protocol; + session->fragments = mb; + session->daddr = iph->ip_dst.s_addr; + session->saddr = iph->ip_src.s_addr; + session->id = iph->ip_id; + session->protocol = iph->ip_p; session->total_len = ip_len; session->offset = offset; - session->vlan = (priv->vlgrp && - (be32_to_cpu(cqe->vlan_my_qpn) & - MLX4_CQE_VLAN_PRESENT_MASK)) ? 1 : 0; - session->sl_vid = cqe->sl_vid; + for (; mb->m_next != NULL; mb = mb->m_next); + session->last = mb; } - if (!(ntohs(iph->frag_off) & IP_MF)) + if (!(ntohs(iph->ip_off) & IP_MF)) flush_session(priv, session, 0); - else if (session->fragments->len + priv->dev->mtu > 65536) - flush_session(priv, session, IP_MF); return 0; } Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c Mon Mar 14 23:09:15 2011 (r219649) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c Mon Mar 14 23:13:01 2011 (r219650) @@ -31,7 +31,6 @@ * */ -#include #include #include #include @@ -162,6 +161,8 @@ static void mlx4_en_remove(struct mlx4_d mlx4_mr_free(dev, &mdev->mr); mlx4_uar_free(dev, &mdev->priv_uar); mlx4_pd_free(dev, mdev->priv_pdn); + sx_destroy(&mdev->state_lock.sx); + mtx_destroy(&mdev->uar_lock.m); kfree(mdev); } @@ -191,10 +192,10 @@ static void *mlx4_en_add(struct mlx4_dev if (mlx4_uar_alloc(dev, &mdev->priv_uar)) goto err_pd; + mtx_init(&mdev->uar_lock.m, "mlx4 uar", NULL, MTX_DEF); mdev->uar_map = ioremap(mdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE); if (!mdev->uar_map) goto err_uar; - spin_lock_init(&mdev->uar_lock); mdev->dev = dev; mdev->dma_device = &(dev->pdev->dev); @@ -253,7 +254,7 @@ static void *mlx4_en_add(struct mlx4_dev /* At this stage all non-port specific tasks are complete: * mark the card state as up */ - mutex_init(&mdev->state_lock); + sx_init(&mdev->state_lock.sx, "mlxen state"); mdev->device_up = true; /* Setup ports */ @@ -286,6 +287,7 @@ err_free_netdev: err_mr: mlx4_mr_free(dev, &mdev->mr); err_uar: + mtx_destroy(&mdev->uar_lock.m); mlx4_uar_free(dev, &mdev->priv_uar); err_pd: mlx4_pd_free(dev, mdev->priv_pdn); @@ -308,6 +310,7 @@ enum mlx4_query_reply mlx4_en_query(void return MLX4_QUERY_NOT_MINE; } +#if 0 static struct pci_device_id mlx4_en_pci_table[] = { { PCI_VDEVICE(MELLANOX, 0x6340) }, /* MT25408 "Hermon" SDR */ { PCI_VDEVICE(MELLANOX, 0x634a) }, /* MT25408 "Hermon" DDR */ @@ -342,6 +345,7 @@ static struct pci_device_id mlx4_en_pci_ }; MODULE_DEVICE_TABLE(pci, mlx4_en_pci_table); +#endif static struct mlx4_interface mlx4_en_interface = { .add = mlx4_en_add, @@ -365,3 +369,16 @@ static void __exit mlx4_en_cleanup(void) module_init(mlx4_en_init); module_exit(mlx4_en_cleanup); +#undef MODULE_VERSION +#include +static int +mlxen_evhand(module_t mod, int event, void *arg) +{ + return (0); +} +static moduledata_t mlxen_mod = { + .name = "mlxen", + .evhand = mlxen_evhand, +}; +DECLARE_MODULE(mlxen, mlxen_mod, SI_SUB_KLD, SI_ORDER_ANY); +MODULE_DEPEND(mlxen, mlx4, 1, 1, 1); Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_netdev.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_netdev.c Mon Mar 14 23:09:15 2011 (r219649) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_netdev.c Mon Mar 14 23:13:01 2011 (r219650) @@ -31,85 +31,62 @@ * */ -#include -#include -#include -#include +#include "mlx4_en.h" #include #include #include #include -#include "mlx4_en.h" -#include "en_port.h" - - -static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) -{ - struct mlx4_en_priv *priv = netdev_priv(dev); - - en_dbg(HW, priv, "Registering VLAN group:%p\n", grp); +#include +#include +#include +#include - spin_lock_bh(&priv->vlan_lock); - priv->vlgrp = grp; - priv->vlgrp_modified = true; - spin_unlock_bh(&priv->vlan_lock); -} +static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv); -static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) +static void mlx4_en_vlan_rx_add_vid(void *arg, struct net_device *dev, u16 vid) { struct mlx4_en_priv *priv = netdev_priv(dev); int idx; u8 field; -#ifndef HAVE_NETDEV_VLAN_FEATURES - struct net_device *vdev; -#endif - if (!priv->vlgrp) + if ((vid == 0) || (vid > 4095)) /* Invalid */ return; - en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n", - vid, vlan_group_get_device(priv->vlgrp, vid)); + en_dbg(HW, priv, "adding VLAN:%d\n", vid); - spin_lock_bh(&priv->vlan_lock); + spin_lock(&priv->vlan_lock); priv->vlgrp_modified = true; - idx = vid >> 3; - field = 1 << (vid & 0x7); + idx = vid >> 5; + field = 1 << (vid & 0x1f); if (priv->vlan_unregister[idx] & field) priv->vlan_unregister[idx] &= ~field; else priv->vlan_register[idx] |= field; - spin_unlock_bh(&priv->vlan_lock); -#ifndef HAVE_NETDEV_VLAN_FEATURES - vdev = vlan_group_get_device(priv->vlgrp, vid); - vdev->features |= dev->features; - vdev->features |= NETIF_F_LLTX; - vlan_group_set_device(priv->vlgrp, vid, vdev); -#endif + priv->vlans[idx] |= field; + spin_unlock(&priv->vlan_lock); } -static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) +static void mlx4_en_vlan_rx_kill_vid(void *arg, struct net_device *dev, u16 vid) { struct mlx4_en_priv *priv = netdev_priv(dev); int idx; u8 field; - if (!priv->vlgrp) + if ((vid == 0) || (vid > 4095)) /* Invalid */ return; - - en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n", - vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid)); - spin_lock_bh(&priv->vlan_lock); + en_dbg(HW, priv, "Killing VID:%d\n", vid); + spin_lock(&priv->vlan_lock); priv->vlgrp_modified = true; - vlan_group_set_device(priv->vlgrp, vid, NULL); - idx = vid >> 3; - field = 1 << (vid & 0x7); + idx = vid >> 5; + field = 1 << (vid & 0x1f); if (priv->vlan_register[idx] & field) priv->vlan_register[idx] &= ~field; else priv->vlan_unregister[idx] |= field; - spin_unlock_bh(&priv->vlan_lock); + priv->vlans[idx] &= ~field; + spin_unlock(&priv->vlan_lock); } u64 mlx4_en_mac_to_u64(u8 *addr) @@ -117,86 +94,58 @@ u64 mlx4_en_mac_to_u64(u8 *addr) u64 mac = 0; int i; - for (i = 0; i < ETH_ALEN; i++) { + for (i = 0; i < ETHER_ADDR_LEN; i++) { mac <<= 8; mac |= addr[i]; } return mac; } -static int mlx4_en_set_mac(struct net_device *dev, void *addr) -{ - struct mlx4_en_priv *priv = netdev_priv(dev); - struct mlx4_en_dev *mdev = priv->mdev; - struct sockaddr *saddr = addr; - - if (!is_valid_ether_addr(saddr->sa_data)) - return -EADDRNOTAVAIL; - - memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN); - priv->mac = mlx4_en_mac_to_u64(dev->dev_addr); - queue_work(mdev->workqueue, &priv->mac_task); - return 0; -} - -static void mlx4_en_do_set_mac(struct work_struct *work) -{ - struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, - mac_task); - struct mlx4_en_dev *mdev = priv->mdev; - int err = 0; - - mutex_lock(&mdev->state_lock); - if (priv->port_up) { - /* Remove old MAC and insert the new one */ - mlx4_unregister_mac(mdev->dev, priv->port, priv->mac_index); - err = mlx4_register_mac(mdev->dev, priv->port, - priv->mac, &priv->mac_index); - if (err) - en_err(priv, "Failed changing HW MAC address\n"); - } else - en_dbg(HW, priv, "Port is down while " - "registering mac, exiting...\n"); - - mutex_unlock(&mdev->state_lock); -} - -static void mlx4_en_clear_list(struct net_device *dev) +static int mlx4_en_cache_mclist(struct net_device *dev, u64 **mcaddrp) { - struct mlx4_en_priv *priv = netdev_priv(dev); - struct dev_mc_list *plist = priv->mc_list; - struct dev_mc_list *next; - - while (plist) { - next = plist->next; - kfree(plist); - plist = next; - } - priv->mc_list = NULL; -} + struct ifmultiaddr *ifma;; + u64 *mcaddr; + int cnt; + int i; -static void mlx4_en_cache_mclist(struct net_device *dev) -{ - struct mlx4_en_priv *priv = netdev_priv(dev); - struct dev_mc_list *mclist; - struct dev_mc_list *tmp; - struct dev_mc_list *plist = NULL; - - for (mclist = dev->mc_list; mclist; mclist = mclist->next) { - tmp = kmalloc(sizeof(struct dev_mc_list), GFP_ATOMIC); - if (!tmp) { - en_err(priv, "failed to allocate multicast list\n"); - mlx4_en_clear_list(dev); - return; + *mcaddrp = NULL; +restart: + cnt = 0; + if_maddr_rlock(dev); + TAILQ_FOREACH(ifma, &dev->if_multiaddrs, ifma_link) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + if (((struct sockaddr_dl *)ifma->ifma_addr)->sdl_alen != + ETHER_ADDR_LEN) + continue; + cnt++; + } + if_maddr_runlock(dev); + if (cnt == 0) + return (0); + mcaddr = kmalloc(sizeof(u64) * cnt, GFP_KERNEL); + if (mcaddr == NULL) + return (0); + i = 0; + if_maddr_rlock(dev); + TAILQ_FOREACH(ifma, &dev->if_multiaddrs, ifma_link) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + if (((struct sockaddr_dl *)ifma->ifma_addr)->sdl_alen != + ETHER_ADDR_LEN) + continue; + /* Make sure the list didn't grow. */ + if (i == cnt) { + if_maddr_runlock(dev); + kfree(mcaddr); + goto restart; } - memcpy(tmp, mclist, sizeof(struct dev_mc_list)); - tmp->next = NULL; - if (plist) - plist->next = tmp; - else - priv->mc_list = tmp; - plist = tmp; + mcaddr[i++] = mlx4_en_mac_to_u64( + LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); } + if_maddr_runlock(dev); + *mcaddrp = mcaddr; + return (i); } @@ -214,10 +163,8 @@ static void mlx4_en_do_set_multicast(str { struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, mcast_task); - struct mlx4_en_dev *mdev = priv->mdev; struct net_device *dev = priv->dev; - struct dev_mc_list *mclist; - u64 mcast_addr = 0; + struct mlx4_en_dev *mdev = priv->mdev; int err; mutex_lock(&mdev->state_lock); @@ -236,10 +183,8 @@ static void mlx4_en_do_set_multicast(str * Promsicuous mode: disable all filters */ - if (dev->flags & IFF_PROMISC) { + if (dev->if_flags & IFF_PROMISC) { if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) { - if (netif_msg_rx_status(priv)) - en_warn(priv, "Entering promiscuous mode\n"); priv->flags |= MLX4_EN_FLAG_PROMISC; /* Enable promiscouos mode */ @@ -269,8 +214,6 @@ static void mlx4_en_do_set_multicast(str */ if (priv->flags & MLX4_EN_FLAG_PROMISC) { - if (netif_msg_rx_status(priv)) - en_warn(priv, "Leaving promiscuous mode\n"); priv->flags &= ~MLX4_EN_FLAG_PROMISC; /* Disable promiscouos mode */ @@ -280,18 +223,22 @@ static void mlx4_en_do_set_multicast(str en_err(priv, "Failed disabling promiscous mode\n"); /* Enable port VLAN filter */ - err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); + err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlans); if (err) en_err(priv, "Failed enabling VLAN filter\n"); } /* Enable/disable the multicast filter according to IFF_ALLMULTI */ - if (dev->flags & IFF_ALLMULTI) { + if (dev->if_flags & IFF_ALLMULTI) { err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 0, MLX4_MCAST_DISABLE); if (err) en_err(priv, "Failed disabling multicast filter\n"); } else { + u64 *mcaddr; + int mccount; + int i; + err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 0, MLX4_MCAST_DISABLE); if (err) @@ -303,20 +250,16 @@ static void mlx4_en_do_set_multicast(str /* Update multicast list - we cache all addresses so they won't * change while HW is updated holding the command semaphor */ - netif_tx_lock_bh(dev); - mlx4_en_cache_mclist(dev); - netif_tx_unlock_bh(dev); - for (mclist = priv->mc_list; mclist; mclist = mclist->next) { - mcast_addr = mlx4_en_mac_to_u64(mclist->dmi_addr); + mccount = mlx4_en_cache_mclist(dev, &mcaddr); + for (i = 0; i < mccount; i++) mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, - mcast_addr, 0, MLX4_MCAST_CONFIG); - } + mcaddr[i], 0, MLX4_MCAST_CONFIG); err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 0, MLX4_MCAST_ENABLE); if (err) en_err(priv, "Failed enabling multicast filter\n"); - mlx4_en_clear_list(dev); + kfree(mcaddr); } out: mutex_unlock(&mdev->state_lock); @@ -337,37 +280,26 @@ static void mlx4_en_netpoll(struct net_d if (priv->rx_ring[i].use_frags) mlx4_en_process_rx_cq(dev, cq, 0); else - mlx4_en_process_rx_cq_skb(dev, cq, 0); + mlx4_en_process_rx_cq_mb(dev, cq, 0); spin_unlock_irqrestore(&cq->lock, flags); } } #endif -static void mlx4_en_tx_timeout(struct net_device *dev) +static void mlx4_en_watchdog_timeout(void *arg) { - struct mlx4_en_priv *priv = netdev_priv(dev); + struct mlx4_en_priv *priv = arg; struct mlx4_en_dev *mdev = priv->mdev; - if (netif_msg_timer(priv)) - en_warn(priv, "Tx timeout called on port:%d\n", priv->port); - - priv->port_stats.tx_timeout++; en_dbg(DRV, priv, "Scheduling watchdog\n"); queue_work(mdev->workqueue, &priv->watchdog_task); + if (priv->port_up) + callout_reset(&priv->watchdog_timer, MLX4_EN_WATCHDOG_TIMEOUT, + mlx4_en_watchdog_timeout, priv); } -static struct net_device_stats *mlx4_en_get_stats(struct net_device *dev) -{ - struct mlx4_en_priv *priv = netdev_priv(dev); - - spin_lock_bh(&priv->stats_lock); - memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats)); - spin_unlock_bh(&priv->stats_lock); - - return &priv->ret_stats; -} - +/* XXX This clears user settings in too many cases. */ static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) { struct mlx4_en_cq *cq; @@ -379,11 +311,11 @@ static void mlx4_en_set_default_moderati * satisfy our coelsing target. * - moder_time is set to a fixed value. */ - priv->rx_frames = MLX4_EN_RX_COAL_TARGET / priv->dev->mtu + 1; + priv->rx_frames = MLX4_EN_RX_COAL_TARGET / priv->dev->if_mtu + 1; priv->rx_usecs = MLX4_EN_RX_COAL_TIME; - en_dbg(INTR, priv, "Default coalesing params for mtu:%d - " + en_dbg(INTR, priv, "Default coalesing params for mtu:%ld - " "rx_frames:%d rx_usecs:%d\n", - priv->dev->mtu, priv->rx_frames, priv->rx_usecs); + priv->dev->if_mtu, priv->rx_frames, priv->rx_usecs); /* Setup cq moderation params */ for (i = 0; i < priv->rx_ring_num; i++) { @@ -430,11 +362,11 @@ static void mlx4_en_auto_moderation(stru if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ) return; - spin_lock_bh(&priv->stats_lock); - rx_packets = priv->stats.rx_packets; - rx_bytes = priv->stats.rx_bytes; - tx_packets = priv->stats.tx_packets; - spin_unlock_bh(&priv->stats_lock); + spin_lock(&priv->stats_lock); + rx_packets = priv->dev->if_ipackets; + rx_bytes = priv->dev->if_ibytes; + tx_packets = priv->dev->if_opackets; + spin_unlock(&priv->stats_lock); if (!priv->last_moder_jiffies || !period) goto out; @@ -505,32 +437,32 @@ out: static void mlx4_en_handle_vlans(struct mlx4_en_priv *priv) { - u8 vlan_register[MLX4_VLREG_SIZE]; - u8 vlan_unregister[MLX4_VLREG_SIZE]; + u8 vlan_register[VLAN_FLTR_SIZE]; + u8 vlan_unregister[VLAN_FLTR_SIZE]; int i, j, idx; u16 vid; /* cache the vlan data for processing * done under lock to avoid changes during work */ - spin_lock_bh(&priv->vlan_lock); - for (i = 0; i < MLX4_VLREG_SIZE; i++) { + spin_lock(&priv->vlan_lock); + for (i = 0; i < VLAN_FLTR_SIZE; i++) { vlan_register[i] = priv->vlan_register[i]; priv->vlan_register[i] = 0; vlan_unregister[i] = priv->vlan_unregister[i]; priv->vlan_unregister[i] = 0; } priv->vlgrp_modified = false; - spin_unlock_bh(&priv->vlan_lock); + spin_unlock(&priv->vlan_lock); /* Configure the vlan filter * The vlgrp is updated with all the vids that need to be allowed */ - if (mlx4_SET_VLAN_FLTR(priv->mdev->dev, priv->port, priv->vlgrp)) + if (mlx4_SET_VLAN_FLTR(priv->mdev->dev, priv->port, priv->vlans)) en_err(priv, "Failed configuring VLAN filter\n"); /* Configure the VLAN table */ - for (i = 0; i < MLX4_VLREG_SIZE; i++) { - for (j = 0; j < 8; j++) { - vid = (i << 3) + j; + for (i = 0; i < VLAN_FLTR_SIZE; i++) { + for (j = 0; j < 32; j++) { + vid = (i << 5) + j; if (vlan_register[i] & (1 << j)) if (mlx4_register_vlan(priv->mdev->dev, priv->port, vid, &idx)) en_dbg(HW, priv, "failed registering vlan %d\n", vid); @@ -569,7 +501,8 @@ static void mlx4_en_do_get_stats(struct queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); } if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) { - queue_work(mdev->workqueue, &priv->mac_task); + panic("mlx4_en_do_get_stats: Unexpected mac removed for %d\n", + priv->port); mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0; } mutex_unlock(&mdev->state_lock); @@ -587,11 +520,10 @@ static void mlx4_en_linkstate(struct wor * report to system log */ if (priv->last_link_state != linkstate) { if (linkstate == MLX4_DEV_EVENT_PORT_DOWN) { - en_info(priv, "Link Down\n"); - netif_carrier_off(priv->dev); + if_link_state_change(priv->dev, LINK_STATE_DOWN); } else { en_info(priv, "Link Up\n"); - netif_carrier_on(priv->dev); + if_link_state_change(priv->dev, LINK_STATE_UP); } } priv->last_link_state = linkstate; @@ -617,9 +549,9 @@ int mlx4_en_start_port(struct net_device } /* Calculate Rx buf size */ - dev->mtu = min(dev->mtu, priv->max_mtu); + dev->if_mtu = min(dev->if_mtu, priv->max_mtu); mlx4_en_calc_rx_buf(dev); - en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_skb_size); + en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_mb_size); /* Configure rx cq's and rings */ err = mlx4_en_activate_rx_rings(priv); @@ -689,7 +621,7 @@ int mlx4_en_start_port(struct net_device /* Configure port */ err = mlx4_SET_PORT_general(mdev->dev, priv->port, - priv->rx_skb_size + ETH_FCS_LEN, + priv->rx_mb_size + ETHER_CRC_LEN, priv->prof->tx_pause, priv->prof->tx_ppp, priv->prof->rx_pause, @@ -708,7 +640,8 @@ int mlx4_en_start_port(struct net_device /* Set port mac number */ en_dbg(DRV, priv, "Setting mac for port %d\n", priv->port); err = mlx4_register_mac(mdev->dev, priv->port, - priv->mac, &priv->mac_index); + mlx4_en_mac_to_u64(IF_LLADDR(dev)), + &priv->mac_index); if (err) { en_err(priv, "Failed setting port mac\n"); goto tx_err; @@ -723,11 +656,29 @@ int mlx4_en_start_port(struct net_device goto mac_err; } - /* Schedule multicast task to populate multicast list */ - queue_work(mdev->workqueue, &priv->mcast_task); + /* Set the various hardware offload abilities */ + dev->if_hwassist = 0; + if (dev->if_capenable & IFCAP_TSO4) + dev->if_hwassist |= CSUM_TSO; + if (dev->if_capenable & IFCAP_TXCSUM) + dev->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP); + if (dev->if_capenable & IFCAP_RXCSUM) + priv->rx_csum = 1; + else + priv->rx_csum = 0; priv->port_up = true; - netif_tx_start_all_queues(dev); + + /* Populate multicast list */ + mlx4_en_set_multicast(dev); + + /* Enable the queues. */ + atomic_clear_int(&dev->if_drv_flags, IFF_DRV_OACTIVE); + atomic_set_int(&dev->if_drv_flags, IFF_DRV_RUNNING); + + callout_reset(&priv->watchdog_timer, MLX4_EN_WATCHDOG_TIMEOUT, + mlx4_en_watchdog_timeout, priv); + return 0; mac_err: @@ -760,11 +711,6 @@ void mlx4_en_stop_port(struct net_device return; } - /* Synchronize with tx routine */ - netif_tx_lock_bh(dev); - netif_tx_stop_all_queues(dev); - netif_tx_unlock_bh(dev); - /* Set port as not active */ priv->port_up = false; @@ -788,13 +734,15 @@ void mlx4_en_stop_port(struct net_device /* Free RX Rings */ for (i = 0; i < priv->rx_ring_num; i++) { mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]); - while (test_bit(NAPI_STATE_SCHED, &priv->rx_cq[i].napi.state)) - msleep(1); mlx4_en_deactivate_cq(priv, &priv->rx_cq[i]); } /* close port*/ mlx4_CLOSE_PORT(mdev->dev, priv->port); + + callout_stop(&priv->watchdog_timer); + + atomic_clear_int(&dev->if_drv_flags, IFF_DRV_RUNNING); } static void mlx4_en_restart(struct work_struct *work) @@ -803,7 +751,21 @@ static void mlx4_en_restart(struct work_ watchdog_task); struct mlx4_en_dev *mdev = priv->mdev; struct net_device *dev = priv->dev; + struct mlx4_en_tx_ring *ring; + int i; + + if (priv->blocked == 0 || priv->port_up == 0) + return; + for (i = 0; i < priv->tx_ring_num; i++) { + ring = &priv->tx_ring[i]; + if (ring->blocked && + ring->watchdog_time + MLX4_EN_WATCHDOG_TIMEOUT < ticks) + goto reset; + } + return; +reset: + priv->port_stats.tx_timeout++; en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); mutex_lock(&mdev->state_lock); @@ -816,18 +778,23 @@ static void mlx4_en_restart(struct work_ } -static int mlx4_en_open(struct net_device *dev) +static void +mlx4_en_init(void *arg) { - struct mlx4_en_priv *priv = netdev_priv(dev); - struct mlx4_en_dev *mdev = priv->mdev; + struct mlx4_en_priv *priv; + struct mlx4_en_dev *mdev; + struct ifnet *dev; int i; - int err = 0; + priv = arg; + dev = priv->dev; + mdev = priv->mdev; mutex_lock(&mdev->state_lock); + if (dev->if_drv_flags & IFF_DRV_RUNNING) + mlx4_en_stop_port(dev); if (!mdev->device_up) { en_err(priv, "Cannot open - device down/disabled\n"); - err = -EBUSY; goto out; } @@ -835,7 +802,6 @@ static int mlx4_en_open(struct net_devic if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) en_dbg(HW, priv, "Failed dumping statistics\n"); - memset(&priv->stats, 0, sizeof(priv->stats)); memset(&priv->pstats, 0, sizeof(priv->pstats)); for (i = 0; i < priv->tx_ring_num; i++) { @@ -848,30 +814,11 @@ static int mlx4_en_open(struct net_devic } mlx4_en_set_default_moderation(priv); - err = mlx4_en_start_port(dev); - if (err) + if (mlx4_en_start_port(dev)) en_err(priv, "Failed starting port:%d\n", priv->port); out: mutex_unlock(&mdev->state_lock); - return err; -} - - *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:16:58 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 39A3A10656B4; Mon, 14 Mar 2011 23:16:58 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 29BB28FC0C; Mon, 14 Mar 2011 23:16:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ENGwKj014574; Mon, 14 Mar 2011 23:16:58 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ENGwpm014572; Mon, 14 Mar 2011 23:16:58 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142316.p2ENGwpm014572@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:16:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219651 - projects/ofed/head/sys/kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:16:58 -0000 Author: jeff Date: Mon Mar 14 23:16:57 2011 New Revision: 219651 URL: http://svn.freebsd.org/changeset/base/219651 Log: - Use SLIST_FOREACH_SAFE when removing OIDs which will be freed when not using a sysctl context. I don't know how we could've gone this long without running into this bug before. Modified: projects/ofed/head/sys/kern/kern_sysctl.c Modified: projects/ofed/head/sys/kern/kern_sysctl.c ============================================================================== --- projects/ofed/head/sys/kern/kern_sysctl.c Mon Mar 14 23:13:01 2011 (r219650) +++ projects/ofed/head/sys/kern/kern_sysctl.c Mon Mar 14 23:16:57 2011 (r219651) @@ -369,12 +369,12 @@ int sysctl_remove_name(struct sysctl_oid *parent, const char *name, int del, int recurse) { - struct sysctl_oid *p; + struct sysctl_oid *p, *tmp; int error; error = ENOENT; SYSCTL_XLOCK(); - SLIST_FOREACH(p, SYSCTL_CHILDREN(parent), oid_link) { + SLIST_FOREACH_SAFE(p, SYSCTL_CHILDREN(parent), oid_link, tmp) { if (strcmp(p->oid_name, name) == 0) { error = sysctl_remove_oid_locked(p, del, recurse); break; @@ -389,7 +389,7 @@ sysctl_remove_name(struct sysctl_oid *pa static int sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse) { - struct sysctl_oid *p; + struct sysctl_oid *p, *tmp; int error; SYSCTL_ASSERT_XLOCKED(); @@ -408,7 +408,8 @@ sysctl_remove_oid_locked(struct sysctl_o */ if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) { if (oidp->oid_refcnt == 1) { - SLIST_FOREACH(p, SYSCTL_CHILDREN(oidp), oid_link) { + SLIST_FOREACH_SAFE(p, + SYSCTL_CHILDREN(oidp), oid_link, tmp) { if (!recurse) return (ENOTEMPTY); error = sysctl_remove_oid_locked(p, del, From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:19:04 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C87A2106567A; Mon, 14 Mar 2011 23:19:04 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B63488FC15; Mon, 14 Mar 2011 23:19:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ENJ4I9014660; Mon, 14 Mar 2011 23:19:04 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ENJ4cO014651; Mon, 14 Mar 2011 23:19:04 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142319.p2ENJ4cO014651@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:19:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219652 - in projects/ofed/head/sys: amd64/conf conf modules modules/mlx4 modules/mlx4ib modules/mlxen modules/mthca ofed/drivers/infiniband/hw/mlx4 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:19:04 -0000 Author: jeff Date: Mon Mar 14 23:19:04 2011 New Revision: 219652 URL: http://svn.freebsd.org/changeset/base/219652 Log: - Rename mlx4 to mlx4ib to indicate that it is the infiniband mlx4 driver. - Add the mlxen device for the ethernet front end. I chose not to name it mlx4en to avoid confusion in scripts which parse unit numbers. - Add module builds for Infiniband device drivers. Currently the stack must be compiled in for various reasons but drivers can be dynamically loaded and unloaded. Added: projects/ofed/head/sys/modules/mlx4/ projects/ofed/head/sys/modules/mlx4/Makefile projects/ofed/head/sys/modules/mlx4ib/ projects/ofed/head/sys/modules/mlx4ib/Makefile projects/ofed/head/sys/modules/mlxen/ projects/ofed/head/sys/modules/mlxen/Makefile projects/ofed/head/sys/modules/mthca/ projects/ofed/head/sys/modules/mthca/Makefile Modified: projects/ofed/head/sys/amd64/conf/GENERIC projects/ofed/head/sys/conf/files projects/ofed/head/sys/modules/Makefile projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Modified: projects/ofed/head/sys/amd64/conf/GENERIC ============================================================================== --- projects/ofed/head/sys/amd64/conf/GENERIC Mon Mar 14 23:16:57 2011 (r219651) +++ projects/ofed/head/sys/amd64/conf/GENERIC Mon Mar 14 23:19:04 2011 (r219652) @@ -74,7 +74,7 @@ options GDB # Support remote GDB. options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS -#options WITNESS # Enable checks to detect deadlocks and cycles +options WITNESS # Enable checks to detect deadlocks and cycles options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed options ALT_BREAK_TO_DEBUGGER options MALLOC_DEBUG_MAXZONES=8 # Separate malloc(9) zones @@ -94,7 +94,8 @@ options OFED # Infiniband protocol sta options SDP # Sockets Direct Protocol for infiniband device ipoib # IP over IB devices options IPOIB_CM # Use connect mode ipoib -device mlx4 # ConnectX cards +device mlx4ib # ConnectX Infiniband support +device mlxen # ConnectX Ethernet support device mthca # Infinihost cards # Floppy drives Modified: projects/ofed/head/sys/conf/files ============================================================================== --- projects/ofed/head/sys/conf/files Mon Mar 14 23:16:57 2011 (r219651) +++ projects/ofed/head/sys/conf/files Mon Mar 14 23:19:04 2011 (r219652) @@ -2869,88 +2869,114 @@ ofed/drivers/infiniband/ulp/sdp/sdp_tx.c no-depend \ compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/" -ofed/drivers/infiniband/hw/mlx4/ah.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/ah.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/cq.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/cq.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/doorbell.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/doorbell.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/mad.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/mad.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/main.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/main.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/mr.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/mr.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/qp.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/qp.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/srq.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/srq.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/infiniband/hw/mlx4/wc.c optional mlx4 \ +ofed/drivers/infiniband/hw/mlx4/wc.c optional mlx4ib \ no-depend obj-prefix "mlx4ib_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/infiniband/hw/mlx4/" -ofed/drivers/net/mlx4/alloc.c optional mlx4 \ + +ofed/drivers/net/mlx4/alloc.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/catas.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/cmd.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/cq.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/eq.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/catas.c optional mlx4 \ +ofed/drivers/net/mlx4/fw.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/cmd.c optional mlx4 \ +ofed/drivers/net/mlx4/icm.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/cq.c optional mlx4 \ +ofed/drivers/net/mlx4/intf.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/eq.c optional mlx4 \ +ofed/drivers/net/mlx4/main.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/fw.c optional mlx4 \ +ofed/drivers/net/mlx4/mcg.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/icm.c optional mlx4 \ +ofed/drivers/net/mlx4/mr.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/intf.c optional mlx4 \ +ofed/drivers/net/mlx4/pd.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/main.c optional mlx4 \ +ofed/drivers/net/mlx4/port.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/mcg.c optional mlx4 \ +ofed/drivers/net/mlx4/profile.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/mr.c optional mlx4 \ +ofed/drivers/net/mlx4/qp.c optional mlx4ib | mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/pd.c optional mlx4 \ +ofed/drivers/net/mlx4/reset.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/sense.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/srq.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" +ofed/drivers/net/mlx4/xrcd.c optional mlx4ib | mlxen \ + no-depend obj-prefix "mlx4_" \ + compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" + +ofed/drivers/net/mlx4/en_cq.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/port.c optional mlx4 \ +ofed/drivers/net/mlx4/en_frag.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/profile.c optional mlx4 \ +ofed/drivers/net/mlx4/en_main.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/qp.c optional mlx4 \ +ofed/drivers/net/mlx4/en_netdev.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/reset.c optional mlx4 \ +ofed/drivers/net/mlx4/en_port.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/sense.c optional mlx4 \ +ofed/drivers/net/mlx4/en_resources.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/srq.c optional mlx4 \ +ofed/drivers/net/mlx4/en_rx.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" -ofed/drivers/net/mlx4/xrcd.c optional mlx4 \ +ofed/drivers/net/mlx4/en_tx.c optional mlxen \ no-depend obj-prefix "mlx4_" \ compile-with "${OFED_C_NOIMP} -I$S/ofed/drivers/net/mlx4/" Modified: projects/ofed/head/sys/modules/Makefile ============================================================================== --- projects/ofed/head/sys/modules/Makefile Mon Mar 14 23:16:57 2011 (r219651) +++ projects/ofed/head/sys/modules/Makefile Mon Mar 14 23:19:04 2011 (r219652) @@ -183,6 +183,9 @@ SUBDIR= ${_3dfx} \ mfi \ mii \ mlx \ + mlx4 \ + mlx4ib \ + mlxen \ ${_mly} \ mmc \ mmcsd \ @@ -193,6 +196,7 @@ SUBDIR= ${_3dfx} \ msdosfs_iconv \ ${_mse} \ msk \ + mthca \ mvs \ mwl \ mwlfw \ Added: projects/ofed/head/sys/modules/mlx4/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ofed/head/sys/modules/mlx4/Makefile Mon Mar 14 23:19:04 2011 (r219652) @@ -0,0 +1,14 @@ +#$FreeBSD$ +.PATH: ${.CURDIR}/../../ofed/drivers/net/mlx4 +KMOD = mlx4 +SRCS = device_if.h bus_if.h pci_if.h vnode_if.h +SRCS+= alloc.c catas.c cmd.c cq.c eq.c fw.c icm.c intf.c main.c mcg.c mr.c +SRCS+= pd.c port.c profile.c qp.c reset.c sense.c srq.c xrcd.c + +CFLAGS+= -I${.CURDIR}/../../ofed/drivers/net/mlx4 +CFLAGS+= -I${.CURDIR}/../../ofed/include/ +CFLAGS+= -DINET6 + +.include + +CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions Added: projects/ofed/head/sys/modules/mlx4ib/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ofed/head/sys/modules/mlx4ib/Makefile Mon Mar 14 23:19:04 2011 (r219652) @@ -0,0 +1,11 @@ +#$FreeBSD$ +.PATH: ${.CURDIR}/../../ofed/drivers/infiniband/hw/mlx4 +KMOD = mlx4ib +SRCS = device_if.h bus_if.h pci_if.h vnode_if.h +SRCS+= ah.c cq.c doorbell.c mad.c main.c mr.c qp.c srq.c wc.c + +CFLAGS+= -I${.CURDIR}/../../ofed/include/ -DINET6 + +.include + +CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions Added: projects/ofed/head/sys/modules/mlxen/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ofed/head/sys/modules/mlxen/Makefile Mon Mar 14 23:19:04 2011 (r219652) @@ -0,0 +1,13 @@ +#$FreeBSD$ +.PATH: ${.CURDIR}/../../ofed/drivers/net/mlx4 +KMOD = mlxen +SRCS = device_if.h bus_if.h pci_if.h vnode_if.h +SRCS += en_cq.c en_frag.c en_main.c en_netdev.c en_port.c en_resources.c +SRCS += en_rx.c en_tx.c +CFLAGS+= -I${.CURDIR}/../../ofed/drivers/net/mlx4 +CFLAGS+= -I${.CURDIR}/../../ofed/include/ +CFLAGS+= -DINET6 + +.include + +CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions Added: projects/ofed/head/sys/modules/mthca/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/ofed/head/sys/modules/mthca/Makefile Mon Mar 14 23:19:04 2011 (r219652) @@ -0,0 +1,14 @@ +#$FreeBSD$ +.PATH: ${.CURDIR}/../../ofed/drivers/infiniband/hw/mthca +KMOD = mthca +SRCS = device_if.h bus_if.h pci_if.h vnode_if.h +SRCS+= mthca_allocator.c mthca_av.c mthca_catas.c mthca_cmd.c mthca_cq.c +SRCS+= mthca_eq.c mthca_mad.c mthca_main.c mthca_mcg.c mthca_memfree.c +SRCS+= mthca_mr.c mthca_pd.c mthca_profile.c mthca_provider.c mthca_qp.c +SRCS+= mthca_reset.c mthca_srq.c mthca_uar.c + +CFLAGS+= -I${.CURDIR}/../../ofed/include/ -DINET6 + +.include + +CFLAGS+= -Wno-cast-qual -Wno-pointer-arith -fms-extensions Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Mon Mar 14 23:16:57 2011 (r219651) +++ projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Mon Mar 14 23:19:04 2011 (r219652) @@ -1564,3 +1564,17 @@ static void __exit mlx4_ib_cleanup(void) module_init_order(mlx4_ib_init, SI_ORDER_MIDDLE); module_exit(mlx4_ib_cleanup); + +#undef MODULE_VERSION +#include +static int +mlx4ib_evhand(module_t mod, int event, void *arg) +{ + return (0); +} +static moduledata_t mlx4ib_mod = { + .name = "mlx4ib", + .evhand = mlx4ib_evhand, +}; +DECLARE_MODULE(mlx4ib, mlx4ib_mod, SI_SUB_KLD, SI_ORDER_ANY); +MODULE_DEPEND(mlx4ib, mlx4, 1, 1, 1); From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:49:42 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3CC7C106564A; Mon, 14 Mar 2011 23:49:42 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2D0328FC0C; Mon, 14 Mar 2011 23:49:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ENngen015294; Mon, 14 Mar 2011 23:49:42 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ENngsC015292; Mon, 14 Mar 2011 23:49:42 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103142349.p2ENngsC015292@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 14 Mar 2011 23:49:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219654 - projects/altix/sys/ia64/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:49:42 -0000 Author: marcel Date: Mon Mar 14 23:49:41 2011 New Revision: 219654 URL: http://svn.freebsd.org/changeset/base/219654 Log: Don't define IA64_PBVM_PAGE_SIZE as 1U shifted to the left by some amount. The compiler seems to assume it's a 32-bit integral and rounding to the page size using the standard expression (((u_long)(x) + mask) & ~mask), results in a 32-bit value. Dropping the 'U' suffix is enough to have the compiler treat the expression as a 64-bit integral. Modified: projects/altix/sys/ia64/include/vmparam.h Modified: projects/altix/sys/ia64/include/vmparam.h ============================================================================== --- projects/altix/sys/ia64/include/vmparam.h Mon Mar 14 23:30:14 2011 (r219653) +++ projects/altix/sys/ia64/include/vmparam.h Mon Mar 14 23:49:41 2011 (r219654) @@ -179,7 +179,7 @@ (IA64_RR_BASE(IA64_PBVM_RR + 1) - IA64_PBVM_PGTBL_MAXSZ) #define IA64_PBVM_PAGE_SHIFT 16 /* 64KB */ -#define IA64_PBVM_PAGE_SIZE (1U << IA64_PBVM_PAGE_SHIFT) +#define IA64_PBVM_PAGE_SIZE (1 << IA64_PBVM_PAGE_SHIFT) #define IA64_PBVM_PAGE_MASK (IA64_PBVM_PAGE_SIZE - 1) /* From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:54:19 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 756851065676; Mon, 14 Mar 2011 23:54:19 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4B7738FC12; Mon, 14 Mar 2011 23:54:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ENsJ5D015419; Mon, 14 Mar 2011 23:54:19 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ENsJ4x015415; Mon, 14 Mar 2011 23:54:19 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142354.p2ENsJ4x015415@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:54:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219655 - in projects/ofed/head/sys/ofed/drivers: infiniband/hw/mlx4 net/mlx4 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:54:19 -0000 Author: jeff Date: Mon Mar 14 23:54:19 2011 New Revision: 219655 URL: http://svn.freebsd.org/changeset/base/219655 Log: - Putting my module defines in SI_SUB_KLD made them sensitive to link order. Move them all the way down to SI_SUB_SMP. The module handlers don't do anything anyway. Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c projects/ofed/head/sys/ofed/drivers/net/mlx4/main.c Modified: projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Mon Mar 14 23:49:41 2011 (r219654) +++ projects/ofed/head/sys/ofed/drivers/infiniband/hw/mlx4/main.c Mon Mar 14 23:54:19 2011 (r219655) @@ -1576,5 +1576,5 @@ static moduledata_t mlx4ib_mod = { .name = "mlx4ib", .evhand = mlx4ib_evhand, }; -DECLARE_MODULE(mlx4ib, mlx4ib_mod, SI_SUB_KLD, SI_ORDER_ANY); +DECLARE_MODULE(mlx4ib, mlx4ib_mod, SI_SUB_SMP, SI_ORDER_ANY); MODULE_DEPEND(mlx4ib, mlx4, 1, 1, 1); Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c Mon Mar 14 23:49:41 2011 (r219654) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/en_main.c Mon Mar 14 23:54:19 2011 (r219655) @@ -380,5 +380,5 @@ static moduledata_t mlxen_mod = { .name = "mlxen", .evhand = mlxen_evhand, }; -DECLARE_MODULE(mlxen, mlxen_mod, SI_SUB_KLD, SI_ORDER_ANY); +DECLARE_MODULE(mlxen, mlxen_mod, SI_SUB_SMP, SI_ORDER_ANY); MODULE_DEPEND(mlxen, mlx4, 1, 1, 1); Modified: projects/ofed/head/sys/ofed/drivers/net/mlx4/main.c ============================================================================== --- projects/ofed/head/sys/ofed/drivers/net/mlx4/main.c Mon Mar 14 23:49:41 2011 (r219654) +++ projects/ofed/head/sys/ofed/drivers/net/mlx4/main.c Mon Mar 14 23:54:19 2011 (r219655) @@ -1701,4 +1701,4 @@ static moduledata_t mlx4_mod = { .evhand = mlx4_evhand, }; MODULE_VERSION(mlx4, 1); -DECLARE_MODULE(mlx4, mlx4_mod, SI_SUB_KLD, SI_ORDER_ANY); +DECLARE_MODULE(mlx4, mlx4_mod, SI_SUB_SMP, SI_ORDER_ANY); From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 06:04:13 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8A3A4106564A; Tue, 15 Mar 2011 06:04:13 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 78B2C8FC08; Tue, 15 Mar 2011 06:04:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2F64DhI023236; Tue, 15 Mar 2011 06:04:13 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2F64DNV023234; Tue, 15 Mar 2011 06:04:13 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103150604.p2F64DNV023234@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 15 Mar 2011 06:04:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219657 - projects/altix/sys/boot/ia64/common X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 06:04:13 -0000 Author: marcel Date: Tue Mar 15 06:04:13 2011 New Revision: 219657 URL: http://svn.freebsd.org/changeset/base/219657 Log: Round the size, not the top address. This makes the code less sensitive to compiler bugs (32-bit truncation). Modified: projects/altix/sys/boot/ia64/common/exec.c Modified: projects/altix/sys/boot/ia64/common/exec.c ============================================================================== --- projects/altix/sys/boot/ia64/common/exec.c Tue Mar 15 01:06:27 2011 (r219656) +++ projects/altix/sys/boot/ia64/common/exec.c Tue Mar 15 06:04:13 2011 (r219657) @@ -160,8 +160,8 @@ mmu_setup_paged(vm_offset_t pbvm_top) PTE_AR_RW); /* Wire as much of the PBVM we can. This must be a power of 2. */ - pbvm_top = (pbvm_top + IA64_PBVM_PAGE_MASK) & ~IA64_PBVM_PAGE_MASK; sz = pbvm_top - IA64_PBVM_BASE; + sz = (sz + IA64_PBVM_PAGE_MASK) & ~IA64_PBVM_PAGE_MASK; while (sz & (sz - 1)) sz -= IA64_PBVM_PAGE_SIZE; mmu_wire(IA64_PBVM_BASE, ia64_pgtbl[0], sz, PTE_AR_RWX); From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 06:07:02 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8F4C4106564A; Tue, 15 Mar 2011 06:07:02 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 796538FC14; Tue, 15 Mar 2011 06:07:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2F672Yv023337; Tue, 15 Mar 2011 06:07:02 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2F672xq023335; Tue, 15 Mar 2011 06:07:02 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103150607.p2F672xq023335@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 15 Mar 2011 06:07:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219658 - projects/altix/sys/ia64/ia64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 06:07:02 -0000 Author: marcel Date: Tue Mar 15 06:07:02 2011 New Revision: 219658 URL: http://svn.freebsd.org/changeset/base/219658 Log: Re-order the TRs so that there're less gaps. This could have a performance impact. Modified: projects/altix/sys/ia64/ia64/machdep.c Modified: projects/altix/sys/ia64/ia64/machdep.c ============================================================================== --- projects/altix/sys/ia64/ia64/machdep.c Tue Mar 15 06:04:13 2011 (r219657) +++ projects/altix/sys/ia64/ia64/machdep.c Tue Mar 15 06:07:02 2011 (r219658) @@ -636,7 +636,7 @@ map_vhpt(uintptr_t vhpt) ia64_set_ifa(vhpt); ia64_set_itir(pmap_vhpt_log2size << 2); ia64_srlz_d(); - __asm __volatile("itr.d dtr[%0]=%1" :: "r"(2), "r"(pte)); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(4), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); ia64_srlz_i(); } @@ -674,9 +674,9 @@ map_pal_code(void) ia64_set_ifa(va); ia64_set_itir(shft << 2); ia64_srlz_d(); - __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte)); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(2), "r"(pte)); ia64_srlz_d(); - __asm __volatile("itr.i itr[%0]=%1" :: "r"(3), "r"(pte)); + __asm __volatile("itr.i itr[%0]=%1" :: "r"(2), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); ia64_srlz_i(); } @@ -700,9 +700,9 @@ map_gateway_page(void) ia64_set_ifa(VM_MAXUSER_ADDRESS); ia64_set_itir(PAGE_SHIFT << 2); ia64_srlz_d(); - __asm __volatile("itr.d dtr[%0]=%1" :: "r"(4), "r"(pte)); + __asm __volatile("itr.d dtr[%0]=%1" :: "r"(3), "r"(pte)); ia64_srlz_d(); - __asm __volatile("itr.i itr[%0]=%1" :: "r"(4), "r"(pte)); + __asm __volatile("itr.i itr[%0]=%1" :: "r"(3), "r"(pte)); __asm __volatile("mov psr.l=%0" :: "r" (psr)); ia64_srlz_i(); From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 06:53:33 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E07CE106566C; Tue, 15 Mar 2011 06:53:33 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D07918FC16; Tue, 15 Mar 2011 06:53:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2F6rXEk024407; Tue, 15 Mar 2011 06:53:33 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2F6rXnN024405; Tue, 15 Mar 2011 06:53:33 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103150653.p2F6rXnN024405@svn.freebsd.org> From: Alexander Motin Date: Tue, 15 Mar 2011 06:53:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219659 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 06:53:34 -0000 Author: mav Date: Tue Mar 15 06:53:33 2011 New Revision: 219659 URL: http://svn.freebsd.org/changeset/base/219659 Log: Prefer to use CONCAT transformation module for any array with only one disk. AMD/ATI RAID BIOS for some reason writes RAIDREADY disk as 1-disk RAID0, not as JBOD. Not sure Promise BIOS does the same to just map it at MD. 1-disk RAID0 is also works fine, but CONCAT is more efficient there. Modified: projects/graid/head/sys/geom/raid/tr_concat.c Modified: projects/graid/head/sys/geom/raid/tr_concat.c ============================================================================== --- projects/graid/head/sys/geom/raid/tr_concat.c Tue Mar 15 06:07:02 2011 (r219658) +++ projects/graid/head/sys/geom/raid/tr_concat.c Tue Mar 15 06:53:33 2011 (r219659) @@ -73,7 +73,7 @@ static struct g_raid_tr_class g_raid_tr_ "CONCAT", g_raid_tr_concat_methods, sizeof(struct g_raid_tr_concat_object), - .trc_priority = 100 + .trc_priority = 50 }; static int @@ -83,7 +83,9 @@ g_raid_tr_taste_concat(struct g_raid_tr_ trs = (struct g_raid_tr_concat_object *)tr; if (tr->tro_volume->v_raid_level != G_RAID_VOLUME_RL_SINGLE && - tr->tro_volume->v_raid_level != G_RAID_VOLUME_RL_CONCAT) + tr->tro_volume->v_raid_level != G_RAID_VOLUME_RL_CONCAT && + !(tr->tro_volume->v_disks_count == 1 && + tr->tro_volume->v_raid_level != G_RAID_VOLUME_RL_UNKNOWN)) return (G_RAID_TR_TASTE_FAIL); trs->trso_starting = 1; return (G_RAID_TR_TASTE_SUCCEED); From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 12:24:40 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 63F8E106566B; Tue, 15 Mar 2011 12:24:40 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 500088FC21; Tue, 15 Mar 2011 12:24:40 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2FCOeQb042725; Tue, 15 Mar 2011 12:24:40 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2FCOeU4042723; Tue, 15 Mar 2011 12:24:40 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103151224.p2FCOeU4042723@svn.freebsd.org> From: Alexander Motin Date: Tue, 15 Mar 2011 12:24:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219665 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 12:24:40 -0000 Author: mav Date: Tue Mar 15 12:24:40 2011 New Revision: 219665 URL: http://svn.freebsd.org/changeset/base/219665 Log: Add initial support for Promise metadata writing. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Tue Mar 15 10:17:18 2011 (r219664) +++ projects/graid/head/sys/geom/raid/md_promise.c Tue Mar 15 12:24:40 2011 (r219665) @@ -121,12 +121,9 @@ struct promise_raid_conf { } __packed; struct g_raid_md_promise_perdisk { + int pd_updated; int pd_subdisks; struct promise_raid_conf *pd_meta[PROMISE_MAX_SUBDISKS]; -// struct { -// int pd_disk_pos; -// struct promise_raid_disk pd_disk_meta; -// } pd_subdisk[PROMISE_MAX_SUBDISKS]; }; struct g_raid_md_promise_pervolume { @@ -254,7 +251,6 @@ promise_meta_get_name(struct promise_rai } } -#if 0 static void promise_meta_put_name(struct promise_raid_conf *meta, char *buf) { @@ -262,7 +258,6 @@ promise_meta_put_name(struct promise_rai memset(meta->name, 0x20, 32); memcpy(meta->name, buf, MIN(strlen(buf), 32)); } -#endif static int promise_meta_read(struct g_consumer *cp, struct promise_raid_conf **metaarr) @@ -290,12 +285,14 @@ next: /* Check if this is an Promise RAID struct */ if (strncmp(meta->promise_id, PROMISE_MAGIC, strlen(PROMISE_MAGIC)) && strncmp(meta->promise_id, FREEBSD_MAGIC, strlen(FREEBSD_MAGIC))) { - G_RAID_DEBUG(1, "Promise signature check failed on %s", pp->name); + if (subdisks == 0) + G_RAID_DEBUG(1, + "Promise signature check failed on %s", pp->name); g_free(buf); return (subdisks); } meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK); - memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize * 4)); + memcpy(meta, buf, MIN(sizeof(*meta), pp->sectorsize * 4)); g_free(buf); /* Check metadata checksum. */ @@ -313,6 +310,13 @@ next: return (subdisks); } + if (meta->total_disks < 1 || meta->total_disks > PROMISE_MAX_DISKS) { + G_RAID_DEBUG(1, "Wrong number of disks on %s (%d)", + pp->name, meta->total_disks); + free(meta, M_MD_PROMISE); + return (subdisks); + } + /* Save this part and look for next. */ *metaarr = meta; metaarr++; @@ -323,46 +327,44 @@ next: return (subdisks); } -#if 0 static int -promise_meta_write(struct g_consumer *cp, struct promise_raid_conf *meta) +promise_meta_write(struct g_consumer *cp, + struct promise_raid_conf **metaarr, int nsd) { struct g_provider *pp; + struct promise_raid_conf *meta; char *buf; - int error, i, sectors; + int error, i, subdisk; uint32_t checksum, *ptr; pp = cp->provider; - - /* Recalculate checksum for case if metadata were changed. */ - meta->checksum = 0; - for (checksum = 0, ptr = (uint32_t *)meta, i = 0; - i < (meta->config_size / sizeof(uint32_t)); i++) { - checksum += *ptr++; - } - meta->checksum = checksum; - - /* Create and fill buffer. */ - sectors = (meta->config_size + pp->sectorsize - 1) / pp->sectorsize; - buf = malloc(sectors * pp->sectorsize, M_MD_PROMISE, M_WAITOK | M_ZERO); - if (sectors > 1) { - memcpy(buf, ((char *)meta) + pp->sectorsize, - (sectors - 1) * pp->sectorsize); - } - memcpy(buf + (sectors - 1) * pp->sectorsize, meta, pp->sectorsize); - - error = g_write_data(cp, - pp->mediasize - pp->sectorsize * (1 + sectors), - buf, pp->sectorsize * sectors); + subdisk = 0; +next: + buf = malloc(pp->sectorsize * 4, M_MD_PROMISE, M_WAITOK | M_ZERO); + if (subdisk < nsd) { + meta = metaarr[subdisk]; + /* Recalculate checksum for case if metadata were changed. */ + meta->checksum = 0; + for (checksum = 0, ptr = (uint32_t *)meta, i = 0; i < 511; i++) + checksum += *ptr++; + meta->checksum = checksum; + memcpy(buf, meta, MIN(pp->sectorsize * 4, sizeof(*meta))); + } + error = g_write_data(cp, pp->mediasize - pp->sectorsize * + (63 - subdisk * PROMISE_META_OFFSET), + buf, pp->sectorsize * 4); if (error != 0) { G_RAID_DEBUG(1, "Cannot write metadata to %s (error=%d).", pp->name, error); } - free(buf, M_MD_PROMISE); + + subdisk++; + if (subdisk < PROMISE_MAX_SUBDISKS) + goto next; + return (error); } -#endif static int promise_meta_erase(struct g_consumer *cp) @@ -423,11 +425,13 @@ static int g_raid_md_promise_supported(int level, int qual, int disks, int force) { + if (disks > PROMISE_MAX_DISKS) + return (0); switch (level) { case G_RAID_VOLUME_RL_RAID0: if (disks < 1) return (0); - if (!force && (disks < 2 || disks > 6)) + if (!force && disks < 2) return (0); break; case G_RAID_VOLUME_RL_RAID1: @@ -439,14 +443,24 @@ g_raid_md_promise_supported(int level, i case G_RAID_VOLUME_RL_RAID1E: if (disks < 2) return (0); + if (disks % 2 != 0) + return (0); if (!force && (disks != 4)) return (0); break; + case G_RAID_VOLUME_RL_SINGLE: + if (disks != 1) + return (0); + if (!force) + return (0); + break; + case G_RAID_VOLUME_RL_CONCAT: + if (disks < 2) + return (0); + break; case G_RAID_VOLUME_RL_RAID5: if (disks < 3) return (0); - if (!force && disks > 6) - return (0); break; default: return (0); @@ -591,8 +605,8 @@ nofit: */ else g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); - sd->sd_offset = pd->pd_meta[sdn]->disk_offset * 512; - sd->sd_size = pd->pd_meta[sdn]->disk_sectors * 512; + sd->sd_offset = (off_t)pd->pd_meta[sdn]->disk_offset * 512; + sd->sd_size = (off_t)pd->pd_meta[sdn]->disk_sectors * 512; /* Up to date disk. */ g_raid_change_subdisk_state(sd, @@ -841,7 +855,7 @@ g_raid_md_promise_start(struct g_raid_vo pv->pv_started = 1; G_RAID_DEBUG1(0, sc, "Volume started."); - g_raid_md_write_promise(md, NULL, NULL, NULL); + g_raid_md_write_promise(md, vol, NULL, NULL); /* Pickup any STALE/SPARE disks to refill array if needed. */ // g_raid_md_promise_refill(sc); @@ -893,8 +907,7 @@ g_raid_md_promise_new_disk(struct g_raid pdmeta = pd->pd_meta[i]; /* Look for volume with matching ID. */ - vol = g_raid_md_promise_get_volume(sc, - pdmeta->volume_id); + vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); if (vol == NULL) { promise_meta_get_name(pdmeta, buf); vol = g_raid_create_volume(sc, buf); @@ -929,10 +942,18 @@ g_raid_md_promise_new_disk(struct g_raid G_RAID_DEBUG1(1, sc, "Older disk"); } } + } + + for (i = 0; i < pd->pd_subdisks; i++) { + pdmeta = pd->pd_meta[i]; + + /* Look for volume with matching ID. */ + vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); + pv = vol->v_md_data; if (pv->pv_started) { if (g_raid_md_promise_start_disk(disk, i)) - g_raid_md_write_promise(md, NULL, NULL, NULL); + g_raid_md_write_promise(md, vol, NULL, NULL); } else { /* If we collected all needed disks - start array. */ if (pv->pv_disks_present == pv->pv_meta->total_disks) @@ -1372,7 +1393,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o /* Write metadata based on created entities. */ G_RAID_DEBUG1(0, sc, "Array started."); - g_raid_md_write_promise(md, NULL, NULL, NULL); + g_raid_md_write_promise(md, vol, NULL, NULL); /* Pickup any STALE/SPARE disks to refill array if needed. */ g_raid_md_promise_refill(sc); @@ -1551,7 +1572,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o } /* Write metadata based on created entities. */ - g_raid_md_write_promise(md, NULL, NULL, NULL); + g_raid_md_write_promise(md, vol, NULL, NULL); g_raid_event_send(vol, G_RAID_VOLUME_E_START, G_RAID_EVENT_VOLUME); @@ -1781,19 +1802,15 @@ static int g_raid_md_write_promise(struct g_raid_md_object *md, struct g_raid_volume *tvol, struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) { -#if 0 struct g_raid_softc *sc; struct g_raid_volume *vol; struct g_raid_subdisk *sd; struct g_raid_disk *disk; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd; + struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - struct promise_raid_vol *mvol; - struct promise_raid_map *mmap0, *mmap1; - off_t sectorsize = 512, pos; - const char *version, *cv; - int vi, sdi, numdisks, len, state, stale; + int i, j; sc = md->mdo_softc; mdi = (struct g_raid_md_promise_object *)md; @@ -1801,213 +1818,124 @@ g_raid_md_write_promise(struct g_raid_md if (sc->sc_stopping == G_RAID_DESTROY_HARD) return (0); - /* Bump generation. Newly written metadata may differ from previous. */ - mdi->mdio_generation++; - - /* Count number of disks. */ - numdisks = 0; + /* Clear "updated" flags and scan for deleted volumes. */ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - if (pd->pd_disk_pos < 0) - continue; - numdisks++; - if (disk->d_state == G_RAID_DISK_S_ACTIVE) { - pd->pd_disk_meta.flags = - PROMISE_F_ONLINE | PROMISE_F_ASSIGNED; - } else if (disk->d_state == G_RAID_DISK_S_FAILED) { - pd->pd_disk_meta.flags = PROMISE_F_FAILED | PROMISE_F_ASSIGNED; - } else { - pd->pd_disk_meta.flags = PROMISE_F_ASSIGNED; - if (pd->pd_disk_meta.id != 0xffffffff) { - pd->pd_disk_meta.id = 0xffffffff; - } - } - } + pd->pd_updated = 0; - /* Fill anchor and disks. */ - meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK | M_ZERO); - memcpy(&meta->promise_id[0], PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); - meta->generation = mdi->mdio_generation; - meta->attributes = PROMISE_ATTR_CHECKSUM; - meta->total_disks = numdisks; - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - if (pd->pd_disk_pos < 0) - continue; - meta->disk[pd->pd_disk_pos] = pd->pd_disk_meta; + for (i = 0; i < pd->pd_subdisks; i++) { + vol = g_raid_md_promise_get_volume(sc, + pd->pd_meta[i]->volume_id); + if (vol != NULL && !vol->v_stopping) + continue; + free(pd->pd_meta[i], M_MD_PROMISE); + for (j = i; j < pd->pd_subdisks - 1; j++) + pd->pd_meta[j] = pd->pd_meta[j + 1]; + pd->pd_meta[PROMISE_MAX_SUBDISKS - 1] = NULL; + pd->pd_subdisks--; + pd->pd_updated = 1; + } } - /* Fill volumes and maps. */ - vi = 0; - version = PROMISE_VERSION_1000; + /* Generate new per-volume metadata for affected volumes. */ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { if (vol->v_stopping) continue; - mvol = promise_get_volume(meta, vi); - - /* New metadata may have different volumes order. */ - vol->v_md_data = (void *)(intptr_t)vi; - - for (sdi = 0; sdi < vol->v_disks_count; sdi++) { - sd = &vol->v_subdisks[sdi]; - if (sd->sd_disk != NULL) - break; - } - if (sdi >= vol->v_disks_count) - panic("No any filled subdisk in volume"); - if (vol->v_mediasize >= 0x20000000000llu) - meta->attributes |= PROMISE_ATTR_2TB; - if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0) - meta->attributes |= PROMISE_ATTR_RAID0; - else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) - meta->attributes |= PROMISE_ATTR_RAID1; - else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) - meta->attributes |= PROMISE_ATTR_RAID5; - else - meta->attributes |= PROMISE_ATTR_RAID10; - - if (meta->attributes & PROMISE_ATTR_2TB) - cv = PROMISE_VERSION_1300; -// else if (dev->status == DEV_CLONE_N_GO) -// cv = PROMISE_VERSION_1206; - else if (vol->v_disks_count > 4) - cv = PROMISE_VERSION_1204; - else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) - cv = PROMISE_VERSION_1202; - else if (vol->v_disks_count > 2) - cv = PROMISE_VERSION_1201; - else if (vi > 0) - cv = PROMISE_VERSION_1200; - else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) - cv = PROMISE_VERSION_1100; - else - cv = PROMISE_VERSION_1000; - if (strcmp(cv, version) > 0) - version = cv; - - strlcpy(&mvol->name[0], vol->v_name, sizeof(mvol->name)); - mvol->total_sectors = vol->v_mediasize / sectorsize; - - /* Check for any recovery in progress. */ - state = G_RAID_SUBDISK_S_ACTIVE; - pos = 0x7fffffffffffffffllu; - stale = 0; - for (sdi = 0; sdi < vol->v_disks_count; sdi++) { - sd = &vol->v_subdisks[sdi]; - if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) - state = G_RAID_SUBDISK_S_REBUILD; - else if (sd->sd_state == G_RAID_SUBDISK_S_RESYNC && - state != G_RAID_SUBDISK_S_REBUILD) - state = G_RAID_SUBDISK_S_RESYNC; - else if (sd->sd_state == G_RAID_SUBDISK_S_STALE) - stale = 1; - if ((sd->sd_state == G_RAID_SUBDISK_S_REBUILD || - sd->sd_state == G_RAID_SUBDISK_S_RESYNC) && - sd->sd_rebuild_pos < pos) - pos = sd->sd_rebuild_pos; - } - if (state == G_RAID_SUBDISK_S_REBUILD) { - mvol->migr_state = 1; - mvol->migr_type = PROMISE_MT_REBUILD; - } else if (state == G_RAID_SUBDISK_S_RESYNC) { - mvol->migr_state = 1; - /* mvol->migr_type = PROMISE_MT_REPAIR; */ - mvol->migr_type = PROMISE_MT_VERIFY; - mvol->state |= PROMISE_ST_VERIFY_AND_FIX; - } else - mvol->migr_state = 0; - mvol->dirty = (vol->v_dirty || stale); + if (tvol != NULL && vol != tvol) + continue; - mmap0 = promise_get_map(mvol, 0); + pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; + pv->pv_generation++; - /* Write map / common part of two maps. */ - mmap0->offset = sd->sd_offset / sectorsize; - mmap0->disk_sectors = sd->sd_size / sectorsize; - mmap0->strip_sectors = vol->v_strip_size / sectorsize; - if (vol->v_state == G_RAID_VOLUME_S_BROKEN) - mmap0->status = PROMISE_S_FAILURE; - else if (vol->v_state == G_RAID_VOLUME_S_DEGRADED) - mmap0->status = PROMISE_S_DEGRADED; - else - mmap0->status = PROMISE_S_READY; - if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0) - mmap0->type = PROMISE_T_RAID0; + meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK | M_ZERO); + memcpy(meta->promise_id, PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); + meta->dummy_0 = 0x00020000; + meta->integrity = PROMISE_I_VALID; + + meta->generation = pv->pv_generation; + meta->status = PROMISE_S_VALID | PROMISE_S_ONLINE | + PROMISE_S_INITED | PROMISE_S_READY; + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0 || + vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) + meta->type = PROMISE_T_RAID0; else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 || vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) - mmap0->type = PROMISE_T_RAID1; + meta->type = PROMISE_T_RAID1; + else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID3) + meta->type = PROMISE_T_RAID3; + else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) + meta->type = PROMISE_T_RAID5; + else if (vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT) + meta->type = PROMISE_T_SPAN; else - mmap0->type = PROMISE_T_RAID5; - mmap0->total_disks = vol->v_disks_count; - if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1) - mmap0->total_domains = vol->v_disks_count; - else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) - mmap0->total_domains = 2; + meta->type = PROMISE_T_JBOD; + meta->total_disks = vol->v_disks_count; + meta->stripe_shift = ffs(vol->v_strip_size / 1024); + meta->array_width = vol->v_disks_count; + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) + meta->array_width /= 2; + if (pv->pv_meta != NULL) + meta->array_number = pv->pv_meta->array_number; + meta->total_sectors = vol->v_mediasize / vol->v_sectorsize; + meta->cylinders = meta->total_sectors / (254 * 63); + meta->heads = 254; + meta->sectors = 63; + if (pv->pv_meta != NULL) + meta->volume_id = pv->pv_meta->volume_id; else - mmap0->total_domains = 1; - mmap0->stripe_count = sd->sd_size / vol->v_strip_size / - mmap0->total_domains; - mmap0->failed_disk_num = 0xff; - mmap0->ddf = 1; - - /* If there are two maps - copy common and update. */ - if (mvol->migr_state) { - mvol->curr_migr_unit = pos / - vol->v_strip_size / mmap0->total_domains; - mmap1 = promise_get_map(mvol, 1); - memcpy(mmap1, mmap0, sizeof(struct promise_raid_map)); - mmap0->status = PROMISE_S_READY; - } else - mmap1 = NULL; + arc4rand(&meta->volume_id, sizeof(meta->volume_id), 0); + for (i = 0; i < vol->v_disks_count; i++) { + meta->disks[i].flags = PROMISE_F_VALID | + PROMISE_F_ONLINE | PROMISE_F_ASSIGNED; + meta->disks[i].number = i; + if (pv->pv_meta != NULL) { + meta->disks[i].id = pv->pv_meta->disks[i].id; + } else { + arc4rand(&meta->disks[i].id, + sizeof(meta->disks[i].id), 0); + } + } + promise_meta_put_name(meta, vol->v_name); + if (pv->pv_meta != NULL) + free(pv->pv_meta, M_MD_PROMISE); + pv->pv_meta = meta; + + /* Copy new metadata to the disks, adding or replacing old. */ + for (i = 0; i < vol->v_disks_count; i++) { + sd = &vol->v_subdisks[i]; + disk = sd->sd_disk; + if (disk == NULL) + continue; + pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; + for (j = 0; j < pd->pd_subdisks; j++) { + if (pd->pd_meta[j]->volume_id == meta->volume_id) + break; + } + if (j == pd->pd_subdisks) + pd->pd_subdisks++; + if (pd->pd_meta[j] != NULL) + free(pd->pd_meta[j], M_MD_PROMISE); + pd->pd_meta[j] = promise_meta_copy(meta); + pd->pd_meta[j]->disk = meta->disks[i]; + pd->pd_meta[j]->disk_offset = sd->sd_offset / 512; + pd->pd_meta[j]->disk_sectors = sd->sd_size / 512; + pd->pd_meta[j]->rebuild_lba = sd->sd_rebuild_pos / 512; + pd->pd_updated = 1; + } + } - /* Write disk indexes and put rebuild flags. */ - for (sdi = 0; sdi < vol->v_disks_count; sdi++) { - sd = &vol->v_subdisks[sdi]; - pd = (struct g_raid_md_promise_perdisk *) - sd->sd_disk->d_md_data; - mmap0->disk_idx[sdi] = pd->pd_disk_pos; - if (mvol->migr_state) - mmap1->disk_idx[sdi] = pd->pd_disk_pos; - if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD || - sd->sd_state == G_RAID_SUBDISK_S_RESYNC) { - mmap1->disk_idx[sdi] |= PROMISE_DI_RBLD; - } else if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE && - sd->sd_state != G_RAID_SUBDISK_S_STALE) { - mmap0->disk_idx[sdi] |= PROMISE_DI_RBLD; - if (mvol->migr_state) - mmap1->disk_idx[sdi] |= PROMISE_DI_RBLD; - } - if ((sd->sd_state == G_RAID_SUBDISK_S_NONE || - sd->sd_state == G_RAID_SUBDISK_S_FAILED) && - mmap0->failed_disk_num == 0xff) { - mmap0->failed_disk_num = sdi; - if (mvol->migr_state) - mmap1->failed_disk_num = sdi; - } - } - vi++; - } - meta->total_volumes = vi; - if (strcmp(version, PROMISE_VERSION_1300) != 0) - meta->attributes &= PROMISE_ATTR_CHECKSUM; - memcpy(&meta->version[0], version, sizeof(PROMISE_VERSION_1000)); - - /* We are done. Print meta data and store them to disks. */ - g_raid_md_promise_print(meta); - if (mdi->mdio_meta != NULL) - free(mdi->mdio_meta, M_MD_PROMISE); - mdi->mdio_meta = meta; TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - if (disk->d_state != G_RAID_DISK_S_ACTIVE) + if (!pd->pd_updated) continue; - if (pd->pd_meta != NULL) { - free(pd->pd_meta, M_MD_PROMISE); - pd->pd_meta = NULL; - } - pd->pd_meta = promise_meta_copy(meta); - promise_meta_write(disk->d_consumer, meta); + G_RAID_DEBUG(1, "Writing Promise metadata to %s", + g_raid_get_diskname(disk)); + for (i = 0; i < pd->pd_subdisks; i++) + g_raid_md_promise_print(pd->pd_meta[i]); + promise_meta_write(disk->d_consumer, + pd->pd_meta, pd->pd_subdisks); } -#endif + return (0); } From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 15:59:38 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1ED53106564A; Tue, 15 Mar 2011 15:59:38 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 01B098FC12; Tue, 15 Mar 2011 15:59:38 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2FFxbsI047669; Tue, 15 Mar 2011 15:59:37 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2FFxbaS047667; Tue, 15 Mar 2011 15:59:37 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201103151559.p2FFxbaS047667@svn.freebsd.org> From: Attilio Rao Date: Tue, 15 Mar 2011 15:59:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219670 - projects/sv/sys/netinet X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 15:59:38 -0000 Author: attilio Date: Tue Mar 15 15:59:37 2011 New Revision: 219670 URL: http://svn.freebsd.org/changeset/base/219670 Log: - Fix copyright years - Add __FBSDID() - Sort the static variables by use, size and makes comments style compliant. Modified: projects/sv/sys/netinet/netdump_client.c Modified: projects/sv/sys/netinet/netdump_client.c ============================================================================== --- projects/sv/sys/netinet/netdump_client.c Tue Mar 15 13:53:39 2011 (r219669) +++ projects/sv/sys/netinet/netdump_client.c Tue Mar 15 15:59:37 2011 (r219670) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2005 Sandvine Incorporated. All rights reserved. + * Copyright (c) 2005-2011 Sandvine Incorporated. All rights reserved. * Copyright (c) 2000 Darrell Anderson * All rights reserved. * @@ -37,6 +37,8 @@ #include "opt_netdump.h" #include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -116,25 +118,32 @@ static int sysctl_force_crash(SYSCTL_HA #endif static int sysctl_handle_inaddr(SYSCTL_HANDLER_ARGS); -static eventhandler_tag nd_tag = NULL; /* record of our shutdown event */ -static uint32_t nd_seqno = 1; /* current sequence number */ -static uint64_t rcvd_acks; /* flags for out of order acks */ -static int dump_failed, have_server_mac; -static uint16_t nd_server_port = NETDUMP_PORT; /* port to respond on */ -static unsigned char buf[MAXDUMPPGS*PAGE_SIZE]; /* Must be at least as big as - * the chunks dumpsys() gives - * us */ +/* Must be at least as big as the chunks dumpsys() gives us. */ +static unsigned char buf[MAXDUMPPGS * PAGE_SIZE]; static struct ether_addr nd_gw_mac; +static eventhandler_tag nd_tag; +static uint64_t rcvd_acks; +static uint32_t nd_seqno = 1; +static int dump_failed, have_server_mac; + +/* + * Times to poll the NIC (0.5ms each poll) before assuming packetloss + * occurred (default to 5s). + */ +static int nd_polls = 10000; -static int nd_enable = 0; /* if we should perform a network dump */ -static char nd_ifp_str[IFNAMSIZ]; /* String rappresenting the interface */ -static struct in_addr nd_server = {INADDR_ANY}; /* server address */ -static struct in_addr nd_client = {INADDR_ANY}; /* client (our) address */ -static struct in_addr nd_gw = {INADDR_ANY}; /* gw, if set */ -struct ifnet *nd_ifp = NULL; -static int nd_polls=10000; /* Times to poll the NIC (0.5ms each poll) before - * assuming packetloss occurred: 5s by default */ -static int nd_retries=10; /* Times to retransmit lost packets */ +/* Times to retransmit lost packets. */ +static int nd_retries = 10; + +/* General dynamic settings. */ +static char nd_ifp_str[IFNAMSIZ]; +static struct ether_addr nd_gw_mac; +static struct in_addr nd_server = {INADDR_ANY}; +static struct in_addr nd_client = {INADDR_ANY}; +static struct in_addr nd_gw = {INADDR_ANY}; +struct ifnet *nd_ifp; +static int nd_enable = 0; +static uint16_t nd_server_port = NETDUMP_PORT; /* Tunables storages. */ static char nd_server_tun[INET_ADDRSTRLEN]; From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 16:50:18 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 54A0A106564A; Tue, 15 Mar 2011 16:50:18 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 43CF18FC27; Tue, 15 Mar 2011 16:50:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2FGoIeQ048826; Tue, 15 Mar 2011 16:50:18 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2FGoIcP048824; Tue, 15 Mar 2011 16:50:18 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103151650.p2FGoIcP048824@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 15 Mar 2011 16:50:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219671 - projects/altix/sys/ia64/ia64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 16:50:18 -0000 Author: marcel Date: Tue Mar 15 16:50:17 2011 New Revision: 219671 URL: http://svn.freebsd.org/changeset/base/219671 Log: Reserve 24KB for the static kernel stack. We use this stack to call into the firmware for physical mode calls and the Altix doesn't work when it's 16KB. Modified: projects/altix/sys/ia64/ia64/locore.S Modified: projects/altix/sys/ia64/ia64/locore.S ============================================================================== --- projects/altix/sys/ia64/ia64/locore.S Tue Mar 15 15:59:37 2011 (r219670) +++ projects/altix/sys/ia64/ia64/locore.S Tue Mar 15 16:50:17 2011 (r219671) @@ -34,7 +34,11 @@ #include #include -#define FW_STACK_SIZE 16384 +/* + * The Altix 350 needs more than the architected 16KB (8KB for stack and + * 8KB for RSE backing store) when calling EFI to setup virtual mode. + */ +#define FW_STACK_SIZE 3*PAGE_SIZE .section .data.kstack, "aw" .align PAGE_SIZE From owner-svn-src-projects@FreeBSD.ORG Tue Mar 15 23:28:16 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2CC871065673; Tue, 15 Mar 2011 23:28:16 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1787A8FC18; Tue, 15 Mar 2011 23:28:16 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2FNSG8a062605; Tue, 15 Mar 2011 23:28:16 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2FNSFn6062594; Tue, 15 Mar 2011 23:28:15 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103152328.p2FNSFn6062594@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 15 Mar 2011 23:28:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219681 - in projects/altix/sys: amd64/conf amd64/include amd64/linux32 arm/include boot/forth cddl/contrib/opensolaris/uts/common/fs/zfs cddl/dev/systrace compat/freebsd32 compat/linux... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2011 23:28:16 -0000 Author: marcel Date: Tue Mar 15 23:28:15 2011 New Revision: 219681 URL: http://svn.freebsd.org/changeset/base/219681 Log: Merge svn+ssh://svn.freebsd.org/base/head@219680 Added: projects/altix/sys/amd64/linux32/linux32_syscalls.c - copied unchanged from r219680, head/sys/amd64/linux32/linux32_syscalls.c projects/altix/sys/amd64/linux32/linux32_systrace_args.c - copied unchanged from r219680, head/sys/amd64/linux32/linux32_systrace_args.c projects/altix/sys/compat/freebsd32/freebsd32_systrace_args.c - copied unchanged from r219680, head/sys/compat/freebsd32/freebsd32_systrace_args.c projects/altix/sys/dev/bxe/ - copied from r219680, head/sys/dev/bxe/ projects/altix/sys/i386/linux/linux_syscalls.c - copied unchanged from r219680, head/sys/i386/linux/linux_syscalls.c projects/altix/sys/i386/linux/linux_systrace_args.c - copied unchanged from r219680, head/sys/i386/linux/linux_systrace_args.c projects/altix/sys/modules/bxe/ - copied from r219680, head/sys/modules/bxe/ projects/altix/sys/modules/dtrace/systrace_freebsd32/ - copied from r219680, head/sys/modules/dtrace/systrace_freebsd32/ projects/altix/sys/modules/dtrace/systrace_linux32/ - copied from r219680, head/sys/modules/dtrace/systrace_linux32/ Modified: projects/altix/sys/amd64/conf/GENERIC projects/altix/sys/amd64/include/cpu.h projects/altix/sys/amd64/linux32/Makefile projects/altix/sys/amd64/linux32/linux.h projects/altix/sys/amd64/linux32/linux32_proto.h projects/altix/sys/amd64/linux32/linux32_syscall.h projects/altix/sys/amd64/linux32/linux32_sysent.c projects/altix/sys/amd64/linux32/linux32_sysvec.c projects/altix/sys/amd64/linux32/syscalls.conf projects/altix/sys/amd64/linux32/syscalls.master projects/altix/sys/arm/include/cpu.h projects/altix/sys/boot/forth/loader.conf projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c projects/altix/sys/cddl/dev/systrace/systrace.c projects/altix/sys/compat/freebsd32/Makefile projects/altix/sys/compat/freebsd32/syscalls.conf projects/altix/sys/compat/linux/linux_ipc.c projects/altix/sys/compat/linux/linux_mib.c projects/altix/sys/compat/linux/linux_mib.h projects/altix/sys/conf/NOTES projects/altix/sys/conf/files projects/altix/sys/conf/options projects/altix/sys/contrib/altq/altq/altq_subr.c projects/altix/sys/dev/aic7xxx/aic79xx.c projects/altix/sys/dev/aic7xxx/aic7xxx.c projects/altix/sys/dev/ath/ath_hal/ah.c projects/altix/sys/dev/ath/ath_hal/ah_internal.h projects/altix/sys/dev/ath/ath_hal/ar5416/ar2133.c projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416.h projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c projects/altix/sys/dev/ath/ath_hal/ar9002/ar9280.c projects/altix/sys/dev/ath/ath_hal/ar9002/ar9280_olc.c projects/altix/sys/dev/ath/ath_hal/ar9002/ar9285.c projects/altix/sys/dev/ath/ath_hal/ar9002/ar9285_reset.c projects/altix/sys/dev/ath/if_ath_tx_ht.c projects/altix/sys/i386/conf/GENERIC projects/altix/sys/i386/i386/machdep.c projects/altix/sys/i386/include/cpu.h projects/altix/sys/i386/linux/Makefile projects/altix/sys/i386/linux/linux.h projects/altix/sys/i386/linux/linux_proto.h projects/altix/sys/i386/linux/linux_syscall.h projects/altix/sys/i386/linux/linux_sysent.c projects/altix/sys/i386/linux/linux_sysvec.c projects/altix/sys/i386/linux/syscalls.conf projects/altix/sys/i386/linux/syscalls.master projects/altix/sys/kern/makesyscalls.sh projects/altix/sys/mips/atheros/ar724x_chip.c projects/altix/sys/mips/atheros/ar724xreg.h projects/altix/sys/mips/atheros/ar91xx_chip.c projects/altix/sys/mips/atheros/if_arge.c projects/altix/sys/mips/atheros/if_argevar.h projects/altix/sys/modules/dtrace/Makefile projects/altix/sys/modules/dtrace/dtraceall/Makefile projects/altix/sys/modules/dtrace/dtraceall/dtraceall.c projects/altix/sys/net80211/_ieee80211.h projects/altix/sys/net80211/ieee80211.c projects/altix/sys/net80211/ieee80211_ht.c projects/altix/sys/net80211/ieee80211_node.c projects/altix/sys/net80211/ieee80211_output.c projects/altix/sys/net80211/ieee80211_scan_sta.c projects/altix/sys/net80211/ieee80211_sta.c projects/altix/sys/net80211/ieee80211_var.h projects/altix/sys/netinet/in_pcb.c projects/altix/sys/netinet/in_pcb.h projects/altix/sys/netinet6/in6_pcb.c projects/altix/sys/netinet6/in6_src.c projects/altix/sys/netinet6/nd6_nbr.c projects/altix/sys/netinet6/udp6_usrreq.c projects/altix/sys/pc98/pc98/machdep.c projects/altix/sys/powerpc/powermac/smu.c projects/altix/sys/sparc64/ebus/ebus.c projects/altix/sys/sparc64/ebus/ebusreg.h projects/altix/sys/sparc64/include/_inttypes.h projects/altix/sys/sparc64/include/_stdint.h projects/altix/sys/sparc64/include/bus.h projects/altix/sys/sparc64/include/bus_dma.h projects/altix/sys/sparc64/include/iommuvar.h projects/altix/sys/sparc64/include/ofw_nexus.h projects/altix/sys/sparc64/include/varargs.h projects/altix/sys/sparc64/include/vmparam.h projects/altix/sys/sparc64/isa/ofw_isa.c projects/altix/sys/sparc64/isa/ofw_isa.h projects/altix/sys/sparc64/pci/ofw_pci.h projects/altix/sys/sparc64/pci/psychoreg.h projects/altix/sys/sparc64/pci/psychovar.h projects/altix/sys/sparc64/sbus/dma_sbus.c projects/altix/sys/sparc64/sbus/lsi64854.c projects/altix/sys/sparc64/sbus/lsi64854reg.h projects/altix/sys/sparc64/sbus/lsi64854var.h projects/altix/sys/sparc64/sbus/ofw_sbus.h projects/altix/sys/sparc64/sbus/sbus.c projects/altix/sys/sparc64/sbus/sbusvar.h projects/altix/sys/sparc64/sparc64/bus_machdep.c projects/altix/sys/sparc64/sparc64/iommu.c projects/altix/sys/sparc64/sparc64/pmap.c projects/altix/sys/sparc64/sparc64/trap.c projects/altix/sys/sparc64/sparc64/vm_machdep.c projects/altix/sys/sun4v/include/_inttypes.h projects/altix/sys/sun4v/include/_stdint.h projects/altix/sys/sun4v/include/bus.h projects/altix/sys/sun4v/include/bus_dma.h projects/altix/sys/sun4v/include/ofw_nexus.h projects/altix/sys/sun4v/include/varargs.h projects/altix/sys/sun4v/include/vmparam.h projects/altix/sys/sun4v/sun4v/bus_machdep.c projects/altix/sys/sun4v/sun4v/hviommu.c projects/altix/sys/sun4v/sun4v/trap.c projects/altix/sys/sun4v/sun4v/vm_machdep.c projects/altix/sys/x86/isa/clock.c projects/altix/sys/x86/x86/tsc.c Directory Properties: projects/altix/lib/libstand/ (props changed) projects/altix/sys/ (props changed) projects/altix/sys/amd64/include/xen/ (props changed) projects/altix/sys/boot/i386/efi/ (props changed) projects/altix/sys/boot/ia64/efi/ (props changed) projects/altix/sys/boot/ia64/ski/ (props changed) projects/altix/sys/boot/powerpc/boot1.chrp/ (props changed) projects/altix/sys/boot/powerpc/ofw/ (props changed) projects/altix/sys/cddl/contrib/opensolaris/ (props changed) projects/altix/sys/conf/ (props changed) projects/altix/sys/contrib/dev/acpica/ (props changed) projects/altix/sys/contrib/octeon-sdk/ (props changed) projects/altix/sys/contrib/pf/ (props changed) projects/altix/sys/contrib/x86emu/ (props changed) projects/altix/sys/kern/subr_busdma.c (props changed) Modified: projects/altix/sys/amd64/conf/GENERIC ============================================================================== --- projects/altix/sys/amd64/conf/GENERIC Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/conf/GENERIC Tue Mar 15 23:28:15 2011 (r219681) @@ -193,6 +193,7 @@ device ppi # Parallel port interface d #device puc # PCI Ethernet NICs. +device bxe # Broadcom BCM57710/BCM57711/BCM57711E 10Gb Ethernet device de # DEC/Intel DC21x4x (``Tulip'') device em # Intel PRO/1000 Gigabit Ethernet Family device igb # Intel PRO/1000 PCIE Server Gigabit Family Modified: projects/altix/sys/amd64/include/cpu.h ============================================================================== --- projects/altix/sys/amd64/include/cpu.h Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/include/cpu.h Tue Mar 15 23:28:15 2011 (r219681) @@ -56,7 +56,6 @@ #ifdef _KERNEL extern char btext[]; extern char etext[]; -extern int tsc_present; void cpu_halt(void); void cpu_reset(void); Modified: projects/altix/sys/amd64/linux32/Makefile ============================================================================== --- projects/altix/sys/amd64/linux32/Makefile Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/linux32/Makefile Tue Mar 15 23:28:15 2011 (r219681) @@ -5,11 +5,13 @@ all: @echo "make sysent only" -sysent: linux32_sysent.c linux32_syscall.h linux32_proto.h +sysent: linux32_sysent.c linux32_syscall.h linux32_proto.h linux32_syscalls.c linux32_systrace_args.c -linux32_sysent.c linux32_syscall.h linux32_proto.h: ../../kern/makesyscalls.sh \ +linux32_sysent.c linux32_syscall.h linux32_proto.h linux32_syscalls.c linux32_systrace_args.c: ../../kern/makesyscalls.sh \ syscalls.master syscalls.conf -mv -f linux32_sysent.c linux32_sysent.c.bak -mv -f linux32_syscall.h linux32_syscall.h.bak -mv -f linux32_proto.h linux32_proto.h.bak + -mv -f linux32_syscalls.c linux32_syscalls.c.bak + -mv -f linux32_systrace_args.c linux32_systrace_args.c.bak sh ../../kern/makesyscalls.sh syscalls.master syscalls.conf Modified: projects/altix/sys/amd64/linux32/linux.h ============================================================================== --- projects/altix/sys/amd64/linux32/linux.h Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/linux32/linux.h Tue Mar 15 23:28:15 2011 (r219681) @@ -47,7 +47,10 @@ extern u_char linux_debug_map[]; MALLOC_DECLARE(M_LINUX); #endif -#define LINUX32_USRSTACK ((1ul << 32) - PAGE_SIZE) +#define LINUX32_MAXUSER ((1ul << 32) - PAGE_SIZE) +#define LINUX32_SHAREDPAGE (LINUX32_MAXUSER - PAGE_SIZE) +#define LINUX32_USRSTACK LINUX32_SHAREDPAGE + /* XXX 16 = sizeof(linux32_ps_strings) */ #define LINUX32_PS_STRINGS (LINUX32_USRSTACK - 16) #define LINUX32_MAXDSIZ (512 * 1024 * 1024) /* 512MB */ Modified: projects/altix/sys/amd64/linux32/linux32_proto.h ============================================================================== --- projects/altix/sys/amd64/linux32/linux32_proto.h Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/linux32/linux32_proto.h Tue Mar 15 23:28:15 2011 (r219681) @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 218610 2011-02-12 15:33:25Z dchagin + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg */ #ifndef _LINUX_SYSPROTO_H_ Modified: projects/altix/sys/amd64/linux32/linux32_syscall.h ============================================================================== --- projects/altix/sys/amd64/linux32/linux32_syscall.h Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/linux32/linux32_syscall.h Tue Mar 15 23:28:15 2011 (r219681) @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 218610 2011-02-12 15:33:25Z dchagin + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg */ #define LINUX_SYS_exit 1 Copied: projects/altix/sys/amd64/linux32/linux32_syscalls.c (from r219680, head/sys/amd64/linux32/linux32_syscalls.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/altix/sys/amd64/linux32/linux32_syscalls.c Tue Mar 15 23:28:15 2011 (r219681, copy of r219680, head/sys/amd64/linux32/linux32_syscalls.c) @@ -0,0 +1,328 @@ +/* + * System call names. + * + * DO NOT EDIT-- this file is automatically generated. + * $FreeBSD$ + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg + */ + +const char *linux_syscallnames[] = { +#define nosys linux_nosys + "#0", /* 0 = setup */ + "exit", /* 1 = exit */ + "linux_fork", /* 2 = linux_fork */ + "read", /* 3 = read */ + "write", /* 4 = write */ + "linux_open", /* 5 = linux_open */ + "close", /* 6 = close */ + "linux_waitpid", /* 7 = linux_waitpid */ + "linux_creat", /* 8 = linux_creat */ + "linux_link", /* 9 = linux_link */ + "linux_unlink", /* 10 = linux_unlink */ + "linux_execve", /* 11 = linux_execve */ + "linux_chdir", /* 12 = linux_chdir */ + "linux_time", /* 13 = linux_time */ + "linux_mknod", /* 14 = linux_mknod */ + "linux_chmod", /* 15 = linux_chmod */ + "linux_lchown16", /* 16 = linux_lchown16 */ + "#17", /* 17 = break */ + "linux_stat", /* 18 = linux_stat */ + "linux_lseek", /* 19 = linux_lseek */ + "linux_getpid", /* 20 = linux_getpid */ + "linux_mount", /* 21 = linux_mount */ + "linux_oldumount", /* 22 = linux_oldumount */ + "linux_setuid16", /* 23 = linux_setuid16 */ + "linux_getuid16", /* 24 = linux_getuid16 */ + "linux_stime", /* 25 = linux_stime */ + "linux_ptrace", /* 26 = linux_ptrace */ + "linux_alarm", /* 27 = linux_alarm */ + "#28", /* 28 = fstat */ + "linux_pause", /* 29 = linux_pause */ + "linux_utime", /* 30 = linux_utime */ + "#31", /* 31 = stty */ + "#32", /* 32 = gtty */ + "linux_access", /* 33 = linux_access */ + "linux_nice", /* 34 = linux_nice */ + "#35", /* 35 = ftime */ + "sync", /* 36 = sync */ + "linux_kill", /* 37 = linux_kill */ + "linux_rename", /* 38 = linux_rename */ + "linux_mkdir", /* 39 = linux_mkdir */ + "linux_rmdir", /* 40 = linux_rmdir */ + "dup", /* 41 = dup */ + "linux_pipe", /* 42 = linux_pipe */ + "linux_times", /* 43 = linux_times */ + "#44", /* 44 = prof */ + "linux_brk", /* 45 = linux_brk */ + "linux_setgid16", /* 46 = linux_setgid16 */ + "linux_getgid16", /* 47 = linux_getgid16 */ + "linux_signal", /* 48 = linux_signal */ + "linux_geteuid16", /* 49 = linux_geteuid16 */ + "linux_getegid16", /* 50 = linux_getegid16 */ + "acct", /* 51 = acct */ + "linux_umount", /* 52 = linux_umount */ + "#53", /* 53 = lock */ + "linux_ioctl", /* 54 = linux_ioctl */ + "linux_fcntl", /* 55 = linux_fcntl */ + "#56", /* 56 = mpx */ + "setpgid", /* 57 = setpgid */ + "#58", /* 58 = ulimit */ + "linux_olduname", /* 59 = linux_olduname */ + "umask", /* 60 = umask */ + "chroot", /* 61 = chroot */ + "linux_ustat", /* 62 = linux_ustat */ + "dup2", /* 63 = dup2 */ + "linux_getppid", /* 64 = linux_getppid */ + "getpgrp", /* 65 = getpgrp */ + "setsid", /* 66 = setsid */ + "linux_sigaction", /* 67 = linux_sigaction */ + "linux_sgetmask", /* 68 = linux_sgetmask */ + "linux_ssetmask", /* 69 = linux_ssetmask */ + "linux_setreuid16", /* 70 = linux_setreuid16 */ + "linux_setregid16", /* 71 = linux_setregid16 */ + "linux_sigsuspend", /* 72 = linux_sigsuspend */ + "linux_sigpending", /* 73 = linux_sigpending */ + "linux_sethostname", /* 74 = linux_sethostname */ + "linux_setrlimit", /* 75 = linux_setrlimit */ + "linux_old_getrlimit", /* 76 = linux_old_getrlimit */ + "linux_getrusage", /* 77 = linux_getrusage */ + "linux_gettimeofday", /* 78 = linux_gettimeofday */ + "linux_settimeofday", /* 79 = linux_settimeofday */ + "linux_getgroups16", /* 80 = linux_getgroups16 */ + "linux_setgroups16", /* 81 = linux_setgroups16 */ + "linux_old_select", /* 82 = linux_old_select */ + "linux_symlink", /* 83 = linux_symlink */ + "linux_lstat", /* 84 = linux_lstat */ + "linux_readlink", /* 85 = linux_readlink */ + "#86", /* 86 = linux_uselib */ + "swapon", /* 87 = swapon */ + "linux_reboot", /* 88 = linux_reboot */ + "linux_readdir", /* 89 = linux_readdir */ + "linux_mmap", /* 90 = linux_mmap */ + "munmap", /* 91 = munmap */ + "linux_truncate", /* 92 = linux_truncate */ + "linux_ftruncate", /* 93 = linux_ftruncate */ + "fchmod", /* 94 = fchmod */ + "fchown", /* 95 = fchown */ + "linux_getpriority", /* 96 = linux_getpriority */ + "setpriority", /* 97 = setpriority */ + "#98", /* 98 = profil */ + "linux_statfs", /* 99 = linux_statfs */ + "linux_fstatfs", /* 100 = linux_fstatfs */ + "#101", /* 101 = ioperm */ + "linux_socketcall", /* 102 = linux_socketcall */ + "linux_syslog", /* 103 = linux_syslog */ + "linux_setitimer", /* 104 = linux_setitimer */ + "linux_getitimer", /* 105 = linux_getitimer */ + "linux_newstat", /* 106 = linux_newstat */ + "linux_newlstat", /* 107 = linux_newlstat */ + "linux_newfstat", /* 108 = linux_newfstat */ + "linux_uname", /* 109 = linux_uname */ + "linux_iopl", /* 110 = linux_iopl */ + "linux_vhangup", /* 111 = linux_vhangup */ + "#112", /* 112 = idle */ + "#113", /* 113 = vm86old */ + "linux_wait4", /* 114 = linux_wait4 */ + "linux_swapoff", /* 115 = linux_swapoff */ + "linux_sysinfo", /* 116 = linux_sysinfo */ + "linux_ipc", /* 117 = linux_ipc */ + "fsync", /* 118 = fsync */ + "linux_sigreturn", /* 119 = linux_sigreturn */ + "linux_clone", /* 120 = linux_clone */ + "linux_setdomainname", /* 121 = linux_setdomainname */ + "linux_newuname", /* 122 = linux_newuname */ + "#123", /* 123 = modify_ldt */ + "linux_adjtimex", /* 124 = linux_adjtimex */ + "linux_mprotect", /* 125 = linux_mprotect */ + "linux_sigprocmask", /* 126 = linux_sigprocmask */ + "linux_create_module", /* 127 = linux_create_module */ + "linux_init_module", /* 128 = linux_init_module */ + "linux_delete_module", /* 129 = linux_delete_module */ + "linux_get_kernel_syms", /* 130 = linux_get_kernel_syms */ + "linux_quotactl", /* 131 = linux_quotactl */ + "getpgid", /* 132 = getpgid */ + "fchdir", /* 133 = fchdir */ + "linux_bdflush", /* 134 = linux_bdflush */ + "linux_sysfs", /* 135 = linux_sysfs */ + "linux_personality", /* 136 = linux_personality */ + "#137", /* 137 = afs_syscall */ + "linux_setfsuid16", /* 138 = linux_setfsuid16 */ + "linux_setfsgid16", /* 139 = linux_setfsgid16 */ + "linux_llseek", /* 140 = linux_llseek */ + "linux_getdents", /* 141 = linux_getdents */ + "linux_select", /* 142 = linux_select */ + "flock", /* 143 = flock */ + "linux_msync", /* 144 = linux_msync */ + "linux_readv", /* 145 = linux_readv */ + "linux_writev", /* 146 = linux_writev */ + "linux_getsid", /* 147 = linux_getsid */ + "linux_fdatasync", /* 148 = linux_fdatasync */ + "linux_sysctl", /* 149 = linux_sysctl */ + "mlock", /* 150 = mlock */ + "munlock", /* 151 = munlock */ + "mlockall", /* 152 = mlockall */ + "munlockall", /* 153 = munlockall */ + "sched_setparam", /* 154 = sched_setparam */ + "sched_getparam", /* 155 = sched_getparam */ + "linux_sched_setscheduler", /* 156 = linux_sched_setscheduler */ + "linux_sched_getscheduler", /* 157 = linux_sched_getscheduler */ + "sched_yield", /* 158 = sched_yield */ + "linux_sched_get_priority_max", /* 159 = linux_sched_get_priority_max */ + "linux_sched_get_priority_min", /* 160 = linux_sched_get_priority_min */ + "linux_sched_rr_get_interval", /* 161 = linux_sched_rr_get_interval */ + "linux_nanosleep", /* 162 = linux_nanosleep */ + "linux_mremap", /* 163 = linux_mremap */ + "linux_setresuid16", /* 164 = linux_setresuid16 */ + "linux_getresuid16", /* 165 = linux_getresuid16 */ + "#166", /* 166 = vm86 */ + "linux_query_module", /* 167 = linux_query_module */ + "poll", /* 168 = poll */ + "linux_nfsservctl", /* 169 = linux_nfsservctl */ + "linux_setresgid16", /* 170 = linux_setresgid16 */ + "linux_getresgid16", /* 171 = linux_getresgid16 */ + "linux_prctl", /* 172 = linux_prctl */ + "linux_rt_sigreturn", /* 173 = linux_rt_sigreturn */ + "linux_rt_sigaction", /* 174 = linux_rt_sigaction */ + "linux_rt_sigprocmask", /* 175 = linux_rt_sigprocmask */ + "linux_rt_sigpending", /* 176 = linux_rt_sigpending */ + "linux_rt_sigtimedwait", /* 177 = linux_rt_sigtimedwait */ + "linux_rt_sigqueueinfo", /* 178 = linux_rt_sigqueueinfo */ + "linux_rt_sigsuspend", /* 179 = linux_rt_sigsuspend */ + "linux_pread", /* 180 = linux_pread */ + "linux_pwrite", /* 181 = linux_pwrite */ + "linux_chown16", /* 182 = linux_chown16 */ + "linux_getcwd", /* 183 = linux_getcwd */ + "linux_capget", /* 184 = linux_capget */ + "linux_capset", /* 185 = linux_capset */ + "linux_sigaltstack", /* 186 = linux_sigaltstack */ + "linux_sendfile", /* 187 = linux_sendfile */ + "#188", /* 188 = getpmsg */ + "#189", /* 189 = putpmsg */ + "linux_vfork", /* 190 = linux_vfork */ + "linux_getrlimit", /* 191 = linux_getrlimit */ + "linux_mmap2", /* 192 = linux_mmap2 */ + "linux_truncate64", /* 193 = linux_truncate64 */ + "linux_ftruncate64", /* 194 = linux_ftruncate64 */ + "linux_stat64", /* 195 = linux_stat64 */ + "linux_lstat64", /* 196 = linux_lstat64 */ + "linux_fstat64", /* 197 = linux_fstat64 */ + "linux_lchown", /* 198 = linux_lchown */ + "linux_getuid", /* 199 = linux_getuid */ + "linux_getgid", /* 200 = linux_getgid */ + "geteuid", /* 201 = geteuid */ + "getegid", /* 202 = getegid */ + "setreuid", /* 203 = setreuid */ + "setregid", /* 204 = setregid */ + "linux_getgroups", /* 205 = linux_getgroups */ + "linux_setgroups", /* 206 = linux_setgroups */ + "fchown", /* 207 = fchown */ + "setresuid", /* 208 = setresuid */ + "getresuid", /* 209 = getresuid */ + "setresgid", /* 210 = setresgid */ + "getresgid", /* 211 = getresgid */ + "linux_chown", /* 212 = linux_chown */ + "setuid", /* 213 = setuid */ + "setgid", /* 214 = setgid */ + "linux_setfsuid", /* 215 = linux_setfsuid */ + "linux_setfsgid", /* 216 = linux_setfsgid */ + "linux_pivot_root", /* 217 = linux_pivot_root */ + "linux_mincore", /* 218 = linux_mincore */ + "madvise", /* 219 = madvise */ + "linux_getdents64", /* 220 = linux_getdents64 */ + "linux_fcntl64", /* 221 = linux_fcntl64 */ + "#222", /* 222 = */ + "#223", /* 223 = */ + "linux_gettid", /* 224 = linux_gettid */ + "#225", /* 225 = linux_readahead */ + "linux_setxattr", /* 226 = linux_setxattr */ + "linux_lsetxattr", /* 227 = linux_lsetxattr */ + "linux_fsetxattr", /* 228 = linux_fsetxattr */ + "linux_getxattr", /* 229 = linux_getxattr */ + "linux_lgetxattr", /* 230 = linux_lgetxattr */ + "linux_fgetxattr", /* 231 = linux_fgetxattr */ + "linux_listxattr", /* 232 = linux_listxattr */ + "linux_llistxattr", /* 233 = linux_llistxattr */ + "linux_flistxattr", /* 234 = linux_flistxattr */ + "linux_removexattr", /* 235 = linux_removexattr */ + "linux_lremovexattr", /* 236 = linux_lremovexattr */ + "linux_fremovexattr", /* 237 = linux_fremovexattr */ + "linux_tkill", /* 238 = linux_tkill */ + "#239", /* 239 = linux_sendfile64 */ + "linux_sys_futex", /* 240 = linux_sys_futex */ + "linux_sched_setaffinity", /* 241 = linux_sched_setaffinity */ + "linux_sched_getaffinity", /* 242 = linux_sched_getaffinity */ + "linux_set_thread_area", /* 243 = linux_set_thread_area */ + "#244", /* 244 = linux_get_thread_area */ + "#245", /* 245 = linux_io_setup */ + "#246", /* 246 = linux_io_destroy */ + "#247", /* 247 = linux_io_getevents */ + "#248", /* 248 = linux_io_submit */ + "#249", /* 249 = linux_io_cancel */ + "linux_fadvise64", /* 250 = linux_fadvise64 */ + "#251", /* 251 = */ + "linux_exit_group", /* 252 = linux_exit_group */ + "linux_lookup_dcookie", /* 253 = linux_lookup_dcookie */ + "linux_epoll_create", /* 254 = linux_epoll_create */ + "linux_epoll_ctl", /* 255 = linux_epoll_ctl */ + "linux_epoll_wait", /* 256 = linux_epoll_wait */ + "linux_remap_file_pages", /* 257 = linux_remap_file_pages */ + "linux_set_tid_address", /* 258 = linux_set_tid_address */ + "linux_timer_create", /* 259 = linux_timer_create */ + "linux_timer_settime", /* 260 = linux_timer_settime */ + "linux_timer_gettime", /* 261 = linux_timer_gettime */ + "linux_timer_getoverrun", /* 262 = linux_timer_getoverrun */ + "linux_timer_delete", /* 263 = linux_timer_delete */ + "linux_clock_settime", /* 264 = linux_clock_settime */ + "linux_clock_gettime", /* 265 = linux_clock_gettime */ + "linux_clock_getres", /* 266 = linux_clock_getres */ + "linux_clock_nanosleep", /* 267 = linux_clock_nanosleep */ + "linux_statfs64", /* 268 = linux_statfs64 */ + "linux_fstatfs64", /* 269 = linux_fstatfs64 */ + "linux_tgkill", /* 270 = linux_tgkill */ + "linux_utimes", /* 271 = linux_utimes */ + "linux_fadvise64_64", /* 272 = linux_fadvise64_64 */ + "#273", /* 273 = */ + "linux_mbind", /* 274 = linux_mbind */ + "linux_get_mempolicy", /* 275 = linux_get_mempolicy */ + "linux_set_mempolicy", /* 276 = linux_set_mempolicy */ + "linux_mq_open", /* 277 = linux_mq_open */ + "linux_mq_unlink", /* 278 = linux_mq_unlink */ + "linux_mq_timedsend", /* 279 = linux_mq_timedsend */ + "linux_mq_timedreceive", /* 280 = linux_mq_timedreceive */ + "linux_mq_notify", /* 281 = linux_mq_notify */ + "linux_mq_getsetattr", /* 282 = linux_mq_getsetattr */ + "linux_kexec_load", /* 283 = linux_kexec_load */ + "linux_waitid", /* 284 = linux_waitid */ + "#285", /* 285 = */ + "linux_add_key", /* 286 = linux_add_key */ + "linux_request_key", /* 287 = linux_request_key */ + "linux_keyctl", /* 288 = linux_keyctl */ + "linux_ioprio_set", /* 289 = linux_ioprio_set */ + "linux_ioprio_get", /* 290 = linux_ioprio_get */ + "linux_inotify_init", /* 291 = linux_inotify_init */ + "linux_inotify_add_watch", /* 292 = linux_inotify_add_watch */ + "linux_inotify_rm_watch", /* 293 = linux_inotify_rm_watch */ + "linux_migrate_pages", /* 294 = linux_migrate_pages */ + "linux_openat", /* 295 = linux_openat */ + "linux_mkdirat", /* 296 = linux_mkdirat */ + "linux_mknodat", /* 297 = linux_mknodat */ + "linux_fchownat", /* 298 = linux_fchownat */ + "linux_futimesat", /* 299 = linux_futimesat */ + "linux_fstatat64", /* 300 = linux_fstatat64 */ + "linux_unlinkat", /* 301 = linux_unlinkat */ + "linux_renameat", /* 302 = linux_renameat */ + "linux_linkat", /* 303 = linux_linkat */ + "linux_symlinkat", /* 304 = linux_symlinkat */ + "linux_readlinkat", /* 305 = linux_readlinkat */ + "linux_fchmodat", /* 306 = linux_fchmodat */ + "linux_faccessat", /* 307 = linux_faccessat */ + "linux_pselect6", /* 308 = linux_pselect6 */ + "linux_ppoll", /* 309 = linux_ppoll */ + "linux_unshare", /* 310 = linux_unshare */ + "linux_set_robust_list", /* 311 = linux_set_robust_list */ + "linux_get_robust_list", /* 312 = linux_get_robust_list */ + "linux_splice", /* 313 = linux_splice */ + "linux_sync_file_range", /* 314 = linux_sync_file_range */ + "linux_tee", /* 315 = linux_tee */ + "linux_vmsplice", /* 316 = linux_vmsplice */ +}; Modified: projects/altix/sys/amd64/linux32/linux32_sysent.c ============================================================================== --- projects/altix/sys/amd64/linux32/linux32_sysent.c Tue Mar 15 22:22:11 2011 (r219680) +++ projects/altix/sys/amd64/linux32/linux32_sysent.c Tue Mar 15 23:28:15 2011 (r219681) @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 218610 2011-02-12 15:33:25Z dchagin + * created from FreeBSD: head/sys/amd64/linux32/syscalls.master 219559 2011-03-12 08:51:43Z avg */ #include "opt_compat.h" Copied: projects/altix/sys/amd64/linux32/linux32_systrace_args.c (from r219680, head/sys/amd64/linux32/linux32_systrace_args.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/altix/sys/amd64/linux32/linux32_systrace_args.c Tue Mar 15 23:28:15 2011 (r219681, copy of r219680, head/sys/amd64/linux32/linux32_systrace_args.c) @@ -0,0 +1,5100 @@ +/* + * System call argument to DTrace register array converstion. + * + * DO NOT EDIT-- this file is automatically generated. + * $FreeBSD$ + * This file is part of the DTrace syscall provider. + */ + +static void +systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) +{ + int64_t *iarg = (int64_t *) uarg; + switch (sysnum) { +#define nosys linux_nosys + /* sys_exit */ + case 1: { + struct sys_exit_args *p = params; + iarg[0] = p->rval; /* int */ + *n_args = 1; + break; + } + /* linux_fork */ + case 2: { + *n_args = 0; + break; + } + /* read */ + case 3: { + struct read_args *p = params; + iarg[0] = p->fd; /* int */ + uarg[1] = (intptr_t) p->buf; /* char * */ + uarg[2] = p->nbyte; /* u_int */ + *n_args = 3; + break; + } + /* write */ + case 4: { + struct write_args *p = params; + iarg[0] = p->fd; /* int */ + uarg[1] = (intptr_t) p->buf; /* char * */ + uarg[2] = p->nbyte; /* u_int */ + *n_args = 3; + break; + } + /* linux_open */ + case 5: { + struct linux_open_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->flags; /* l_int */ + iarg[2] = p->mode; /* l_int */ + *n_args = 3; + break; + } + /* close */ + case 6: { + struct close_args *p = params; + iarg[0] = p->fd; /* int */ + *n_args = 1; + break; + } + /* linux_waitpid */ + case 7: { + struct linux_waitpid_args *p = params; + iarg[0] = p->pid; /* l_pid_t */ + uarg[1] = (intptr_t) p->status; /* l_int * */ + iarg[2] = p->options; /* l_int */ + *n_args = 3; + break; + } + /* linux_creat */ + case 8: { + struct linux_creat_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->mode; /* l_int */ + *n_args = 2; + break; + } + /* linux_link */ + case 9: { + struct linux_link_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + uarg[1] = (intptr_t) p->to; /* char * */ + *n_args = 2; + break; + } + /* linux_unlink */ + case 10: { + struct linux_unlink_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* linux_execve */ + case 11: { + struct linux_execve_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + uarg[1] = (intptr_t) p->argp; /* u_int32_t * */ + uarg[2] = (intptr_t) p->envp; /* u_int32_t * */ + *n_args = 3; + break; + } + /* linux_chdir */ + case 12: { + struct linux_chdir_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* linux_time */ + case 13: { + struct linux_time_args *p = params; + uarg[0] = (intptr_t) p->tm; /* l_time_t * */ + *n_args = 1; + break; + } + /* linux_mknod */ + case 14: { + struct linux_mknod_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->mode; /* l_int */ + iarg[2] = p->dev; /* l_dev_t */ + *n_args = 3; + break; + } + /* linux_chmod */ + case 15: { + struct linux_chmod_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->mode; /* l_mode_t */ + *n_args = 2; + break; + } + /* linux_lchown16 */ + case 16: { + struct linux_lchown16_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->uid; /* l_uid16_t */ + iarg[2] = p->gid; /* l_gid16_t */ + *n_args = 3; + break; + } + /* linux_stat */ + case 18: { + struct linux_stat_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + uarg[1] = (intptr_t) p->up; /* struct linux_stat * */ + *n_args = 2; + break; + } + /* linux_lseek */ + case 19: { + struct linux_lseek_args *p = params; + iarg[0] = p->fdes; /* l_uint */ + iarg[1] = p->off; /* l_off_t */ + iarg[2] = p->whence; /* l_int */ + *n_args = 3; + break; + } + /* linux_getpid */ + case 20: { + *n_args = 0; + break; + } + /* linux_mount */ + case 21: { + struct linux_mount_args *p = params; + uarg[0] = (intptr_t) p->specialfile; /* char * */ + uarg[1] = (intptr_t) p->dir; /* char * */ + uarg[2] = (intptr_t) p->filesystemtype; /* char * */ + iarg[3] = p->rwflag; /* l_ulong */ + uarg[4] = (intptr_t) p->data; /* void * */ + *n_args = 5; + break; + } + /* linux_oldumount */ + case 22: { + struct linux_oldumount_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* linux_setuid16 */ + case 23: { + struct linux_setuid16_args *p = params; + iarg[0] = p->uid; /* l_uid16_t */ + *n_args = 1; + break; + } + /* linux_getuid16 */ + case 24: { + *n_args = 0; + break; + } + /* linux_stime */ + case 25: { + *n_args = 0; + break; + } + /* linux_ptrace */ + case 26: { + struct linux_ptrace_args *p = params; + iarg[0] = p->req; /* l_long */ + iarg[1] = p->pid; /* l_long */ + iarg[2] = p->addr; /* l_long */ + iarg[3] = p->data; /* l_long */ + *n_args = 4; + break; + } + /* linux_alarm */ + case 27: { + struct linux_alarm_args *p = params; + iarg[0] = p->secs; /* l_uint */ + *n_args = 1; + break; + } + /* linux_pause */ + case 29: { + *n_args = 0; + break; + } + /* linux_utime */ + case 30: { + struct linux_utime_args *p = params; + uarg[0] = (intptr_t) p->fname; /* char * */ + uarg[1] = (intptr_t) p->times; /* struct l_utimbuf * */ + *n_args = 2; + break; + } + /* linux_access */ + case 33: { + struct linux_access_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->flags; /* l_int */ + *n_args = 2; + break; + } + /* linux_nice */ + case 34: { + struct linux_nice_args *p = params; + iarg[0] = p->inc; /* l_int */ + *n_args = 1; + break; + } + /* sync */ + case 36: { + *n_args = 0; + break; + } + /* linux_kill */ + case 37: { + struct linux_kill_args *p = params; + iarg[0] = p->pid; /* l_int */ + iarg[1] = p->signum; /* l_int */ + *n_args = 2; + break; + } + /* linux_rename */ + case 38: { + struct linux_rename_args *p = params; + uarg[0] = (intptr_t) p->from; /* char * */ + uarg[1] = (intptr_t) p->to; /* char * */ + *n_args = 2; + break; + } + /* linux_mkdir */ + case 39: { + struct linux_mkdir_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->mode; /* l_int */ + *n_args = 2; + break; + } + /* linux_rmdir */ + case 40: { + struct linux_rmdir_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* dup */ + case 41: { + struct dup_args *p = params; + uarg[0] = p->fd; /* u_int */ + *n_args = 1; + break; + } + /* linux_pipe */ + case 42: { + struct linux_pipe_args *p = params; + uarg[0] = (intptr_t) p->pipefds; /* l_ulong * */ + *n_args = 1; + break; + } + /* linux_times */ + case 43: { + struct linux_times_args *p = params; + uarg[0] = (intptr_t) p->buf; /* struct l_times_argv * */ + *n_args = 1; + break; + } + /* linux_brk */ + case 45: { + struct linux_brk_args *p = params; + iarg[0] = p->dsend; /* l_ulong */ + *n_args = 1; + break; + } + /* linux_setgid16 */ + case 46: { + struct linux_setgid16_args *p = params; + iarg[0] = p->gid; /* l_gid16_t */ + *n_args = 1; + break; + } + /* linux_getgid16 */ + case 47: { + *n_args = 0; + break; + } + /* linux_signal */ + case 48: { + struct linux_signal_args *p = params; + iarg[0] = p->sig; /* l_int */ + iarg[1] = p->handler; /* l_handler_t */ + *n_args = 2; + break; + } + /* linux_geteuid16 */ + case 49: { + *n_args = 0; + break; + } + /* linux_getegid16 */ + case 50: { + *n_args = 0; + break; + } + /* acct */ + case 51: { + struct acct_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* linux_umount */ + case 52: { + struct linux_umount_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->flags; /* l_int */ + *n_args = 2; + break; + } + /* linux_ioctl */ + case 54: { + struct linux_ioctl_args *p = params; + iarg[0] = p->fd; /* l_uint */ + iarg[1] = p->cmd; /* l_uint */ + uarg[2] = p->arg; /* uintptr_t */ + *n_args = 3; + break; + } + /* linux_fcntl */ + case 55: { + struct linux_fcntl_args *p = params; + iarg[0] = p->fd; /* l_uint */ + iarg[1] = p->cmd; /* l_uint */ + uarg[2] = p->arg; /* uintptr_t */ + *n_args = 3; + break; + } + /* setpgid */ + case 57: { + struct setpgid_args *p = params; + iarg[0] = p->pid; /* int */ + iarg[1] = p->pgid; /* int */ + *n_args = 2; + break; + } + /* linux_olduname */ + case 59: { + *n_args = 0; + break; + } + /* umask */ + case 60: { + struct umask_args *p = params; + iarg[0] = p->newmask; /* int */ + *n_args = 1; + break; + } + /* chroot */ + case 61: { + struct chroot_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + *n_args = 1; + break; + } + /* linux_ustat */ + case 62: { + struct linux_ustat_args *p = params; + iarg[0] = p->dev; /* l_dev_t */ + uarg[1] = (intptr_t) p->ubuf; /* struct l_ustat * */ + *n_args = 2; + break; + } + /* dup2 */ + case 63: { + struct dup2_args *p = params; + uarg[0] = p->from; /* u_int */ + uarg[1] = p->to; /* u_int */ + *n_args = 2; + break; + } + /* linux_getppid */ + case 64: { + *n_args = 0; + break; + } + /* getpgrp */ + case 65: { + *n_args = 0; + break; + } + /* setsid */ + case 66: { + *n_args = 0; + break; + } + /* linux_sigaction */ + case 67: { + struct linux_sigaction_args *p = params; + iarg[0] = p->sig; /* l_int */ + uarg[1] = (intptr_t) p->nsa; /* l_osigaction_t * */ + uarg[2] = (intptr_t) p->osa; /* l_osigaction_t * */ + *n_args = 3; + break; + } + /* linux_sgetmask */ + case 68: { + *n_args = 0; + break; + } + /* linux_ssetmask */ + case 69: { + struct linux_ssetmask_args *p = params; + iarg[0] = p->mask; /* l_osigset_t */ + *n_args = 1; + break; + } + /* linux_setreuid16 */ + case 70: { + struct linux_setreuid16_args *p = params; + iarg[0] = p->ruid; /* l_uid16_t */ + iarg[1] = p->euid; /* l_uid16_t */ + *n_args = 2; + break; + } + /* linux_setregid16 */ + case 71: { + struct linux_setregid16_args *p = params; + iarg[0] = p->rgid; /* l_gid16_t */ + iarg[1] = p->egid; /* l_gid16_t */ + *n_args = 2; + break; + } + /* linux_sigsuspend */ + case 72: { + struct linux_sigsuspend_args *p = params; + iarg[0] = p->hist0; /* l_int */ + iarg[1] = p->hist1; /* l_int */ + iarg[2] = p->mask; /* l_osigset_t */ + *n_args = 3; + break; + } + /* linux_sigpending */ + case 73: { + struct linux_sigpending_args *p = params; + uarg[0] = (intptr_t) p->mask; /* l_osigset_t * */ + *n_args = 1; + break; + } + /* linux_sethostname */ + case 74: { + struct linux_sethostname_args *p = params; + uarg[0] = (intptr_t) p->hostname; /* char * */ + uarg[1] = p->len; /* u_int */ + *n_args = 2; + break; + } + /* linux_setrlimit */ + case 75: { + struct linux_setrlimit_args *p = params; + iarg[0] = p->resource; /* l_uint */ + uarg[1] = (intptr_t) p->rlim; /* struct l_rlimit * */ + *n_args = 2; + break; + } + /* linux_old_getrlimit */ + case 76: { + struct linux_old_getrlimit_args *p = params; + iarg[0] = p->resource; /* l_uint */ + uarg[1] = (intptr_t) p->rlim; /* struct l_rlimit * */ + *n_args = 2; + break; + } + /* linux_getrusage */ + case 77: { + struct linux_getrusage_args *p = params; + iarg[0] = p->who; /* int */ + uarg[1] = (intptr_t) p->rusage; /* struct l_rusage * */ + *n_args = 2; + break; + } + /* linux_gettimeofday */ + case 78: { + struct linux_gettimeofday_args *p = params; + uarg[0] = (intptr_t) p->tp; /* struct l_timeval * */ + uarg[1] = (intptr_t) p->tzp; /* struct timezone * */ + *n_args = 2; + break; + } + /* linux_settimeofday */ + case 79: { + struct linux_settimeofday_args *p = params; + uarg[0] = (intptr_t) p->tp; /* struct l_timeval * */ + uarg[1] = (intptr_t) p->tzp; /* struct timezone * */ + *n_args = 2; + break; + } + /* linux_getgroups16 */ + case 80: { + struct linux_getgroups16_args *p = params; + iarg[0] = p->gidsetsize; /* l_uint */ + uarg[1] = (intptr_t) p->gidset; /* l_gid16_t * */ + *n_args = 2; + break; + } + /* linux_setgroups16 */ + case 81: { + struct linux_setgroups16_args *p = params; + iarg[0] = p->gidsetsize; /* l_uint */ + uarg[1] = (intptr_t) p->gidset; /* l_gid16_t * */ + *n_args = 2; + break; + } + /* linux_old_select */ + case 82: { + struct linux_old_select_args *p = params; + uarg[0] = (intptr_t) p->ptr; /* struct l_old_select_argv * */ + *n_args = 1; + break; + } + /* linux_symlink */ + case 83: { + struct linux_symlink_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + uarg[1] = (intptr_t) p->to; /* char * */ + *n_args = 2; + break; + } + /* linux_lstat */ + case 84: { + struct linux_lstat_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + uarg[1] = (intptr_t) p->up; /* struct linux_lstat * */ + *n_args = 2; + break; + } + /* linux_readlink */ + case 85: { + struct linux_readlink_args *p = params; + uarg[0] = (intptr_t) p->name; /* char * */ + uarg[1] = (intptr_t) p->buf; /* char * */ + iarg[2] = p->count; /* l_int */ + *n_args = 3; + break; + } + /* swapon */ + case 87: { + struct swapon_args *p = params; + uarg[0] = (intptr_t) p->name; /* char * */ *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Wed Mar 16 04:03:13 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B2490106564A; Wed, 16 Mar 2011 04:03:13 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 878F08FC0A; Wed, 16 Mar 2011 04:03:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2G43DQM068944; Wed, 16 Mar 2011 04:03:13 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2G43Dnt068941; Wed, 16 Mar 2011 04:03:13 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103160403.p2G43Dnt068941@svn.freebsd.org> From: Marcel Moolenaar Date: Wed, 16 Mar 2011 04:03:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219692 - in projects/altix/sys: arm/mv boot/efi/libefi kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Mar 2011 04:03:13 -0000 Author: marcel Date: Wed Mar 16 04:03:13 2011 New Revision: 219692 URL: http://svn.freebsd.org/changeset/base/219692 Log: Merge svn+ssh://svn.freebsd.org/base/head@219691 Modified: projects/altix/sys/arm/mv/gpio.c projects/altix/sys/boot/efi/libefi/efipart.c Directory Properties: projects/altix/lib/libstand/ (props changed) projects/altix/sys/ (props changed) projects/altix/sys/amd64/include/xen/ (props changed) projects/altix/sys/boot/i386/efi/ (props changed) projects/altix/sys/boot/ia64/efi/ (props changed) projects/altix/sys/boot/ia64/ski/ (props changed) projects/altix/sys/boot/powerpc/boot1.chrp/ (props changed) projects/altix/sys/boot/powerpc/ofw/ (props changed) projects/altix/sys/cddl/contrib/opensolaris/ (props changed) projects/altix/sys/conf/ (props changed) projects/altix/sys/contrib/dev/acpica/ (props changed) projects/altix/sys/contrib/octeon-sdk/ (props changed) projects/altix/sys/contrib/pf/ (props changed) projects/altix/sys/contrib/x86emu/ (props changed) projects/altix/sys/kern/subr_busdma.c (props changed) Modified: projects/altix/sys/arm/mv/gpio.c ============================================================================== --- projects/altix/sys/arm/mv/gpio.c Wed Mar 16 03:53:18 2011 (r219691) +++ projects/altix/sys/arm/mv/gpio.c Wed Mar 16 04:03:13 2011 (r219692) @@ -344,7 +344,7 @@ uint8_t mv_gpio_in(uint32_t pin) { - return (mv_gpio_value_get(pin)); + return (mv_gpio_value_get(pin) ? 1 : 0); } static uint32_t Modified: projects/altix/sys/boot/efi/libefi/efipart.c ============================================================================== --- projects/altix/sys/boot/efi/libefi/efipart.c Wed Mar 16 03:53:18 2011 (r219691) +++ projects/altix/sys/boot/efi/libefi/efipart.c Wed Mar 16 04:03:13 2011 (r219692) @@ -204,7 +204,7 @@ efipart_readwrite(EFI_BLOCK_IO *blkio, i } if (EFI_ERROR(status)) - printf("%s: rw=%d, status=%u\n", __func__, rw, status); + printf("%s: rw=%d, status=%lu\n", __func__, rw, (u_long)status); return (efi_status_to_errno(status)); } From owner-svn-src-projects@FreeBSD.ORG Thu Mar 17 15:11:07 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B401106566B; Thu, 17 Mar 2011 15:11:07 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 209028FC0A; Thu, 17 Mar 2011 15:11:07 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2HFB7Vq031272; Thu, 17 Mar 2011 15:11:07 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2HFB7IX031271; Thu, 17 Mar 2011 15:11:07 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103171511.p2HFB7IX031271@svn.freebsd.org> From: Marcel Moolenaar Date: Thu, 17 Mar 2011 15:11:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219714 - projects/altix/sys/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Mar 2011 15:11:07 -0000 Author: marcel Date: Thu Mar 17 15:11:06 2011 New Revision: 219714 URL: http://svn.freebsd.org/changeset/base/219714 Log: Remove merge left-overs. Deleted: projects/altix/sys/conf/ldscript.mips.64 projects/altix/sys/conf/ldscript.mips.64.cfe projects/altix/sys/conf/ldscript.mips.n32 From owner-svn-src-projects@FreeBSD.ORG Thu Mar 17 16:16:09 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 85DCF1065675; Thu, 17 Mar 2011 16:16:09 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 77DF68FC25; Thu, 17 Mar 2011 16:16:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2HGG9jP032598; Thu, 17 Mar 2011 16:16:09 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2HGG9L1032596; Thu, 17 Mar 2011 16:16:09 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103171616.p2HGG9L1032596@svn.freebsd.org> From: Marcel Moolenaar Date: Thu, 17 Mar 2011 16:16:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219715 - projects/altix/sys/kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Mar 2011 16:16:09 -0000 Author: marcel Date: Thu Mar 17 16:16:09 2011 New Revision: 219715 URL: http://svn.freebsd.org/changeset/base/219715 Log: SYSCTL_ADD_ULONG() doesn't have a default value like SYSCTL_ADD_UINT() Modified: projects/altix/sys/kern/subr_busdma.c Modified: projects/altix/sys/kern/subr_busdma.c ============================================================================== --- projects/altix/sys/kern/subr_busdma.c Thu Mar 17 15:11:06 2011 (r219714) +++ projects/altix/sys/kern/subr_busdma.c Thu Mar 17 16:16:09 2011 (r219715) @@ -1073,7 +1073,7 @@ alloc_bounce_zone(bus_dma_tag_t dmat) "lowaddr", CTLFLAG_RD, bz->lowaddrid, 0, ""); SYSCTL_ADD_ULONG(busdma_sysctl_tree(bz), SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, - "alignment", CTLFLAG_RD, &bz->alignment, 0, ""); + "alignment", CTLFLAG_RD, &bz->alignment, ""); return (0); } From owner-svn-src-projects@FreeBSD.ORG Thu Mar 17 16:35:37 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9A79F1065672; Thu, 17 Mar 2011 16:35:37 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8CBB98FC17; Thu, 17 Mar 2011 16:35:37 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2HGZbZB033006; Thu, 17 Mar 2011 16:35:37 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2HGZb64033004; Thu, 17 Mar 2011 16:35:37 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103171635.p2HGZb64033004@svn.freebsd.org> From: Marcel Moolenaar Date: Thu, 17 Mar 2011 16:35:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219716 - projects/altix/sys/conf X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Mar 2011 16:35:37 -0000 Author: marcel Date: Thu Mar 17 16:35:37 2011 New Revision: 219716 URL: http://svn.freebsd.org/changeset/base/219716 Log: Make it easier to switch to relocatable kernels... Modified: projects/altix/sys/conf/kern.pre.mk Modified: projects/altix/sys/conf/kern.pre.mk ============================================================================== --- projects/altix/sys/conf/kern.pre.mk Thu Mar 17 16:16:09 2011 (r219715) +++ projects/altix/sys/conf/kern.pre.mk Thu Mar 17 16:35:37 2011 (r219716) @@ -8,6 +8,10 @@ # backwards compat option for older systems. MACHINE_CPUARCH?=${MACHINE_ARCH:C/mipse[lb]/mips/:C/armeb/arm/:C/powerpc64/powerpc/} +# Support for building relocatable kernels on some architectures. +REL_KERNEL_ARCHS= # Altix TODO +LINK_REL_KERNEL= ${REL_KERNEL_ARCHS:S/${MACHINE_ARCH}/yes/g:Myes} + # Can be overridden by makeoptions or /etc/make.conf KERNEL_KO?= kernel KERNEL?= kernel @@ -148,13 +152,15 @@ SYSTEM_DEP= Makefile ${SYSTEM_OBJS} SYSTEM_OBJS= locore.o ${MDOBJS} ${OBJS} SYSTEM_OBJS+= ${SYSTEM_CFILES:.c=.o} SYSTEM_CTFMERGE= [ -z "${CTFMERGE}" -o -n "${NO_CTF}" ] || ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${SYSTEM_OBJS} vers.o -.if ${MACHINE_ARCH} == XXX_ALTIX_TODO -SYSTEM_LDFLAGS= -r + +.if ${LINK_REL_KERNEL} == yes +SYSTEM_LDFLAGS= -r -e __start .else SYSTEM_OBJS+= hack.So SYSTEM_LDFLAGS= -Bdynamic -T ${LDSCRIPT} -export-dynamic \ -dynamic-linker /red/herring .endif + SYSTEM_LD= @${LD} ${SYSTEM_LDFLAGS} -warn-common \ -o ${.TARGET} -X ${SYSTEM_OBJS} vers.o SYSTEM_LD_TAIL= @${OBJCOPY} --strip-symbol gcc2_compiled. ${.TARGET} ; \ From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 16:05:12 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 32ADC1065675; Fri, 18 Mar 2011 16:05:12 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 248CE8FC12; Fri, 18 Mar 2011 16:05:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IG5Cph071338; Fri, 18 Mar 2011 16:05:12 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IG5COs071335; Fri, 18 Mar 2011 16:05:12 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103181605.p2IG5COs071335@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 18 Mar 2011 16:05:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219742 - in projects/altix/sys: conf ia64/ia64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 16:05:12 -0000 Author: marcel Date: Fri Mar 18 16:05:11 2011 New Revision: 219742 URL: http://svn.freebsd.org/changeset/base/219742 Log: Rename firmware.S to physical.S. While we're calling into the firmware, the file only handles the switch to physical mode and back. It has no firmware functionality. Added: projects/altix/sys/ia64/ia64/physical.S - copied unchanged from r219716, projects/altix/sys/ia64/ia64/firmware.S Deleted: projects/altix/sys/ia64/ia64/firmware.S Modified: projects/altix/sys/conf/files.ia64 Modified: projects/altix/sys/conf/files.ia64 ============================================================================== --- projects/altix/sys/conf/files.ia64 Fri Mar 18 15:36:28 2011 (r219741) +++ projects/altix/sys/conf/files.ia64 Fri Mar 18 16:05:11 2011 (r219742) @@ -84,7 +84,7 @@ ia64/ia64/efi.c standard ia64/ia64/elf_machdep.c standard ia64/ia64/emulate.c standard ia64/ia64/exception.S standard -ia64/ia64/firmware.S standard +ia64/ia64/physical.S standard ia64/ia64/gdb_machdep.c optional gdb ia64/ia64/highfp.c standard ia64/ia64/in_cksum.c optional inet Copied: projects/altix/sys/ia64/ia64/physical.S (from r219716, projects/altix/sys/ia64/ia64/firmware.S) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/altix/sys/ia64/ia64/physical.S Fri Mar 18 16:05:11 2011 (r219742, copy of r219716, projects/altix/sys/ia64/ia64/firmware.S) @@ -0,0 +1,258 @@ +/*- + * Copyright (c) 2011 Marcel Moolenaar + * 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. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * $FreeBSD$ + */ + +#include +#include + + .text + +/* + * u_long ia64_efi_physical(ia64_efi_f, u_long, u_long, u_long, u_long) + * + * loc0 = ar.pfs + * loc1 = rp + * loc2 = psr + * loc3 = sp + * loc4 = bsp + * loc5 = gp + */ +ENTRY(ia64_efi_physical, 5) + .prologue + .regstk 5,6,4,0 + .save ar.pfs,loc0 + alloc loc0=ar.pfs,5,6,4,0 + ;; + .save rp,loc1 + mov loc1=rp + ;; + .body + mov loc2=psr // save psr + movl r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \ + IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH + ;; + andcm r14=loc2,r16 + movl r15=IA64_PSR_BN + ;; + rsm psr.i + mov r17=ar.rsc + or r16=r14,r15 // new psr + ;; + mov ar.rsc=0 + or loc2=loc2,r15 + ;; + flushrs + mov loc3=sp // save sp + ;; + mov loc4=ar.bsp // save ar.bsp + mov r18=ar.rnat + ;; + tpa r19=loc4 // new bspstore + mov loc5=gp + ;; + tpa r20=loc3 // new sp + ld8 r21=[in0],8 + ;; +1: + mov r14=ip + ;; + ld8 r22=[in0] + add r15=2f-1b,r14 + ;; + tpa r14=r15 + ;; + rsm psr.ic + ;; + srlz.i + ;; + mov cr.iip=r14 + mov cr.ifs=r0 + mov cr.ipsr=r16 + ;; + rfi +2: + mov ar.bspstore=r19 + mov sp=r20 + ;; + mov ar.rnat=r18 + mov ar.rsc=r17 + ;; + mov b6=r21 + mov gp=r22 + mov out0=in1 + mov out1=in2 + mov out2=in3 + mov out3=in4 + ;; + br.call.sptk.many rp=b6 + mov gp=loc5 + ;; + rsm psr.i | psr.ic + mov r16=ar.rsc + ;; + srlz.i + mov ar.rsc=0 + ;; + flushrs + ;; + mov r17=ar.rnat + movl r18=3f + ;; + mov cr.iip=r18 + mov cr.ifs=r0 + mov cr.ipsr=loc2 + ;; + rfi +3: + mov ar.bspstore=loc4 + mov sp=loc3 + ;; + mov ar.rnat=r17 + mov ar.rsc=r16 + ;; + mov rp=loc1 + mov ar.pfs=loc0 + ;; + br.ret.sptk.many rp +END(ia64_efi_physical) + + +/* + * ia64_pal_ret ia64_pal_physical(ia64_fw_f, u_long, u_long, u_long, u_long) + * + * loc0 = ar.pfs + * loc1 = rp + * loc2 = psr + * loc3 = sp + * loc4 = bsp + * loc5 = gp + */ +ENTRY(ia64_pal_physical, 5) + .prologue + .regstk 5,6,4,0 + .save ar.pfs,loc0 + alloc loc0=ar.pfs,5,6,4,0 + ;; + .save rp,loc1 + mov loc1=rp + ;; + .body + mov loc2=psr // save psr + movl r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \ + IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH + ;; + andcm r14=loc2,r16 + movl r15=IA64_PSR_BN + ;; + rsm psr.i + mov r17=ar.rsc + or r16=r14,r15 // new psr + ;; + mov ar.rsc=0 + or loc2=loc2,r15 + ;; + flushrs + mov loc3=sp // save sp + ;; + mov loc4=ar.bsp // save ar.bsp + mov r18=ar.rnat + ;; + mov loc5=gp + movl r14=kstack + ;; + tpa r19=r14 // new bspstore + movl r15=kstack_top + ;; + tpa r20=r15 // new sp + movl r21=ia64_pal_entry + ;; +1: + mov r14=ip + ld8 r22=[r21] + ;; + tpa r21=r22 + add r15=2f-1b,r14 + ;; + tpa r14=r15 + ;; + rsm psr.ic + ;; + srlz.i + ;; + mov cr.iip=r14 + mov cr.ifs=r0 + mov cr.ipsr=r16 + ;; + rfi +2: + mov ar.bspstore=r19 + add sp=-16,r20 + ;; + mov ar.rnat=r18 + mov ar.rsc=r17 + ;; + mov b6=r21 + mov out0=in0 + mov out1=in1 + mov out2=in2 + mov out3=in3 + // PAL static calls + mov r28=in0 + mov r29=in1 + mov r30=in2 + mov r31=in3 + br.call.sptk.many rp=b6 + mov gp=loc5 + ;; + rsm psr.i | psr.ic + mov r16=ar.rsc + ;; + srlz.i + mov ar.rsc=0 + ;; + flushrs + ;; + mov r17=ar.rnat + movl r18=3f + ;; + mov cr.iip=r18 + mov cr.ifs=r0 + mov cr.ipsr=loc2 + ;; + rfi +3: + mov ar.bspstore=loc4 + mov sp=loc3 + ;; + mov ar.rnat=r17 + mov ar.rsc=r16 + ;; + mov rp=loc1 + mov ar.pfs=loc0 + ;; + br.ret.sptk.many rp +END(ia64_pal_physical) From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 16:13:08 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E69551065673; Fri, 18 Mar 2011 16:13:08 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D55E98FC1B; Fri, 18 Mar 2011 16:13:08 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IGD8mY071636; Fri, 18 Mar 2011 16:13:08 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IGD8XG071615; Fri, 18 Mar 2011 16:13:08 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103181613.p2IGD8XG071615@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 18 Mar 2011 16:13:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219743 - in projects/altix/sys: boot/i386/common boot/i386/zfsboot contrib/dev/acpica contrib/dev/acpica/common contrib/dev/acpica/compiler contrib/dev/acpica/events contrib/dev/acpica... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 16:13:09 -0000 Author: marcel Date: Fri Mar 18 16:13:08 2011 New Revision: 219743 URL: http://svn.freebsd.org/changeset/base/219743 Log: Merge svn+ssh://svn.freebsd.org/base/head@219742 Modified: projects/altix/sys/boot/i386/common/cons.c projects/altix/sys/boot/i386/zfsboot/Makefile projects/altix/sys/boot/i386/zfsboot/zfsldr.S projects/altix/sys/contrib/dev/acpica/changes.txt projects/altix/sys/contrib/dev/acpica/common/dmtable.c projects/altix/sys/contrib/dev/acpica/common/dmtbdump.c projects/altix/sys/contrib/dev/acpica/common/dmtbinfo.c projects/altix/sys/contrib/dev/acpica/compiler/aslcompiler.y projects/altix/sys/contrib/dev/acpica/compiler/dtcompiler.h projects/altix/sys/contrib/dev/acpica/compiler/dtio.c projects/altix/sys/contrib/dev/acpica/compiler/dttable.c projects/altix/sys/contrib/dev/acpica/compiler/dttemplate.h projects/altix/sys/contrib/dev/acpica/compiler/dtutils.c projects/altix/sys/contrib/dev/acpica/events/evmisc.c projects/altix/sys/contrib/dev/acpica/events/evxfgpe.c projects/altix/sys/contrib/dev/acpica/include/acdisasm.h projects/altix/sys/contrib/dev/acpica/include/acglobal.h projects/altix/sys/contrib/dev/acpica/include/acpixf.h projects/altix/sys/contrib/dev/acpica/include/actbl2.h projects/altix/sys/contrib/octeon-sdk/cvmx-fpa.h projects/altix/sys/dev/dc/if_dc.c projects/altix/sys/dev/pci/pci.c projects/altix/sys/dev/pci/pcivar.h projects/altix/sys/i386/include/cpu.h projects/altix/sys/kern/vfs_cluster.c projects/altix/sys/mips/cavium/if_octm.c projects/altix/sys/mips/cavium/octe/ethernet-common.c projects/altix/sys/mips/cavium/octe/ethernet-common.h projects/altix/sys/mips/cavium/octe/ethernet.c projects/altix/sys/mips/cavium/octe/octebus.c projects/altix/sys/mips/cavium/octe/octebusvar.h projects/altix/sys/mips/cavium/octe/wrapper-cvmx-includes.h projects/altix/sys/mips/include/cpuregs.h projects/altix/sys/mips/mips/cpu.c projects/altix/sys/powerpc/include/frame.h projects/altix/sys/ufs/ufs/ufs_lookup.c projects/altix/sys/vm/vm_pageout.c projects/altix/sys/x86/x86/tsc.c Directory Properties: projects/altix/lib/libstand/ (props changed) projects/altix/sys/ (props changed) projects/altix/sys/amd64/include/xen/ (props changed) projects/altix/sys/boot/i386/efi/ (props changed) projects/altix/sys/boot/ia64/efi/ (props changed) projects/altix/sys/boot/ia64/ski/ (props changed) projects/altix/sys/boot/powerpc/boot1.chrp/ (props changed) projects/altix/sys/boot/powerpc/ofw/ (props changed) projects/altix/sys/cddl/contrib/opensolaris/ (props changed) projects/altix/sys/conf/ (props changed) projects/altix/sys/contrib/dev/acpica/ (props changed) projects/altix/sys/contrib/octeon-sdk/ (props changed) projects/altix/sys/contrib/pf/ (props changed) projects/altix/sys/contrib/x86emu/ (props changed) projects/altix/sys/kern/subr_busdma.c (props changed) Modified: projects/altix/sys/boot/i386/common/cons.c ============================================================================== --- projects/altix/sys/boot/i386/common/cons.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/boot/i386/common/cons.c Fri Mar 18 16:13:08 2011 (r219743) @@ -37,6 +37,7 @@ void putc(int c) { + v86.ctl = V86_FLAGS; v86.addr = 0x10; v86.eax = 0xe00 | (c & 0xff); v86.ebx = 0x7; Modified: projects/altix/sys/boot/i386/zfsboot/Makefile ============================================================================== --- projects/altix/sys/boot/i386/zfsboot/Makefile Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/boot/i386/zfsboot/Makefile Fri Mar 18 16:13:08 2011 (r219743) @@ -66,7 +66,7 @@ zfsldr.out: zfsldr.o CLEANFILES+= zfsboot2 zfsboot.ld zfsboot.ldr zfsboot.bin zfsboot.out \ zfsboot.o zfsboot.s zfsboot.s.tmp xreadorg.h sio.o -# We currently allow 32768 bytes for zfsboot - in practice it could be +# We currently allow 65536 bytes for zfsboot - in practice it could be # any size up to 3.5Mb but keeping it fixed size simplifies zfsldr. # BOOT2SIZE= 65536 Modified: projects/altix/sys/boot/i386/zfsboot/zfsldr.S ============================================================================== --- projects/altix/sys/boot/i386/zfsboot/zfsldr.S Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/boot/i386/zfsboot/zfsldr.S Fri Mar 18 16:13:08 2011 (r219743) @@ -37,7 +37,7 @@ .set SIZ_PAG,0x1000 # Page size .set SIZ_SEC,0x200 # Sector size - .set NSECT,0x40 + .set NSECT,0x80 .globl start .globl xread .code16 Modified: projects/altix/sys/contrib/dev/acpica/changes.txt ============================================================================== --- projects/altix/sys/contrib/dev/acpica/changes.txt Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/changes.txt Fri Mar 18 16:13:08 2011 (r219743) @@ -1,7 +1,49 @@ ---------------------------------------- -11 February 2011. Summary of changes for version 20110211: +16 March 2011. Summary of changes for version 20110316: + +x +1) ACPI CA Core Subsystem: + +Fixed a problem caused by a _PRW method appearing at the namespace root scope +during the setup of wake GPEs. A fault could occur if a _PRW directly under the +root object was passed to the AcpiSetupGpeForWake interface. Lin Ming. + +Implemented support for "spurious" Global Lock interrupts. On some systems, a +global lock interrupt can occur without the pending flag being set. Upon a GL +interrupt, we now ensure that a thread is actually waiting for the lock before +signaling GL availability. Rafael Wysocki, Bob Moore. + +Example Code and Data Size: These are the sizes for the OS-independent acpica.lib +produced by the Microsoft Visual C++ 9.0 32-bit compiler. The debug version of +the code includes the debug output trace mechanism and has a much larger code and +data size. + + Previous Release (VC 9.0): + Non-Debug Version: 89.7K Code, 23.7K Data, 113.4K Total + Debug Version: 163.9K Code, 67.5K Data, 231.4K Total + Current Release (VC 9.0): + Non-Debug Version: 89.8K Code, 23.8K Data, 113.6K Total + Debug Version: 164.2K Code, 67.9K Data, 232.1K Total + +2) iASL Compiler/Disassembler and Tools: + +Implemented full support for the "SLIC" ACPI table. Includes support in the +header files, disassembler, table compiler, and template generator. Bob Moore, +Lin Ming. -This release is available at www.acpica.org/downloads +AcpiXtract: Correctly handle embedded comments and messages from AcpiDump. +Apparently some or all versions of acpidump will occasionally emit a comment like +"Wrong checksum", etc., into the dump file. This was causing problems for +AcpiXtract. ACPICA BZ 905. + +iASL: Fix the Linux makefile by removing an inadvertent double file inclusion. +ACPICA BZ 913. + +AcpiExec: Update installation of operation region handlers. Install one handler +for a user-defined address space. This is used by the ASL test suite (ASLTS). + +---------------------------------------- +11 February 2011. Summary of changes for version 20110211: 1) ACPI CA Core Subsystem: Modified: projects/altix/sys/contrib/dev/acpica/common/dmtable.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/common/dmtable.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/common/dmtable.c Fri Mar 18 16:13:08 2011 (r219743) @@ -192,6 +192,13 @@ static const char *AcpiDmMadtS "Unknown SubTable Type" /* Reserved */ }; +static const char *AcpiDmSlicSubnames[] = +{ + "Public Key Structure", + "Windows Marker Structure", + "Unknown SubTable Type" /* Reserved */ +}; + static const char *AcpiDmSratSubnames[] = { "Processor Local APIC/SAPIC Affinity", @@ -270,7 +277,7 @@ ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, - {ACPI_SIG_SLIC, AcpiDmTableInfoSlic, NULL, NULL, NULL, "Software Licensing Description Table"}, + {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic, "Software Licensing Description Table"}, {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, @@ -475,30 +482,34 @@ AcpiDmLineHeader ( char *Name) { + /* Allow a null name for fields that span multiple lines (large buffers) */ + + if (!Name) + { + Name = ""; + } + if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ { if (ByteLength) { - AcpiOsPrintf ("[%.3d] %34s : ", - ByteLength, Name); + AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); } else { - AcpiOsPrintf ("%40s : ", - Name); + AcpiOsPrintf ("%41s : ", Name); } } else /* Normal disassembler or verbose template */ { if (ByteLength) { - AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ", + AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", Offset, Offset, ByteLength, Name); } else { - AcpiOsPrintf ("%43s : ", - Name); + AcpiOsPrintf ("%44s : ", Name); } } } @@ -635,6 +646,7 @@ AcpiDmDumpTable ( case ACPI_DMT_UINT32: case ACPI_DMT_NAME4: case ACPI_DMT_SIG: + case ACPI_DMT_SLIC: ByteLength = 4; break; case ACPI_DMT_NAME6: @@ -652,6 +664,9 @@ AcpiDmDumpTable ( case ACPI_DMT_UUID: ByteLength = 16; break; + case ACPI_DMT_BUF128: + ByteLength = 128; + break; case ACPI_DMT_STRING: ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; break; @@ -754,17 +769,26 @@ AcpiDmDumpTable ( case ACPI_DMT_BUF7: case ACPI_DMT_BUF16: + case ACPI_DMT_BUF128: /* * Buffer: Size depends on the opcode and was set above. * Each hex byte is separated with a space. */ - for (Temp8 = 0; Temp8 < ByteLength; Temp8++) + for (Temp16 = 0; Temp16 < ByteLength; Temp16++) { - AcpiOsPrintf ("%2.2X", Target[Temp8]); - if ((UINT32) (Temp8 + 1) < ByteLength) + AcpiOsPrintf ("%2.2X", Target[Temp16]); + if ((UINT32) (Temp16 + 1) < ByteLength) { - AcpiOsPrintf (" "); + if ((Temp16 > 0) && (!((Temp16+1) % 16))) + { + AcpiOsPrintf ("\n"); + AcpiDmLineHeader (0, 0, NULL); + } + else + { + AcpiOsPrintf (" "); + } } } AcpiOsPrintf ("\n"); @@ -991,6 +1015,19 @@ AcpiDmDumpTable ( AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]); break; + case ACPI_DMT_SLIC: + + /* SLIC subtable types */ + + Temp8 = *Target; + if (Temp8 > ACPI_SLIC_TYPE_RESERVED) + { + Temp8 = ACPI_SLIC_TYPE_RESERVED; + } + + AcpiOsPrintf ("%8.8X <%s>\n", *Target, AcpiDmSlicSubnames[Temp8]); + break; + case ACPI_DMT_SRAT: /* SRAT subtable types */ Modified: projects/altix/sys/contrib/dev/acpica/common/dmtbdump.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/common/dmtbdump.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/common/dmtbdump.c Fri Mar 18 16:13:08 2011 (r219743) @@ -1275,6 +1275,81 @@ AcpiDmDumpMsct ( /******************************************************************************* * + * FUNCTION: AcpiDmDumpSlic + * + * PARAMETERS: Table - A SLIC table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a SLIC + * + ******************************************************************************/ + +void +AcpiDmDumpSlic ( + ACPI_TABLE_HEADER *Table) +{ + ACPI_STATUS Status; + UINT32 Offset = sizeof (ACPI_TABLE_SLIC); + ACPI_SLIC_HEADER *SubTable; + ACPI_DMTABLE_INFO *InfoTable; + + + /* There is no main SLIC table, only subtables */ + + SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset); + while (Offset < Table->Length) + { + /* Common sub-table header */ + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + SubTable->Length, AcpiDmTableInfoSlicHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + + switch (SubTable->Type) + { + case ACPI_SLIC_TYPE_PUBLIC_KEY: + InfoTable = AcpiDmTableInfoSlic0; + break; + case ACPI_SLIC_TYPE_WINDOWS_MARKER: + InfoTable = AcpiDmTableInfoSlic1; + break; + default: + AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type); + + /* Attempt to continue */ + + if (!SubTable->Length) + { + AcpiOsPrintf ("Invalid zero length subtable\n"); + return; + } + goto NextSubTable; + } + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + SubTable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; + } + +NextSubTable: + /* Point to next sub-table */ + + Offset += SubTable->Length; + SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length); + } +} + + +/******************************************************************************* + * * FUNCTION: AcpiDmDumpSlit * * PARAMETERS: Table - An SLIT Modified: projects/altix/sys/contrib/dev/acpica/common/dmtbinfo.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/common/dmtbinfo.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/common/dmtbinfo.c Fri Mar 18 16:13:08 2011 (r219743) @@ -51,6 +51,31 @@ ACPI_MODULE_NAME ("dmtbinfo") /* + * How to add a new table: + * + * - Add the C table definition to the actbl1.h or actbl2.h header. + * - Add ACPI_xxxx_OFFSET macro(s) for the table (and subtables) to list below. + * - Define the table in this file (for the disassembler). If any + * new data types are required (ACPI_DMT_*), see below. + * - Add an external declaration for the new table definition (AcpiDmTableInfo*) + * in acdisam.h + * - Add new table definition to the dispatch table in dmtable.c (AcpiDmTableData) + * If a simple table (with no subtables), no disassembly code is needed. + * Otherwise, create the AcpiDmDump* function for to disassemble the table + * and add it to the dmtbdump.c file. + * - Add an external declaration for the new AcpiDmDump* function in acdisasm.h + * - Add the new AcpiDmDump* function to the dispatch table in dmtable.c + * - Create a template for the new table + * - Add data table compiler support + * + * How to add a new data type (ACPI_DMT_*): + * + * - Add new type at the end of the ACPI_DMT list in acdisasm.h + * - Add length and implementation cases in dmtable.c (disassembler) + * - Add type and length cases in dtutils.c (DT compiler) + */ + +/* * Macros used to generate offsets to specific table fields */ #define ACPI_FACS_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_FACS,f) @@ -131,6 +156,9 @@ #define ACPI_MADTH_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f) #define ACPI_MCFG0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MCFG_ALLOCATION,f) #define ACPI_MSCT0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MSCT_PROXIMITY,f) +#define ACPI_SLICH_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SLIC_HEADER,f) +#define ACPI_SLIC0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SLIC_KEY,f) +#define ACPI_SLIC1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SLIC_MARKER,f) #define ACPI_SRATH_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f) #define ACPI_SRAT0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SRAT_CPU_AFFINITY,f) #define ACPI_SRAT1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SRAT_MEM_AFFINITY,f) @@ -1256,13 +1284,42 @@ ACPI_DMTABLE_INFO AcpiDmTableI /******************************************************************************* * - * SLIC - Software Licensing Description Table. NOT FULLY IMPLEMENTED, do not - * have the table definition. + * SLIC - Software Licensing Description Table. There is no common table, just + * the standard ACPI header and then subtables. * ******************************************************************************/ -ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[] = +/* Common Subtable header (one per Subtable) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSlicHdr[] = +{ + {ACPI_DMT_SLIC, ACPI_SLICH_OFFSET (Type), "Subtable Type", 0}, + {ACPI_DMT_UINT32, ACPI_SLICH_OFFSET (Length), "Length", DT_LENGTH}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoSlic0[] = +{ + {ACPI_DMT_UINT8, ACPI_SLIC0_OFFSET (KeyType), "Key Type", 0}, + {ACPI_DMT_UINT8, ACPI_SLIC0_OFFSET (Version), "Version", 0}, + {ACPI_DMT_UINT16, ACPI_SLIC0_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (Algorithm), "Algorithm", 0}, + {ACPI_DMT_NAME4, ACPI_SLIC0_OFFSET (Magic), "Magic", 0}, + {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (BitLength), "BitLength", 0}, + {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (Exponent), "Exponent", 0}, + {ACPI_DMT_BUF128, ACPI_SLIC0_OFFSET (Modulus[0]), "Modulus", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoSlic1[] = { + {ACPI_DMT_UINT32, ACPI_SLIC1_OFFSET (Version), "Version", 0}, + {ACPI_DMT_NAME6, ACPI_SLIC1_OFFSET (OemId[0]), "Oem ID", 0}, + {ACPI_DMT_NAME8, ACPI_SLIC1_OFFSET (OemTableId[0]), "Oem Table ID", 0}, + {ACPI_DMT_NAME8, ACPI_SLIC1_OFFSET (WindowsFlag[0]), "Windows Flag", 0}, + {ACPI_DMT_UINT32, ACPI_SLIC1_OFFSET (SlicVersion), "SLIC Version", 0}, + {ACPI_DMT_BUF16, ACPI_SLIC1_OFFSET (Reserved[0]), "Reserved", 0}, + {ACPI_DMT_BUF128, ACPI_SLIC1_OFFSET (Signature[0]), "Signature", 0}, ACPI_DMT_TERMINATOR }; Modified: projects/altix/sys/contrib/dev/acpica/compiler/aslcompiler.y ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/aslcompiler.y Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/aslcompiler.y Fri Mar 18 16:13:08 2011 (r219743) @@ -728,6 +728,21 @@ ASLCode | error {YYABORT; $$ = NULL;} ; +/* + * Note concerning support for "module-level code". + * + * ACPI 1.0 allowed Type1 and Type2 executable opcodes outside of control + * methods (the so-called module-level code.) This support was explicitly + * removed in ACPI 2.0, but this type of code continues to be created by + * BIOS vendors. In order to support the disassembly and recompilation of + * such code (and the porting of ASL code to iASL), iASL supports this + * code in violation of the current ACPI specification. + * + * The grammar change to support module-level code is to revert the + * {ObjectList} portion of the DefinitionBlockTerm in ACPI 2.0 to the + * original use of {TermList} instead (see below.) This allows the use + * of Type1 and Type2 opcodes at module level. + */ DefinitionBlockTerm : PARSEOP_DEFINITIONBLOCK '(' {$$ = TrCreateLeafNode (PARSEOP_DEFINITIONBLOCK);} String ',' Modified: projects/altix/sys/contrib/dev/acpica/compiler/dtcompiler.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/dtcompiler.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/dtcompiler.h Fri Mar 18 16:13:08 2011 (r219743) @@ -394,6 +394,10 @@ DtCompileRsdt ( void **PFieldList); ACPI_STATUS +DtCompileSlic ( + void **PFieldList); + +ACPI_STATUS DtCompileSlit ( void **PFieldList); Modified: projects/altix/sys/contrib/dev/acpica/compiler/dtio.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/dtio.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/dtio.c Fri Mar 18 16:13:08 2011 (r219743) @@ -60,6 +60,10 @@ static void DtLinkField ( DT_FIELD *Field); +static void +DtMergeField ( + char *Value); + static ACPI_STATUS DtParseLine ( char *LineBuffer, @@ -222,6 +226,56 @@ DtLinkField ( /****************************************************************************** * + * FUNCTION: DtMergeField + * + * PARAMETERS: Value - Merge this line into previous one + * + * RETURN: None + * + * DESCRIPTION: Merge a field value to the previous one, + * probably for a multi-line buffer definition. + * + *****************************************************************************/ + +static void +DtMergeField ( + char *Value) +{ + DT_FIELD *Prev; + DT_FIELD *Next; + char *NewValue; + UINT32 PrevLength; + UINT32 ThisLength; + + + Prev = Next = Gbl_FieldList; + + while (Next) + { + Prev = Next; + Next = Next->Next; + } + + if (Prev) + { + PrevLength = ACPI_STRLEN (Prev->Value); + ThisLength = ACPI_STRLEN (Value); + + /* Add two for: separator + NULL terminator */ + + NewValue = UtLocalCalloc (PrevLength + ThisLength + 2); + ACPI_STRNCPY (NewValue, Prev->Value, PrevLength); + NewValue[PrevLength] = ' '; + + ACPI_STRNCPY ((NewValue + PrevLength + 1), Value, ThisLength); + ACPI_FREE (Prev->Value); + Prev->Value = NewValue; + } +} + + +/****************************************************************************** + * * FUNCTION: DtParseLine * * PARAMETERS: LineBuffer - Current source code line @@ -354,11 +408,12 @@ DtParseLine ( Length = ACPI_PTR_DIFF (End, Start); TmpValue = UtLocalCalloc (Length + 1); + ACPI_STRNCPY (TmpValue, Start, Length); Value = DtTrim (TmpValue); ACPI_FREE (TmpValue); - if (Name && Value) + if (ACPI_STRLEN (Name) && Value) { Field = UtLocalCalloc (sizeof (DT_FIELD)); Field->Name = Name; @@ -370,6 +425,17 @@ DtParseLine ( DtLinkField (Field); } + else if (!ACPI_STRLEN (Name)) + { + /* Handle multi-line buffers (length > 16) */ + + DtMergeField (Value); + } + else + { + ACPI_FREE (Name); + ACPI_FREE (Value); + } return (AE_OK); } Modified: projects/altix/sys/contrib/dev/acpica/compiler/dttable.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/dttable.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/dttable.c Fri Mar 18 16:13:08 2011 (r219743) @@ -1134,6 +1134,75 @@ DtCompileRsdt ( /****************************************************************************** * + * FUNCTION: DtCompileSlic + * + * PARAMETERS: List - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile SLIC. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileSlic ( + void **List) +{ + ACPI_STATUS Status; + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_FIELD *SubtableStart; + ACPI_SLIC_HEADER *SlicHeader; + ACPI_DMTABLE_INFO *InfoTable; + + + while (*PFieldList) + { + SubtableStart = *PFieldList; + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer); + + switch (SlicHeader->Type) + { + case ACPI_SLIC_TYPE_PUBLIC_KEY: + InfoTable = AcpiDmTableInfoSlic0; + break; + case ACPI_SLIC_TYPE_WINDOWS_MARKER: + InfoTable = AcpiDmTableInfoSlic1; + break; + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC"); + return (AE_ERROR); + } + + Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPopSubtable (); + } + + return (AE_OK); +} + + +/****************************************************************************** + * * FUNCTION: DtCompileSlit * * PARAMETERS: List - Current field list pointer Modified: projects/altix/sys/contrib/dev/acpica/compiler/dttemplate.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/dttemplate.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/dttemplate.h Fri Mar 18 16:13:08 2011 (r219743) @@ -534,6 +534,57 @@ const unsigned char TemplateSbst[] = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 00000028 "........" */ }; +const unsigned char TemplateSlic[] = +{ + 0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00, /* 00000000 "SLICv..." */ + 0x01,0x07,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x11,0x02,0x11,0x20,0x00,0x00,0x00,0x00, /* 00000020 "... ...." */ + 0x9C,0x00,0x00,0x00,0x06,0x02,0x00,0x00, /* 00000028 "........" */ + 0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31, /* 00000030 ".$..RSA1" */ + 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000038 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000040 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000048 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000050 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000058 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000060 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000068 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000070 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000078 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000080 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000088 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000090 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000098 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000A0 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000A8 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000B0 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000B8 "........" */ + 0x01,0x00,0x00,0x00,0xB6,0x00,0x00,0x00, /* 000000C0 "........" */ + 0x00,0x00,0x02,0x00,0x49,0x4E,0x54,0x45, /* 000000C8 "....INTE" */ + 0x4C,0x20,0x54,0x45,0x4D,0x50,0x4C,0x41, /* 000000D0 "L TEMPLA" */ + 0x54,0x45,0x57,0x49,0x4E,0x44,0x4F,0x57, /* 000000D8 "TEWINDOW" */ + 0x53,0x20,0x01,0x00,0x02,0x00,0x00,0x00, /* 000000E0 "S ......" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000E8 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000F0 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000F8 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000100 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000108 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000110 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000118 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000120 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000128 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000130 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000138 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000140 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000148 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000150 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000158 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000160 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000168 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00 /* 00000170 "......" */ +}; + const unsigned char TemplateSlit[] = { 0x53,0x4C,0x49,0x54,0x3C,0x00,0x00,0x00, /* 00000000 "SLIT<..." */ Modified: projects/altix/sys/contrib/dev/acpica/compiler/dtutils.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/compiler/dtutils.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/compiler/dtutils.c Fri Mar 18 16:13:08 2011 (r219743) @@ -401,6 +401,7 @@ DtGetFieldType ( case ACPI_DMT_BUFFER: case ACPI_DMT_BUF7: case ACPI_DMT_BUF16: + case ACPI_DMT_BUF128: case ACPI_DMT_PCI_PATH: Type = DT_FIELD_TYPE_BUFFER; break; @@ -546,6 +547,7 @@ DtGetFieldLength ( case ACPI_DMT_UINT32: case ACPI_DMT_NAME4: + case ACPI_DMT_SLIC: case ACPI_DMT_SIG: ByteLength = 4; break; @@ -605,6 +607,10 @@ DtGetFieldLength ( ByteLength = 16; break; + case ACPI_DMT_BUF128: + ByteLength = 128; + break; + case ACPI_DMT_UNICODE: Value = DtGetFieldValue (Field, Info->Name); Modified: projects/altix/sys/contrib/dev/acpica/events/evmisc.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/events/evmisc.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/events/evmisc.c Fri Mar 18 16:13:08 2011 (r219743) @@ -309,12 +309,8 @@ AcpiEvNotifyDispatch ( * RETURN: ACPI_INTERRUPT_HANDLED * * DESCRIPTION: Invoked directly from the SCI handler when a global lock - * release interrupt occurs. Attempt to acquire the global lock, - * if successful, signal the thread waiting for the lock. - * - * NOTE: Assumes that the semaphore can be signaled from interrupt level. If - * this is not possible for some reason, a separate thread will have to be - * scheduled to do this. + * release interrupt occurs. If there is actually a pending + * request for the lock, signal the waiting thread. * ******************************************************************************/ @@ -322,32 +318,38 @@ static UINT32 AcpiEvGlobalLockHandler ( void *Context) { - BOOLEAN Acquired = FALSE; ACPI_STATUS Status; + ACPI_CPU_FLAGS Flags; + + Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); /* - * Attempt to get the lock. - * - * If we don't get it now, it will be marked pending and we will - * take another interrupt when it becomes free. + * If a request for the global lock is not actually pending, + * we are done. This handles "spurious" global lock interrupts + * which are possible (and have been seen) with bad BIOSs. */ - ACPI_ACQUIRE_GLOBAL_LOCK (AcpiGbl_FACS, Acquired); - if (Acquired) + if (!AcpiGbl_GlobalLockPending) { - /* Got the lock, now wake the thread waiting for it */ + goto CleanupAndExit; + } - AcpiGbl_GlobalLockAcquired = TRUE; + /* + * Send a unit to the global lock semaphore. The actual acquisition + * of the global lock will be performed by the waiting thread. + */ + Status = AcpiOsSignalSemaphore (AcpiGbl_GlobalLockSemaphore, 1); + if (ACPI_FAILURE (Status)) + { + ACPI_ERROR ((AE_INFO, "Could not signal Global Lock semaphore")); + } - /* Send a unit to the semaphore */ + AcpiGbl_GlobalLockPending = FALSE; - Status = AcpiOsSignalSemaphore (AcpiGbl_GlobalLockSemaphore, 1); - if (ACPI_FAILURE (Status)) - { - ACPI_ERROR ((AE_INFO, "Could not signal Global Lock semaphore")); - } - } +CleanupAndExit: + + AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); return (ACPI_INTERRUPT_HANDLED); } @@ -385,15 +387,22 @@ AcpiEvInitGlobalLockHandler ( * Map to AE_OK, but mark global lock as not present. Any attempt to * actually use the global lock will be flagged with an error. */ + AcpiGbl_GlobalLockPresent = FALSE; if (Status == AE_NO_HARDWARE_RESPONSE) { ACPI_ERROR ((AE_INFO, "No response from Global Lock hardware, disabling lock")); - AcpiGbl_GlobalLockPresent = FALSE; return_ACPI_STATUS (AE_OK); } + Status = AcpiOsCreateLock (&AcpiGbl_GlobalLockPendingLock); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + + AcpiGbl_GlobalLockPending = FALSE; AcpiGbl_GlobalLockPresent = TRUE; return_ACPI_STATUS (Status); } @@ -454,7 +463,8 @@ ACPI_STATUS AcpiEvAcquireGlobalLock ( UINT16 Timeout) { - ACPI_STATUS Status = AE_OK; + ACPI_CPU_FLAGS Flags; + ACPI_STATUS Status; BOOLEAN Acquired = FALSE; @@ -487,8 +497,8 @@ AcpiEvAcquireGlobalLock ( } /* - * Make sure that a global lock actually exists. If not, just treat the - * lock as a standard mutex. + * Make sure that a global lock actually exists. If not, just + * treat the lock as a standard mutex. */ if (!AcpiGbl_GlobalLockPresent) { @@ -496,31 +506,45 @@ AcpiEvAcquireGlobalLock ( return_ACPI_STATUS (AE_OK); } - /* Attempt to acquire the actual hardware lock */ + Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); - ACPI_ACQUIRE_GLOBAL_LOCK (AcpiGbl_FACS, Acquired); - if (Acquired) + do { - /* We got the lock */ + /* Attempt to acquire the actual hardware lock */ - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Acquired hardware Global Lock\n")); + ACPI_ACQUIRE_GLOBAL_LOCK (AcpiGbl_FACS, Acquired); + if (Acquired) + { + AcpiGbl_GlobalLockAcquired = TRUE; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Acquired hardware Global Lock\n")); + break; + } - AcpiGbl_GlobalLockAcquired = TRUE; - return_ACPI_STATUS (AE_OK); - } + /* + * Did not get the lock. The pending bit was set above, and + * we must now wait until we receive the global lock + * released interrupt. + */ + AcpiGbl_GlobalLockPending = TRUE; + AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); - /* - * Did not get the lock. The pending bit was set above, and we must now - * wait until we get the global lock released interrupt. - */ - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Waiting for hardware Global Lock\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Waiting for hardware Global Lock\n")); - /* - * Wait for handshake with the global lock interrupt handler. - * This interface releases the interpreter if we must wait. - */ - Status = AcpiExSystemWaitSemaphore (AcpiGbl_GlobalLockSemaphore, - ACPI_WAIT_FOREVER); + /* + * Wait for handshake with the global lock interrupt handler. + * This interface releases the interpreter if we must wait. + */ + Status = AcpiExSystemWaitSemaphore (AcpiGbl_GlobalLockSemaphore, + ACPI_WAIT_FOREVER); + + Flags = AcpiOsAcquireLock (AcpiGbl_GlobalLockPendingLock); + + } while (ACPI_SUCCESS (Status)); + + AcpiGbl_GlobalLockPending = FALSE; + AcpiOsReleaseLock (AcpiGbl_GlobalLockPendingLock, Flags); return_ACPI_STATUS (Status); } Modified: projects/altix/sys/contrib/dev/acpica/events/evxfgpe.c ============================================================================== --- projects/altix/sys/contrib/dev/acpica/events/evxfgpe.c Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/events/evxfgpe.c Fri Mar 18 16:13:08 2011 (r219743) @@ -314,9 +314,19 @@ AcpiSetupGpeForWake ( return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Handle root object case */ + + if (WakeDevice == ACPI_ROOT_OBJECT) + { + DeviceNode = AcpiGbl_RootNode; + } + else + { + DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, WakeDevice); + } + /* Validate WakeDevice is of type Device */ - DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, WakeDevice); if (DeviceNode->Type != ACPI_TYPE_DEVICE) { return_ACPI_STATUS (AE_BAD_PARAMETER); Modified: projects/altix/sys/contrib/dev/acpica/include/acdisasm.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/include/acdisasm.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/include/acdisasm.h Fri Mar 18 16:13:08 2011 (r219743) @@ -129,7 +129,8 @@ typedef const struct acpi_dmtable_info #define ACPI_DMT_DEVICE_PATH 44 #define ACPI_DMT_LABEL 45 #define ACPI_DMT_BUF7 46 - +#define ACPI_DMT_BUF128 47 +#define ACPI_DMT_SLIC 48 typedef void (*ACPI_DMTABLE_HANDLER) ( @@ -262,7 +263,9 @@ extern ACPI_DMTABLE_INFO AcpiDmTa extern ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp2[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[]; -extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlicHdr[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic0[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpmi[]; @@ -379,6 +382,10 @@ AcpiDmDumpRsdt ( ACPI_TABLE_HEADER *Table); void +AcpiDmDumpSlic ( + ACPI_TABLE_HEADER *Table); + +void AcpiDmDumpSlit ( ACPI_TABLE_HEADER *Table); Modified: projects/altix/sys/contrib/dev/acpica/include/acglobal.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/include/acglobal.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/include/acglobal.h Fri Mar 18 16:13:08 2011 (r219743) @@ -190,13 +190,16 @@ ACPI_EXTERN ACPI_MUTEX_INFO /* * Global lock mutex is an actual AML mutex object - * Global lock semaphore works in conjunction with the HW global lock + * Global lock semaphore works in conjunction with the actual global lock + * Global lock spinlock is used for "pending" handshake */ ACPI_EXTERN ACPI_OPERAND_OBJECT *AcpiGbl_GlobalLockMutex; ACPI_EXTERN ACPI_SEMAPHORE AcpiGbl_GlobalLockSemaphore; +ACPI_EXTERN ACPI_SPINLOCK AcpiGbl_GlobalLockPendingLock; ACPI_EXTERN UINT16 AcpiGbl_GlobalLockHandle; ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockAcquired; ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockPresent; +ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockPending; /* * Spinlocks are used for interfaces that can be possibly called at Modified: projects/altix/sys/contrib/dev/acpica/include/acpixf.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/include/acpixf.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/include/acpixf.h Fri Mar 18 16:13:08 2011 (r219743) @@ -48,7 +48,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20110211 +#define ACPI_CA_VERSION 0x20110316 #include #include Modified: projects/altix/sys/contrib/dev/acpica/include/actbl2.h ============================================================================== --- projects/altix/sys/contrib/dev/acpica/include/actbl2.h Fri Mar 18 16:05:11 2011 (r219742) +++ projects/altix/sys/contrib/dev/acpica/include/actbl2.h Fri Mar 18 16:13:08 2011 (r219743) @@ -1,6 +1,6 @@ /****************************************************************************** * - * Name: actbl2.h - ACPI Specification Revision 2.0 Tables + * Name: actbl2.h - ACPI Table Definitions (tables not in ACPI spec) * *****************************************************************************/ @@ -831,6 +831,81 @@ typedef struct acpi_table_mchi /******************************************************************************* * + * SLIC - Software Licensing Description Table + * Version 1 + * + * Conforms to "OEM Activation 2.0 for Windows Vista Operating Systems", + * Copyright 2006 + * + ******************************************************************************/ + +/* Basic SLIC table is only the common ACPI header */ + +typedef struct acpi_table_slic +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 17:15:59 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A5397106567D; Fri, 18 Mar 2011 17:15:59 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 987F38FC1D; Fri, 18 Mar 2011 17:15:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IHFxT8074962; Fri, 18 Mar 2011 17:15:59 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IHFxOQ074960; Fri, 18 Mar 2011 17:15:59 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103181715.p2IHFxOQ074960@svn.freebsd.org> From: Alexander Motin Date: Fri, 18 Mar 2011 17:15:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219746 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 17:15:59 -0000 Author: mav Date: Fri Mar 18 17:15:59 2011 New Revision: 219746 URL: http://svn.freebsd.org/changeset/base/219746 Log: When disconnecting disk from subdisks - make sure they are in NONE state. Before now (before Promise) it seems wasn't affecting anything. Modified: projects/graid/head/sys/geom/raid/g_raid.c Modified: projects/graid/head/sys/geom/raid/g_raid.c ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.c Fri Mar 18 17:15:46 2011 (r219745) +++ projects/graid/head/sys/geom/raid/g_raid.c Fri Mar 18 17:15:59 2011 (r219746) @@ -1912,6 +1912,7 @@ g_raid_destroy_disk(struct g_raid_disk * disk->d_consumer = NULL; } TAILQ_FOREACH_SAFE(sd, &disk->d_subdisks, sd_next, tmp) { + g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE); g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED, G_RAID_EVENT_SUBDISK); TAILQ_REMOVE(&disk->d_subdisks, sd, sd_next); From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 17:49:11 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D02A91065673; Fri, 18 Mar 2011 17:49:11 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C2C608FC12; Fri, 18 Mar 2011 17:49:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IHnBho075906; Fri, 18 Mar 2011 17:49:11 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IHnBdt075904; Fri, 18 Mar 2011 17:49:11 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103181749.p2IHnBdt075904@svn.freebsd.org> From: Alexander Motin Date: Fri, 18 Mar 2011 17:49:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219752 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 17:49:12 -0000 Author: mav Date: Fri Mar 18 17:49:11 2011 New Revision: 219752 URL: http://svn.freebsd.org/changeset/base/219752 Log: Set of Promise MD improvements: - add support for identifying SPARE drives; - add support for reading and writing degraded states; - fix detach handling; - fix RAID1 writing; Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Fri Mar 18 17:23:23 2011 (r219751) +++ projects/graid/head/sys/geom/raid/md_promise.c Fri Mar 18 17:49:11 2011 (r219752) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); static MALLOC_DEFINE(M_MD_PROMISE, "md_promise_data", "GEOM_RAID Promise metadata"); #define PROMISE_MAX_DISKS 8 -#define PROMISE_MAX_SUBDISKS 4 +#define PROMISE_MAX_SUBDISKS 2 #define PROMISE_META_OFFSET 14 struct promise_raid_disk { @@ -93,6 +93,7 @@ struct promise_raid_conf { #define PROMISE_S_READY 0x08 #define PROMISE_S_DEGRADED 0x10 #define PROMISE_S_MARKED 0x20 +#define PROMISE_S_MIGRATING 0x40 #define PROMISE_S_FUNCTIONAL 0x80 uint8_t type; /* Voluem type. */ @@ -237,6 +238,20 @@ promise_meta_find_disk(struct promise_ra return (-1); } +static int +promise_meta_translate_disk(struct g_raid_volume *vol, int md_disk_pos) +{ + int disk_pos, width; + + if (md_disk_pos >= 0 && vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { + width = vol->v_disks_count / 2; + disk_pos = (md_disk_pos / width) + + (md_disk_pos % width) * width; + } else + disk_pos = md_disk_pos; + return (disk_pos); +} + static void promise_meta_get_name(struct promise_raid_conf *meta, char *buf) { @@ -310,7 +325,7 @@ next: return (subdisks); } - if (meta->total_disks < 1 || meta->total_disks > PROMISE_MAX_DISKS) { + if (meta->total_disks > PROMISE_MAX_DISKS) { G_RAID_DEBUG(1, "Wrong number of disks on %s (%d)", pp->name, meta->total_disks); free(meta, M_MD_PROMISE); @@ -482,7 +497,7 @@ g_raid_md_promise_start_disk(struct g_ra struct g_raid_md_promise_perdisk *pd, *oldpd; struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - int disk_pos, resurrection = 0; + int disk_pos, md_disk_pos, resurrection = 0; sc = disk->d_softc; md = sc->sc_md; @@ -497,14 +512,16 @@ g_raid_md_promise_start_disk(struct g_ra meta = pv->pv_meta; /* Find disk position in metadata by it's serial. */ - disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id); + md_disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id); + /* For RAID10 we need to translate order. */ + disk_pos = promise_meta_translate_disk(vol, md_disk_pos); if (disk_pos < 0) { G_RAID_DEBUG1(1, sc, "Unknown, probably new or stale disk"); /* Failed stale disk is useless for us. */ -// if (pd->pd_disk_meta.flags & PROMISE_F_FAILED) { -// g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); -// return (0); -// } + if (meta->disks[md_disk_pos].flags & PROMISE_F_DOWN) { + g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); + return (0); + } /* If we are in the start process, that's all for now. */ if (!pv->pv_started) goto nofit; @@ -541,17 +558,15 @@ g_raid_md_promise_start_disk(struct g_ra #endif if (olddisk == NULL) { nofit: -#if 0 - if (pd->pd_disk_meta.flags & PROMISE_F_SPARE) { + if (pd->pd_meta[sdn]->disk.flags & PROMISE_F_SPARE) { g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); return (1); } else { -#endif g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE); return (0); -// } + } } oldpd = (struct g_raid_md_promise_perdisk *)olddisk->d_md_data; // disk_pos = oldpd->pd_disk_pos; @@ -598,116 +613,50 @@ nofit: /* Welcome the new disk. */ if (resurrection) g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); -/* else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) + else if (meta->disks[md_disk_pos].flags & PROMISE_F_DOWN) g_raid_change_disk_state(disk, G_RAID_DISK_S_FAILED); - else if (meta->disk[disk_pos].flags & PROMISE_F_SPARE) - g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); -*/ else + else g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); sd->sd_offset = (off_t)pd->pd_meta[sdn]->disk_offset * 512; sd->sd_size = (off_t)pd->pd_meta[sdn]->disk_sectors * 512; - /* Up to date disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_ACTIVE); - g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, - G_RAID_EVENT_SUBDISK); -#if 0 - TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { - mvol = promise_get_volume(meta, - (uintptr_t)(sd->sd_volume->v_md_data)); - mmap0 = promise_get_map(mvol, 0); - if (mvol->migr_state) - mmap1 = promise_get_map(mvol, 1); - else - mmap1 = mmap0; - - if (resurrection) { - /* Stale disk, almost same as new. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NEW); - } else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) { - /* Failed disk, almost useless. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_FAILED); - } else if (mvol->migr_state == 0) { - if (mmap0->status == PROMISE_S_UNINITIALIZED) { - /* Freshly created uninitialized volume. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_UNINITIALIZED); - } else if (mmap0->disk_idx[sd->sd_pos] & PROMISE_DI_RBLD) { - /* Freshly inserted disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NEW); - } else if (mvol->dirty) { - /* Dirty volume (unclean shutdown). */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_STALE); - } else { - /* Up to date disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_ACTIVE); - } - } else if (mvol->migr_type == PROMISE_MT_INIT || - mvol->migr_type == PROMISE_MT_REBUILD) { - if (mmap0->disk_idx[sd->sd_pos] & PROMISE_DI_RBLD) { - /* Freshly inserted disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NEW); - } else if (mmap1->disk_idx[sd->sd_pos] & PROMISE_DI_RBLD) { - /* Rebuilding disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_REBUILD); - if (mvol->dirty) { - sd->sd_rebuild_pos = 0; - } else { - sd->sd_rebuild_pos = - (off_t)mvol->curr_migr_unit * - sd->sd_volume->v_strip_size * - mmap0->total_domains; - } - } else if (mvol->dirty) { - /* Dirty volume (unclean shutdown). */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_STALE); - } else { - /* Up to date disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_ACTIVE); - } - } else if (mvol->migr_type == PROMISE_MT_VERIFY || - mvol->migr_type == PROMISE_MT_REPAIR) { - if (mmap0->disk_idx[sd->sd_pos] & PROMISE_DI_RBLD) { - /* Freshly inserted disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NEW); - } else if (mmap1->disk_idx[sd->sd_pos] & PROMISE_DI_RBLD) { - /* Resyncing disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_RESYNC); - if (mvol->dirty) { - sd->sd_rebuild_pos = 0; - } else { - sd->sd_rebuild_pos = - (off_t)mvol->curr_migr_unit * - sd->sd_volume->v_strip_size * - mmap0->total_domains; - } - } else if (mvol->dirty) { - /* Dirty volume (unclean shutdown). */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_STALE); - } else { - /* Up to date disk. */ - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_ACTIVE); - } + if (resurrection) { + /* Stale disk, almost same as new. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_NEW); + } else if (meta->disks[md_disk_pos].flags & PROMISE_F_DOWN) { + /* Failed disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_FAILED); + } else if (meta->disks[md_disk_pos].flags & PROMISE_F_REDIR) { + /* Rebuilding disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_REBUILD); + if (pd->pd_meta[sdn]->generation != meta->generation) + sd->sd_rebuild_pos = 0; + else { + sd->sd_rebuild_pos = + pd->pd_meta[sdn]->rebuild_lba * 512; } - g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, - G_RAID_EVENT_SUBDISK); + } else if (!(meta->disks[md_disk_pos].flags & PROMISE_F_ONLINE)) { + /* Rebuilding disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_NEW); + } else if (pd->pd_meta[sdn]->generation != meta->generation || + (meta->status & PROMISE_S_MARKED)) { + /* Stale disk or dirty volume (unclean shutdown). */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_STALE); + } else { + /* Up to date disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); } + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); +#if 0 /* Update status of our need for spare. */ if (mdi->mdio_started) { mdi->mdio_incomplete = @@ -906,6 +855,14 @@ g_raid_md_promise_new_disk(struct g_raid for (i = 0; i < pd->pd_subdisks; i++) { pdmeta = pd->pd_meta[i]; + if (pdmeta->disk.number == 0xff) { + if (pdmeta->disk.flags & PROMISE_F_SPARE) { + g_raid_change_disk_state(disk, + G_RAID_DISK_S_SPARE); + } + continue; + } + /* Look for volume with matching ID. */ vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); if (vol == NULL) { @@ -949,6 +906,8 @@ g_raid_md_promise_new_disk(struct g_raid /* Look for volume with matching ID. */ vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); + if (vol == NULL) + continue; pv = vol->v_md_data; if (pv->pv_started) { @@ -1116,7 +1075,6 @@ g_raid_md_event_promise(struct g_raid_md struct g_raid_disk *disk, u_int event) { struct g_raid_softc *sc; - struct g_raid_subdisk *sd; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd; @@ -1127,24 +1085,9 @@ g_raid_md_event_promise(struct g_raid_md pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; switch (event) { case G_RAID_DISK_E_DISCONNECTED: - /* If disk was assigned, just update statuses. */ - if (pd->pd_subdisks >= 0) { - g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } - TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NONE); - g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED, - G_RAID_EVENT_SUBDISK); - } - } else { - /* Otherwise -- delete. */ - g_raid_change_disk_state(disk, G_RAID_DISK_S_NONE); - g_raid_destroy_disk(disk); - } + /* Delete disk. */ + g_raid_change_disk_state(disk, G_RAID_DISK_S_NONE); + g_raid_destroy_disk(disk); /* Write updated metadata to all disks. */ g_raid_md_write_promise(md, NULL, NULL, NULL); @@ -1810,7 +1753,7 @@ g_raid_md_write_promise(struct g_raid_md struct g_raid_md_promise_perdisk *pd; struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - int i, j; + int i, j, pos; sc = md->mdo_softc; mdi = (struct g_raid_md_promise_object *)md; @@ -1848,6 +1791,8 @@ g_raid_md_write_promise(struct g_raid_md pv->pv_generation++; meta = malloc(sizeof(*meta), M_MD_PROMISE, M_WAITOK | M_ZERO); + if (pv->pv_meta != NULL) + memcpy(meta, pv->pv_meta, sizeof(*meta)); memcpy(meta->promise_id, PROMISE_MAGIC, sizeof(PROMISE_MAGIC)); meta->dummy_0 = 0x00020000; meta->integrity = PROMISE_I_VALID; @@ -1855,6 +1800,10 @@ g_raid_md_write_promise(struct g_raid_md meta->generation = pv->pv_generation; meta->status = PROMISE_S_VALID | PROMISE_S_ONLINE | PROMISE_S_INITED | PROMISE_S_READY; + if (vol->v_state < G_RAID_VOLUME_S_OPTIMAL) + meta->status |= PROMISE_S_DEGRADED; + if (vol->v_dirty) + meta->status |= PROMISE_S_MARKED; if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0 || vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) meta->type = PROMISE_T_RAID0; @@ -1872,12 +1821,13 @@ g_raid_md_write_promise(struct g_raid_md meta->total_disks = vol->v_disks_count; meta->stripe_shift = ffs(vol->v_strip_size / 1024); meta->array_width = vol->v_disks_count; - if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 || + vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) meta->array_width /= 2; if (pv->pv_meta != NULL) meta->array_number = pv->pv_meta->array_number; meta->total_sectors = vol->v_mediasize / vol->v_sectorsize; - meta->cylinders = meta->total_sectors / (254 * 63); + meta->cylinders = meta->total_sectors / (255 * 63) - 1; meta->heads = 254; meta->sectors = 63; if (pv->pv_meta != NULL) @@ -1885,14 +1835,27 @@ g_raid_md_write_promise(struct g_raid_md else arc4rand(&meta->volume_id, sizeof(meta->volume_id), 0); for (i = 0; i < vol->v_disks_count; i++) { - meta->disks[i].flags = PROMISE_F_VALID | - PROMISE_F_ONLINE | PROMISE_F_ASSIGNED; - meta->disks[i].number = i; + sd = &vol->v_subdisks[i]; + /* For RAID10 we need to translate order. */ + pos = promise_meta_translate_disk(vol, i); + meta->disks[pos].flags = PROMISE_F_VALID | + PROMISE_F_ASSIGNED; + if (sd->sd_state == G_RAID_SUBDISK_S_NONE) { + meta->disks[pos].flags |= 0; + } else if (sd->sd_state == G_RAID_SUBDISK_S_FAILED) { + meta->disks[pos].flags |= + PROMISE_F_DOWN | PROMISE_F_REDIR; + } else if (sd->sd_state < G_RAID_SUBDISK_S_ACTIVE) { + meta->disks[pos].flags |= + PROMISE_F_ONLINE | PROMISE_F_REDIR; + } else + meta->disks[pos].flags |= PROMISE_F_ONLINE; if (pv->pv_meta != NULL) { - meta->disks[i].id = pv->pv_meta->disks[i].id; + meta->disks[pos].id = pv->pv_meta->disks[pos].id; } else { - arc4rand(&meta->disks[i].id, - sizeof(meta->disks[i].id), 0); + meta->disks[pos].number = i * 2; + arc4rand(&meta->disks[pos].id, + sizeof(meta->disks[pos].id), 0); } } promise_meta_put_name(meta, vol->v_name); @@ -1906,6 +1869,8 @@ g_raid_md_write_promise(struct g_raid_md disk = sd->sd_disk; if (disk == NULL) continue; + /* For RAID10 we need to translate order. */ + pos = promise_meta_translate_disk(vol, i); pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; for (j = 0; j < pd->pd_subdisks; j++) { if (pd->pd_meta[j]->volume_id == meta->volume_id) @@ -1916,16 +1881,23 @@ g_raid_md_write_promise(struct g_raid_md if (pd->pd_meta[j] != NULL) free(pd->pd_meta[j], M_MD_PROMISE); pd->pd_meta[j] = promise_meta_copy(meta); - pd->pd_meta[j]->disk = meta->disks[i]; + pd->pd_meta[j]->disk = meta->disks[pos]; + pd->pd_meta[j]->disk.number = pos; pd->pd_meta[j]->disk_offset = sd->sd_offset / 512; pd->pd_meta[j]->disk_sectors = sd->sd_size / 512; - pd->pd_meta[j]->rebuild_lba = sd->sd_rebuild_pos / 512; + if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) { + pd->pd_meta[j]->rebuild_lba = + sd->sd_rebuild_pos / 512; + } else + pd->pd_meta[j]->rebuild_lba = 0; pd->pd_updated = 1; } } TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; + if (disk->d_state != G_RAID_DISK_S_ACTIVE) + continue; if (!pd->pd_updated) continue; G_RAID_DEBUG(1, "Writing Promise metadata to %s", From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 21:56:39 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 795EE1065678; Fri, 18 Mar 2011 21:56:39 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6A9868FC1A; Fri, 18 Mar 2011 21:56:39 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ILudin081044; Fri, 18 Mar 2011 21:56:39 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ILudtd081042; Fri, 18 Mar 2011 21:56:39 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103182156.p2ILudtd081042@svn.freebsd.org> From: Alexander Motin Date: Fri, 18 Mar 2011 21:56:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219754 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 21:56:39 -0000 Author: mav Date: Fri Mar 18 21:56:39 2011 New Revision: 219754 URL: http://svn.freebsd.org/changeset/base/219754 Log: AMD RAID BIOS and Windows driver write some more values to metadata beyond range supported by ataraid(4) and Linux' dmraid. One of them is definitely 64bit per-volume rebuild/resync position. Another values look like specifying kind of activity. I am not sure about their full meaning, but looks like I can mimic behaviour good enough for BIOS to understand it. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Fri Mar 18 18:54:00 2011 (r219753) +++ projects/graid/head/sys/geom/raid/md_promise.c Fri Mar 18 21:56:39 2011 (r219754) @@ -117,7 +117,12 @@ struct promise_raid_conf { /* Subdisks in this volume. */ char name[32]; /* Volume label. */ - uint32_t filler2[338]; + uint32_t filler2[8]; + uint32_t magic_3; /* Something related to rebuild. */ + uint64_t rebuild_lba64; /* Per-volume rebuild position. */ + uint32_t magic_4; + uint32_t magic_5; + uint32_t filler3[325]; uint32_t checksum; } __packed; @@ -213,6 +218,10 @@ g_raid_md_promise_print(struct promise_r meta->disks[i].id); } printf("name <%.32s>\n", meta->name); + printf("magic_3 0x%08x\n", meta->magic_3); + printf("rebuild_lba64 %ju\n", meta->rebuild_lba64); + printf("magic_4 0x%08x\n", meta->magic_4); + printf("magic_5 0x%08x\n", meta->magic_5); printf("=================================================\n"); } @@ -637,7 +646,7 @@ nofit: sd->sd_rebuild_pos = 0; else { sd->sd_rebuild_pos = - pd->pd_meta[sdn]->rebuild_lba * 512; + (off_t)pd->pd_meta[sdn]->rebuild_lba * 512; } } else if (!(meta->disks[md_disk_pos].flags & PROMISE_F_ONLINE)) { /* Rebuilding disk. */ @@ -1753,7 +1762,8 @@ g_raid_md_write_promise(struct g_raid_md struct g_raid_md_promise_perdisk *pd; struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - int i, j, pos; + off_t rebuild_lba64; + int i, j, pos, rebuild; sc = md->mdo_softc; mdi = (struct g_raid_md_promise_object *)md; @@ -1800,10 +1810,10 @@ g_raid_md_write_promise(struct g_raid_md meta->generation = pv->pv_generation; meta->status = PROMISE_S_VALID | PROMISE_S_ONLINE | PROMISE_S_INITED | PROMISE_S_READY; - if (vol->v_state < G_RAID_VOLUME_S_OPTIMAL) + if (vol->v_state <= G_RAID_VOLUME_S_DEGRADED) meta->status |= PROMISE_S_DEGRADED; if (vol->v_dirty) - meta->status |= PROMISE_S_MARKED; + meta->status |= PROMISE_S_MARKED; /* XXX: INVENTED! */ if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0 || vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE) meta->type = PROMISE_T_RAID0; @@ -1834,6 +1844,8 @@ g_raid_md_write_promise(struct g_raid_md meta->volume_id = pv->pv_meta->volume_id; else arc4rand(&meta->volume_id, sizeof(meta->volume_id), 0); + rebuild_lba64 = UINT64_MAX; + rebuild = 0; for (i = 0; i < vol->v_disks_count; i++) { sd = &vol->v_subdisks[i]; /* For RAID10 we need to translate order. */ @@ -1845,11 +1857,26 @@ g_raid_md_write_promise(struct g_raid_md } else if (sd->sd_state == G_RAID_SUBDISK_S_FAILED) { meta->disks[pos].flags |= PROMISE_F_DOWN | PROMISE_F_REDIR; - } else if (sd->sd_state < G_RAID_SUBDISK_S_ACTIVE) { + } else if (sd->sd_state <= G_RAID_SUBDISK_S_REBUILD) { meta->disks[pos].flags |= PROMISE_F_ONLINE | PROMISE_F_REDIR; - } else + if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) { + rebuild_lba64 = min(rebuild_lba64, + sd->sd_rebuild_pos / 512); + } else + rebuild_lba64 = 0; + rebuild = 1; + } else { meta->disks[pos].flags |= PROMISE_F_ONLINE; + if (sd->sd_state < G_RAID_SUBDISK_S_ACTIVE) { + meta->status |= PROMISE_S_MARKED; + if (sd->sd_state == G_RAID_SUBDISK_S_RESYNC) { + rebuild_lba64 = min(rebuild_lba64, + sd->sd_rebuild_pos / 512); + } else + rebuild_lba64 = 0; + } + } if (pv->pv_meta != NULL) { meta->disks[pos].id = pv->pv_meta->disks[pos].id; } else { @@ -1859,6 +1886,28 @@ g_raid_md_write_promise(struct g_raid_md } } promise_meta_put_name(meta, vol->v_name); + + /* Try to mimic AMD BIOS rebuild/resync behavior. */ + if (rebuild_lba64 != UINT64_MAX) { + if (rebuild) + meta->magic_3 = 0x03040010UL; /* Rebuild? */ + else + meta->magic_3 = 0x03040008UL; /* Resync? */ + /* Translate from per-disk to per-volume LBA. */ + if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 || + vol->v_raid_level == G_RAID_VOLUME_RL_RAID1E) { + rebuild_lba64 *= meta->array_width; + } else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID3 || + vol->v_raid_level == G_RAID_VOLUME_RL_RAID5) { + rebuild_lba64 *= meta->array_width - 1; + } else + rebuild_lba64 = 0; + } else + meta->magic_3 = 0x03000000UL; + meta->rebuild_lba64 = rebuild_lba64; + meta->magic_4 = 0x04010101UL; + + /* Replace per-volume metadata with new. */ if (pv->pv_meta != NULL) free(pv->pv_meta, M_MD_PROMISE); pv->pv_meta = meta; @@ -1888,8 +1937,10 @@ g_raid_md_write_promise(struct g_raid_md if (sd->sd_state == G_RAID_SUBDISK_S_REBUILD) { pd->pd_meta[j]->rebuild_lba = sd->sd_rebuild_pos / 512; - } else + } else if (sd->sd_state < G_RAID_SUBDISK_S_REBUILD) pd->pd_meta[j]->rebuild_lba = 0; + else + pd->pd_meta[j]->rebuild_lba = UINT32_MAX; pd->pd_updated = 1; } } From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 22:30:48 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4DD5F106566B; Fri, 18 Mar 2011 22:30:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3E98E8FC19; Fri, 18 Mar 2011 22:30:48 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IMUl7c081856; Fri, 18 Mar 2011 22:30:47 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IMUlxf081854; Fri, 18 Mar 2011 22:30:47 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103182230.p2IMUlxf081854@svn.freebsd.org> From: Alexander Motin Date: Fri, 18 Mar 2011 22:30:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219755 - projects/graid/head/sbin/geom/class/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 22:30:48 -0000 Author: mav Date: Fri Mar 18 22:30:47 2011 New Revision: 219755 URL: http://svn.freebsd.org/changeset/base/219755 Log: Add point about Promise metadata format. Modified: projects/graid/head/sbin/geom/class/raid/graid.8 Modified: projects/graid/head/sbin/geom/class/raid/graid.8 ============================================================================== --- projects/graid/head/sbin/geom/class/raid/graid.8 Fri Mar 18 21:56:39 2011 (r219754) +++ projects/graid/head/sbin/geom/class/raid/graid.8 Fri Mar 18 22:30:47 2011 (r219755) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 13, 2011 +.Dd March 18, 2011 .Dt GRAID 8 .Os .Sh NAME @@ -214,6 +214,15 @@ Supports configurations: RAID0 (2+ disks RAID10 (4 disks), CONCAT (2+ disks). Configurations not supported by JMicron RAID BIOS, but enforceable on your own risk: RAID1 (3+ disks), RAID1E (3+ disks), RAID10 (6+ disks), RAID5 (3+ disks). +.It Promise +The format used by Promise and AMD/ATI RAID BIOSes and FreeBSD ataraid(4) +driver. +Supports multiple volumes per array. +Each disk can be split to be used by up to two arbitrary volumes. +Supports configurations: RAID0 (2+ disks), RAID1 (2 disks), +RAID5 (3+ disks), RAID10 (4 disks), SINGLE (1 disk), CONCAT (2+ disks). +Configurations not supported by RAID BIOSes, but enforceable on your +own risk: RAID1 (3+ disks), RAID10 (6+ disks). .It SiI The format used by SiliconImage RAID BIOS. Supports one volume per array. From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 22:55:33 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2A7C1106566B; Fri, 18 Mar 2011 22:55:33 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1B4AE8FC0C; Fri, 18 Mar 2011 22:55:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2IMtW4I082642; Fri, 18 Mar 2011 22:55:32 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2IMtWqW082640; Fri, 18 Mar 2011 22:55:32 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103182255.p2IMtWqW082640@svn.freebsd.org> From: Alexander Motin Date: Fri, 18 Mar 2011 22:55:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219759 - projects/graid/head/sbin/geom/class/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 22:55:33 -0000 Author: mav Date: Fri Mar 18 22:55:32 2011 New Revision: 219759 URL: http://svn.freebsd.org/changeset/base/219759 Log: Add warning about lack of RAID level migration support. Modified: projects/graid/head/sbin/geom/class/raid/graid.8 Modified: projects/graid/head/sbin/geom/class/raid/graid.8 ============================================================================== --- projects/graid/head/sbin/geom/class/raid/graid.8 Fri Mar 18 22:45:43 2011 (r219758) +++ projects/graid/head/sbin/geom/class/raid/graid.8 Fri Mar 18 22:55:32 2011 (r219759) @@ -104,7 +104,7 @@ argument specifies the on-disk metadata such as "Intel". The .Ar label -argument specifies teh label of the created volume. +argument specifies the label of the created volume. The .Ar level argument specifies the RAID level of the created volume, such as: @@ -236,6 +236,13 @@ The GEOM RAID class follows a modular de to be used. Support for the following RAID levels is currently implemented: RAID0, RAID1, RAID1E, RAID10, SINGLE, CONCAT. +.Sh RAID LEVEL MIGRATION +The GEOM RAID class has no support for RAID level migration, allowed by some +metadata formats. +If you started migration using BIOS or in some other way, make sure to +complete it there. +Do not run GEOM RAID class on migrating volumes under pain of possible data +corruption! .Sh EXIT STATUS Exit status is 0 on success, and non-zero if the command fails. .Sh SEE ALSO From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 23:48:06 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6448D1065672; Fri, 18 Mar 2011 23:48:06 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 536AD8FC14; Fri, 18 Mar 2011 23:48:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2INm6Jj083710; Fri, 18 Mar 2011 23:48:06 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2INm6Lq083701; Fri, 18 Mar 2011 23:48:06 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103182348.p2INm6Lq083701@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 18 Mar 2011 23:48:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219761 - in projects/altix/sys: dev/e1000 ia64/ia64 kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 23:48:06 -0000 Author: marcel Date: Fri Mar 18 23:48:06 2011 New Revision: 219761 URL: http://svn.freebsd.org/changeset/base/219761 Log: Merge svn+ssh://svn.freebsd.org/base/head@219760 Modified: projects/altix/sys/dev/e1000/e1000_82575.c projects/altix/sys/dev/e1000/e1000_82575.h projects/altix/sys/dev/e1000/e1000_defines.h projects/altix/sys/dev/e1000/e1000_phy.c projects/altix/sys/dev/e1000/if_em.c projects/altix/sys/dev/e1000/if_em.h projects/altix/sys/dev/e1000/if_igb.c projects/altix/sys/dev/e1000/if_igb.h projects/altix/sys/dev/e1000/if_lem.h projects/altix/sys/ia64/ia64/genassym.c projects/altix/sys/ia64/ia64/locore.S Directory Properties: projects/altix/lib/libstand/ (props changed) projects/altix/sys/ (props changed) projects/altix/sys/amd64/include/xen/ (props changed) projects/altix/sys/boot/i386/efi/ (props changed) projects/altix/sys/boot/ia64/efi/ (props changed) projects/altix/sys/boot/ia64/ski/ (props changed) projects/altix/sys/boot/powerpc/boot1.chrp/ (props changed) projects/altix/sys/boot/powerpc/ofw/ (props changed) projects/altix/sys/cddl/contrib/opensolaris/ (props changed) projects/altix/sys/conf/ (props changed) projects/altix/sys/contrib/dev/acpica/ (props changed) projects/altix/sys/contrib/octeon-sdk/ (props changed) projects/altix/sys/contrib/pf/ (props changed) projects/altix/sys/contrib/x86emu/ (props changed) projects/altix/sys/kern/subr_busdma.c (props changed) Modified: projects/altix/sys/dev/e1000/e1000_82575.c ============================================================================== --- projects/altix/sys/dev/e1000/e1000_82575.c Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/e1000_82575.c Fri Mar 18 23:48:06 2011 (r219761) @@ -36,7 +36,6 @@ * 82575EB Gigabit Network Connection * 82575EB Gigabit Backplane Connection * 82575GB Gigabit Network Connection - * 82575GB Gigabit Network Connection * 82576 Gigabit Network Connection * 82576 Quad Port Gigabit Mezzanine Adapter */ @@ -44,7 +43,6 @@ #include "e1000_api.h" static s32 e1000_init_phy_params_82575(struct e1000_hw *hw); -static s32 e1000_init_nvm_params_82575(struct e1000_hw *hw); static s32 e1000_init_mac_params_82575(struct e1000_hw *hw); static s32 e1000_acquire_phy_82575(struct e1000_hw *hw); static void e1000_release_phy_82575(struct e1000_hw *hw); @@ -197,12 +195,14 @@ static s32 e1000_init_phy_params_82575(s switch (phy->id) { case I347AT4_E_PHY_ID: case M88E1112_E_PHY_ID: + case M88E1340M_E_PHY_ID: case M88E1111_I_PHY_ID: phy->type = e1000_phy_m88; phy->ops.check_polarity = e1000_check_polarity_m88; phy->ops.get_info = e1000_get_phy_info_m88; if (phy->id == I347AT4_E_PHY_ID || - phy->id == M88E1112_E_PHY_ID) + phy->id == M88E1112_E_PHY_ID || + phy->id == M88E1340M_E_PHY_ID) phy->ops.get_cable_length = e1000_get_cable_length_m88_gen2; else phy->ops.get_cable_length = e1000_get_cable_length_m88; @@ -241,7 +241,7 @@ out: * e1000_init_nvm_params_82575 - Init NVM func ptrs. * @hw: pointer to the HW structure **/ -static s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) +s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) { struct e1000_nvm_info *nvm = &hw->nvm; u32 eecd = E1000_READ_REG(hw, E1000_EECD); @@ -258,7 +258,6 @@ static s32 e1000_init_nvm_params_82575(s size += NVM_WORD_SIZE_BASE_SHIFT; nvm->word_size = 1 << size; - nvm->opcode_bits = 8; nvm->delay_usec = 1; switch (nvm->override) { @@ -278,20 +277,23 @@ static s32 e1000_init_nvm_params_82575(s nvm->type = e1000_nvm_eeprom_spi; - if (nvm->word_size == (1 << 15)) { + if (nvm->word_size == (1 << 15)) nvm->page_size = 128; - } - /* Function Pointers */ - nvm->ops.acquire = e1000_acquire_nvm_82575; - if (nvm->word_size < (1 << 15)) { - nvm->ops.read = e1000_read_nvm_eerd; - } else { - nvm->ops.read = e1000_read_nvm_spi; - } - nvm->ops.release = e1000_release_nvm_82575; - nvm->ops.valid_led_default = e1000_valid_led_default_82575; + nvm->ops.acquire = e1000_acquire_nvm_82575; + nvm->ops.release = e1000_release_nvm_82575; + if (nvm->word_size < (1 << 15)) + nvm->ops.read = e1000_read_nvm_eerd; + else + nvm->ops.read = e1000_read_nvm_spi; + + nvm->ops.write = e1000_write_nvm_spi; + nvm->ops.validate = e1000_validate_nvm_checksum_generic; + nvm->ops.update = e1000_update_nvm_checksum_generic; + nvm->ops.valid_led_default = e1000_valid_led_default_82575; + + /* override genric family function pointers for specific descendants */ switch (hw->mac.type) { case e1000_82580: nvm->ops.validate = e1000_validate_nvm_checksum_82580; @@ -302,10 +304,8 @@ static s32 e1000_init_nvm_params_82575(s nvm->ops.update = e1000_update_nvm_checksum_i350; break; default: - nvm->ops.validate = e1000_validate_nvm_checksum_generic; - nvm->ops.update = e1000_update_nvm_checksum_generic; + break; } - nvm->ops.write = e1000_write_nvm_spi; return E1000_SUCCESS; } @@ -889,9 +889,7 @@ static s32 e1000_acquire_nvm_82575(struc ret_val = e1000_acquire_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); if (ret_val) goto out; - ret_val = e1000_acquire_nvm_generic(hw); - if (ret_val) e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); @@ -910,7 +908,6 @@ static void e1000_release_nvm_82575(stru { DEBUGFUNC("e1000_release_nvm_82575"); - e1000_release_nvm_generic(hw); e1000_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM); } @@ -1365,7 +1362,8 @@ static s32 e1000_setup_copper_link_82575 switch (hw->phy.type) { case e1000_phy_m88: if (hw->phy.id == I347AT4_E_PHY_ID || - hw->phy.id == M88E1112_E_PHY_ID) + hw->phy.id == M88E1112_E_PHY_ID || + hw->phy.id == M88E1340M_E_PHY_ID) ret_val = e1000_copper_link_setup_m88_gen2(hw); else ret_val = e1000_copper_link_setup_m88(hw); @@ -1840,7 +1838,6 @@ out: return ret_val; } - /** * e1000_vmdq_set_anti_spoofing_pf - enable or disable anti-spoofing * @hw: pointer to the hardware struct @@ -1986,7 +1983,7 @@ out: * e1000_reset_mdicnfg_82580 - Reset MDICNFG destination and com_mdio bits * @hw: pointer to the HW structure * - * This resets the MDICNFG.Destination and MDICNFG.Com_MDIO bits based on + * This resets the the MDICNFG.Destination and MDICNFG.Com_MDIO bits based on * the values found in the EEPROM. This addresses an issue in which these * bits are not restored from EEPROM after reset. **/ Modified: projects/altix/sys/dev/e1000/e1000_82575.h ============================================================================== --- projects/altix/sys/dev/e1000/e1000_82575.h Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/e1000_82575.h Fri Mar 18 23:48:06 2011 (r219761) @@ -469,6 +469,8 @@ struct e1000_adv_tx_context_desc { void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable); void e1000_vmdq_set_anti_spoofing_pf(struct e1000_hw *hw, bool enable, int pf); void e1000_vmdq_set_replication_pf(struct e1000_hw *hw, bool enable); +s32 e1000_init_nvm_params_82575(struct e1000_hw *hw); + enum e1000_promisc_type { e1000_promisc_disabled = 0, /* all promisc modes disabled */ e1000_promisc_unicast = 1, /* unicast promiscuous enabled */ Modified: projects/altix/sys/dev/e1000/e1000_defines.h ============================================================================== --- projects/altix/sys/dev/e1000/e1000_defines.h Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/e1000_defines.h Fri Mar 18 23:48:06 2011 (r219761) @@ -76,8 +76,8 @@ #define E1000_WUFC_FLX3 0x00080000 /* Flexible Filter 3 Enable */ #define E1000_WUFC_FLX4 0x00100000 /* Flexible Filter 4 Enable */ #define E1000_WUFC_FLX5 0x00200000 /* Flexible Filter 5 Enable */ -#define E1000_WUFC_FLX6 0x00400000 /* Flexible Filter 6 Enable */ -#define E1000_WUFC_FLX7 0x00800000 /* Flexible Filter 7 Enable */ +#define E1000_WUFC_FLX6 0x00400000 /* Flexible Filter 6 Enable */ +#define E1000_WUFC_FLX7 0x00800000 /* Flexible Filter 7 Enable */ #define E1000_WUFC_FW_RST 0x80000000 /* Wake on FW Reset Enable */ #define E1000_WUFC_ALL_FILTERS_PHY_4 0x0000F0FF /*Mask for all wakeup filters*/ #define E1000_WUFC_FLX_OFFSET_PHY 12 /* Offset to the Flexible Filters bits */ @@ -249,6 +249,7 @@ #define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */ #define E1000_RXD_SPC_CFI_SHIFT 12 +#define E1000_RXDEXT_STATERR_LB 0x00040000 #define E1000_RXDEXT_STATERR_CE 0x01000000 #define E1000_RXDEXT_STATERR_SE 0x02000000 #define E1000_RXDEXT_STATERR_SEQ 0x04000000 @@ -1478,7 +1479,8 @@ #define M88E1011_I_REV_4 0x04 #define M88E1111_I_PHY_ID 0x01410CC0 #define M88E1112_E_PHY_ID 0x01410C90 -#define I347AT4_E_PHY_ID 0x01410DC0 +#define I347AT4_E_PHY_ID 0x01410DC0 +#define M88E1340M_E_PHY_ID 0x01410DF0 #define GG82563_E_PHY_ID 0x01410CA0 #define IGP03E1000_E_PHY_ID 0x02A80390 #define IFE_E_PHY_ID 0x02A80330 @@ -1764,11 +1766,10 @@ #define E1000_RTTBCNRC_RF_INT_MASK \ (E1000_RTTBCNRC_RF_DEC_MASK << E1000_RTTBCNRC_RF_INT_SHIFT) - /* DMA Coalescing register fields */ #define E1000_DMACR_DMACWT_MASK 0x00003FFF /* DMA Coalescing * Watchdog Timer */ -#define E1000_DMACR_DMACTHR_MASK 0x00FF0000 /* DMA Coalescing Receive +#define E1000_DMACR_DMACTHR_MASK 0x00FF0000 /* DMA Coalescing Rx * Threshold */ #define E1000_DMACR_DMACTHR_SHIFT 16 #define E1000_DMACR_DMAC_LX_MASK 0x30000000 /* Lx when no PCIe @@ -1781,15 +1782,15 @@ #define E1000_DMCTLX_TTLX_MASK 0x00000FFF /* Time to LX request */ -#define E1000_DMCRTRH_UTRESH_MASK 0x0007FFFF /* Receive Traffic Rate +#define E1000_DMCRTRH_UTRESH_MASK 0x0007FFFF /* Rx Traffic Rate * Threshold */ -#define E1000_DMCRTRH_LRPRCW 0x80000000 /* Rcv packet rate in +#define E1000_DMCRTRH_LRPRCW 0x80000000 /* Rx packet rate in * current window */ -#define E1000_DMCCNT_CCOUNT_MASK 0x01FFFFFF /* DMA Coal Rcv Traffic +#define E1000_DMCCNT_CCOUNT_MASK 0x01FFFFFF /* DMA Coal Rx Traffic * Current Cnt */ -#define E1000_FCRTC_RTH_COAL_MASK 0x0003FFF0 /* Flow ctrl Rcv Threshold +#define E1000_FCRTC_RTH_COAL_MASK 0x0003FFF0 /* Flow ctrl Rx Threshold * High val */ #define E1000_FCRTC_RTH_COAL_SHIFT 4 #define E1000_PCIEMISC_LX_DECISION 0x00000080 /* Lx power decision based Modified: projects/altix/sys/dev/e1000/e1000_phy.c ============================================================================== --- projects/altix/sys/dev/e1000/e1000_phy.c Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/e1000_phy.c Fri Mar 18 23:48:06 2011 (r219761) @@ -255,10 +255,6 @@ s32 e1000_read_phy_reg_mdic(struct e1000 E1000_WRITE_REG(hw, E1000_MDIC, mdic); - /* Workaround for Si errata */ - if ((hw->phy.type == e1000_phy_82577) && (hw->revision_id <= 2)) - msec_delay(10); - /* * Poll the ready bit to see if the MDI read completed * Increasing the time out as testing showed failures with @@ -326,10 +322,6 @@ s32 e1000_write_phy_reg_mdic(struct e100 E1000_WRITE_REG(hw, E1000_MDIC, mdic); - /* Workaround for Si errata */ - if ((hw->phy.type == e1000_phy_82577) && (hw->revision_id <= 2)) - msec_delay(10); - /* * Poll the ready bit to see if the MDI read completed * Increasing the time out as testing showed failures with @@ -1656,6 +1648,7 @@ s32 e1000_phy_force_speed_duplex_m88(str if (!link) { if (hw->phy.type != e1000_phy_m88 || hw->phy.id == I347AT4_E_PHY_ID || + hw->phy.id == M88E1340M_E_PHY_ID || hw->phy.id == M88E1112_E_PHY_ID) { DEBUGOUT("Link taking longer than expected.\n"); } else { @@ -1683,6 +1676,7 @@ s32 e1000_phy_force_speed_duplex_m88(str if (hw->phy.type != e1000_phy_m88 || hw->phy.id == I347AT4_E_PHY_ID || + hw->phy.id == M88E1340M_E_PHY_ID || hw->phy.id == M88E1112_E_PHY_ID) goto out; @@ -2233,6 +2227,7 @@ s32 e1000_get_cable_length_m88_gen2(stru DEBUGFUNC("e1000_get_cable_length_m88_gen2"); switch (hw->phy.id) { + case M88E1340M_E_PHY_ID: case I347AT4_E_PHY_ID: /* Remember the original page select and set it to 7 */ ret_val = phy->ops.read_reg(hw, I347AT4_PAGE_SELECT, @@ -2787,6 +2782,7 @@ enum e1000_phy_type e1000_get_phy_type_f case M88E1011_I_PHY_ID: case I347AT4_E_PHY_ID: case M88E1112_E_PHY_ID: + case M88E1340M_E_PHY_ID: phy_type = e1000_phy_m88; break; case IGP01E1000_I_PHY_ID: /* IGP 1 & 2 share this */ Modified: projects/altix/sys/dev/e1000/if_em.c ============================================================================== --- projects/altix/sys/dev/e1000/if_em.c Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/if_em.c Fri Mar 18 23:48:06 2011 (r219761) @@ -93,7 +93,7 @@ int em_display_debug_stats = 0; /********************************************************************* * Driver version: *********************************************************************/ -char em_driver_version[] = "7.1.9"; +char em_driver_version[] = "7.2.2"; /********************************************************************* * PCI Device ID Table @@ -284,9 +284,7 @@ static void em_handle_tx(void *context, static void em_handle_rx(void *context, int pending); static void em_handle_link(void *context, int pending); -static void em_add_rx_process_limit(struct adapter *, const char *, - const char *, int *, int); -static void em_set_flow_cntrl(struct adapter *, const char *, +static void em_set_sysctl_value(struct adapter *, const char *, const char *, int *, int); static __inline void em_rx_discard(struct rx_ring *, int); @@ -365,6 +363,10 @@ TUNABLE_INT("hw.em.rx_process_limit", &e static int em_fc_setting = e1000_fc_full; TUNABLE_INT("hw.em.fc_setting", &em_fc_setting); +/* Energy efficient ethernet - default to OFF */ +static int eee_setting = 0; +TUNABLE_INT("hw.em.eee_setting", &eee_setting); + /* Global used in WOL setup with multiport cards */ static int global_quad_port_a = 0; @@ -433,12 +435,14 @@ static int em_attach(device_t dev) { struct adapter *adapter; + struct e1000_hw *hw; int error = 0; INIT_DEBUGOUT("em_attach: begin"); adapter = device_get_softc(dev); adapter->dev = adapter->osdep.dev = dev; + hw = &adapter->hw; EM_CORE_LOCK_INIT(adapter, device_get_nameunit(dev)); /* SYSCTL stuff */ @@ -470,11 +474,11 @@ em_attach(device_t dev) ** must happen after the MAC is ** identified */ - if ((adapter->hw.mac.type == e1000_ich8lan) || - (adapter->hw.mac.type == e1000_ich9lan) || - (adapter->hw.mac.type == e1000_ich10lan) || - (adapter->hw.mac.type == e1000_pchlan) || - (adapter->hw.mac.type == e1000_pch2lan)) { + if ((hw->mac.type == e1000_ich8lan) || + (hw->mac.type == e1000_ich9lan) || + (hw->mac.type == e1000_ich10lan) || + (hw->mac.type == e1000_pchlan) || + (hw->mac.type == e1000_pch2lan)) { int rid = EM_BAR_TYPE_FLASH; adapter->flash = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); @@ -484,7 +488,7 @@ em_attach(device_t dev) goto err_pci; } /* This is used in the shared code */ - adapter->hw.flash_address = (u8 *)adapter->flash; + hw->flash_address = (u8 *)adapter->flash; adapter->osdep.flash_bus_space_tag = rman_get_bustag(adapter->flash); adapter->osdep.flash_bus_space_handle = @@ -492,39 +496,39 @@ em_attach(device_t dev) } /* Do Shared Code initialization */ - if (e1000_setup_init_funcs(&adapter->hw, TRUE)) { + if (e1000_setup_init_funcs(hw, TRUE)) { device_printf(dev, "Setup of Shared code failed\n"); error = ENXIO; goto err_pci; } - e1000_get_bus_info(&adapter->hw); + e1000_get_bus_info(hw); /* Set up some sysctls for the tunable interrupt delays */ em_add_int_delay_sysctl(adapter, "rx_int_delay", "receive interrupt delay in usecs", &adapter->rx_int_delay, - E1000_REGISTER(&adapter->hw, E1000_RDTR), em_rx_int_delay_dflt); + E1000_REGISTER(hw, E1000_RDTR), em_rx_int_delay_dflt); em_add_int_delay_sysctl(adapter, "tx_int_delay", "transmit interrupt delay in usecs", &adapter->tx_int_delay, - E1000_REGISTER(&adapter->hw, E1000_TIDV), em_tx_int_delay_dflt); + E1000_REGISTER(hw, E1000_TIDV), em_tx_int_delay_dflt); em_add_int_delay_sysctl(adapter, "rx_abs_int_delay", "receive interrupt delay limit in usecs", &adapter->rx_abs_int_delay, - E1000_REGISTER(&adapter->hw, E1000_RADV), + E1000_REGISTER(hw, E1000_RADV), em_rx_abs_int_delay_dflt); em_add_int_delay_sysctl(adapter, "tx_abs_int_delay", "transmit interrupt delay limit in usecs", &adapter->tx_abs_int_delay, - E1000_REGISTER(&adapter->hw, E1000_TADV), + E1000_REGISTER(hw, E1000_TADV), em_tx_abs_int_delay_dflt); /* Sysctl for limiting the amount of work done in the taskqueue */ - em_add_rx_process_limit(adapter, "rx_processing_limit", + em_set_sysctl_value(adapter, "rx_processing_limit", "max number of rx packets to process", &adapter->rx_process_limit, em_rx_process_limit); /* Sysctl for setting the interface flow control */ - em_set_flow_cntrl(adapter, "flow_control", + em_set_sysctl_value(adapter, "flow_control", "configure flow control", &adapter->fc_setting, em_fc_setting); @@ -549,15 +553,15 @@ em_attach(device_t dev) } else adapter->num_rx_desc = em_rxd; - adapter->hw.mac.autoneg = DO_AUTO_NEG; - adapter->hw.phy.autoneg_wait_to_complete = FALSE; - adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT; + hw->mac.autoneg = DO_AUTO_NEG; + hw->phy.autoneg_wait_to_complete = FALSE; + hw->phy.autoneg_advertised = AUTONEG_ADV_DEFAULT; /* Copper options */ - if (adapter->hw.phy.media_type == e1000_media_type_copper) { - adapter->hw.phy.mdix = AUTO_ALL_MODES; - adapter->hw.phy.disable_polarity_correction = FALSE; - adapter->hw.phy.ms_type = EM_MASTER_SLAVE; + if (hw->phy.media_type == e1000_media_type_copper) { + hw->phy.mdix = AUTO_ALL_MODES; + hw->phy.disable_polarity_correction = FALSE; + hw->phy.ms_type = EM_MASTER_SLAVE; } /* @@ -571,7 +575,7 @@ em_attach(device_t dev) * This controls when hardware reports transmit completion * status. */ - adapter->hw.mac.report_tx_early = 1; + hw->mac.report_tx_early = 1; /* ** Get queue/ring memory @@ -591,25 +595,31 @@ em_attach(device_t dev) } /* Check SOL/IDER usage */ - if (e1000_check_reset_block(&adapter->hw)) + if (e1000_check_reset_block(hw)) device_printf(dev, "PHY reset is blocked" " due to SOL/IDER session.\n"); + /* Sysctl for setting Energy Efficient Ethernet */ + em_set_sysctl_value(adapter, "eee_control", + "enable Energy Efficient Ethernet", + &hw->dev_spec.ich8lan.eee_disable, eee_setting); + /* ** Start from a known state, this is ** important in reading the nvm and ** mac from that. */ - e1000_reset_hw(&adapter->hw); + e1000_reset_hw(hw); + /* Make sure we have a good EEPROM before we read from it */ - if (e1000_validate_nvm_checksum(&adapter->hw) < 0) { + if (e1000_validate_nvm_checksum(hw) < 0) { /* ** Some PCI-E parts fail the first check due to ** the link being in sleep state, call it again, ** if it fails a second time its a real issue. */ - if (e1000_validate_nvm_checksum(&adapter->hw) < 0) { + if (e1000_validate_nvm_checksum(hw) < 0) { device_printf(dev, "The EEPROM Checksum Is Not Valid\n"); error = EIO; @@ -618,14 +628,14 @@ em_attach(device_t dev) } /* Copy the permanent MAC address out of the EEPROM */ - if (e1000_read_mac_addr(&adapter->hw) < 0) { + if (e1000_read_mac_addr(hw) < 0) { device_printf(dev, "EEPROM read error while reading MAC" " address\n"); error = EIO; goto err_late; } - if (!em_is_valid_ether_addr(adapter->hw.mac.addr)) { + if (!em_is_valid_ether_addr(hw->mac.addr)) { device_printf(dev, "Invalid MAC address\n"); error = EIO; goto err_late; @@ -655,7 +665,7 @@ em_attach(device_t dev) /* Initialize statistics */ em_update_stats_counters(adapter); - adapter->hw.mac.get_link_status = 1; + hw->mac.get_link_status = 1; em_update_link_status(adapter); /* Register for VLAN events */ @@ -927,11 +937,10 @@ em_start_locked(struct ifnet *ifp, struc if (!adapter->link_active) return; - /* Call cleanup if number of TX descriptors low */ - if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD) - em_txeof(txr); - while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { + /* Call cleanup if number of TX descriptors low */ + if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD) + em_txeof(txr); if (txr->tx_avail < EM_MAX_SCATTER) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; @@ -1411,8 +1420,7 @@ em_poll(struct ifnet *ifp, enum poll_cmd if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - em_start_locked(ifp, txr); + em_start_locked(ifp, txr); #endif EM_TX_UNLOCK(txr); @@ -1475,24 +1483,20 @@ em_handle_que(void *context, int pending struct ifnet *ifp = adapter->ifp; struct tx_ring *txr = adapter->tx_rings; struct rx_ring *rxr = adapter->rx_rings; - bool more; if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - more = em_rxeof(rxr, adapter->rx_process_limit, NULL); - + bool more = em_rxeof(rxr, adapter->rx_process_limit, NULL); EM_TX_LOCK(txr); em_txeof(txr); #ifdef EM_MULTIQUEUE if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - em_start_locked(ifp, txr); + em_start_locked(ifp, txr); #endif - em_txeof(txr); EM_TX_UNLOCK(txr); - if (more) { + if (more || (ifp->if_drv_flags & IFF_DRV_OACTIVE)) { taskqueue_enqueue(adapter->tq, &adapter->que_task); return; } @@ -1601,10 +1605,8 @@ em_handle_tx(void *context, int pending) if (!drbr_empty(ifp, txr->br)) em_mq_start_locked(ifp, txr, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - em_start_locked(ifp, txr); + em_start_locked(ifp, txr); #endif - em_txeof(txr); E1000_WRITE_REG(&adapter->hw, E1000_IMS, txr->ims); EM_TX_UNLOCK(txr); } @@ -2179,6 +2181,7 @@ em_local_timer(void *arg) struct adapter *adapter = arg; struct ifnet *ifp = adapter->ifp; struct tx_ring *txr = adapter->tx_rings; + struct rx_ring *rxr = adapter->rx_rings; EM_CORE_LOCK_ASSERT(adapter); @@ -2190,6 +2193,13 @@ em_local_timer(void *arg) e1000_get_laa_state_82571(&adapter->hw)) e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); + /* trigger tq to refill rx ring queue if it is empty */ + for (int i = 0; i < adapter->num_queues; i++, rxr++) { + if (rxr->next_to_check == rxr->next_to_refresh) { + taskqueue_enqueue(rxr->tq, &rxr->rx_task); + } + } + /* ** Don't do TX watchdog check if we've been paused */ @@ -3730,17 +3740,17 @@ em_txeof(struct tx_ring *txr) txr->queue_status = EM_QUEUE_HUNG; /* - * If we have enough room, clear IFF_DRV_OACTIVE + * If we have a minimum free, clear IFF_DRV_OACTIVE * to tell the stack that it is OK to send packets. */ - if (txr->tx_avail > EM_TX_CLEANUP_THRESHOLD) { + if (txr->tx_avail > EM_MAX_SCATTER) ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - /* Disable watchdog if all clean */ - if (txr->tx_avail == adapter->num_tx_desc) { - txr->queue_status = EM_QUEUE_IDLE; - return (FALSE); - } - } + + /* Disable watchdog if all clean */ + if (txr->tx_avail == adapter->num_tx_desc) { + txr->queue_status = EM_QUEUE_IDLE; + return (FALSE); + } return (TRUE); } @@ -3758,11 +3768,19 @@ em_refresh_mbufs(struct rx_ring *rxr, in struct mbuf *m; bus_dma_segment_t segs[1]; struct em_buffer *rxbuf; - int i, error, nsegs, cleaned; + int i, j, error, nsegs; + bool cleaned = FALSE; + + i = j = rxr->next_to_refresh; + /* + ** Get one descriptor beyond + ** our work mark to control + ** the loop. + */ + if (++j == adapter->num_rx_desc) + j = 0; - i = rxr->next_to_refresh; - cleaned = -1; - while (i != limit) { + while (j != limit) { rxbuf = &rxr->rx_buffers[i]; if (rxbuf->m_head == NULL) { m = m_getjcl(M_DONTWAIT, MT_DATA, @@ -3796,21 +3814,22 @@ em_refresh_mbufs(struct rx_ring *rxr, in bus_dmamap_sync(rxr->rxtag, rxbuf->map, BUS_DMASYNC_PREREAD); rxr->rx_base[i].buffer_addr = htole64(segs[0].ds_addr); + cleaned = TRUE; - cleaned = i; - /* Calculate next index */ - if (++i == adapter->num_rx_desc) - i = 0; + i = j; /* Next is precalulated for us */ rxr->next_to_refresh = i; + /* Calculate next controlling index */ + if (++j == adapter->num_rx_desc) + j = 0; } update: /* ** Update the tail pointer only if, ** and as far as we have refreshed. */ - if (cleaned != -1) /* Update tail index */ + if (cleaned) E1000_WRITE_REG(&adapter->hw, - E1000_RDT(rxr->me), cleaned); + E1000_RDT(rxr->me), rxr->next_to_refresh); return; } @@ -3888,36 +3907,32 @@ em_setup_receive_ring(struct rx_ring *rx struct adapter *adapter = rxr->adapter; struct em_buffer *rxbuf; bus_dma_segment_t seg[1]; - int rsize, nsegs, error; + int i, j, nsegs, error; /* Clear the ring contents */ EM_RX_LOCK(rxr); - rsize = roundup2(adapter->num_rx_desc * - sizeof(struct e1000_rx_desc), EM_DBA_ALIGN); - bzero((void *)rxr->rx_base, rsize); - /* - ** Free current RX buffer structs and their mbufs - */ - for (int i = 0; i < adapter->num_rx_desc; i++) { - rxbuf = &rxr->rx_buffers[i]; - if (rxbuf->m_head != NULL) { - bus_dmamap_sync(rxr->rxtag, rxbuf->map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(rxr->rxtag, rxbuf->map); - m_freem(rxbuf->m_head); - } + /* Invalidate all descriptors */ + for (i = 0; i < adapter->num_rx_desc; i++) { + struct e1000_rx_desc* cur; + cur = &rxr->rx_base[i]; + cur->status = 0; } /* Now replenish the mbufs */ - for (int j = 0; j != adapter->num_rx_desc; ++j) { + i = j = rxr->next_to_refresh; + if (++j == adapter->num_rx_desc) + j = 0; - rxbuf = &rxr->rx_buffers[j]; + while(j != rxr->next_to_check) { + rxbuf = &rxr->rx_buffers[i]; rxbuf->m_head = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz); - if (rxbuf->m_head == NULL) - return (ENOBUFS); + if (rxbuf->m_head == NULL) { + error = ENOBUFS; + goto fail; + } rxbuf->m_head->m_len = adapter->rx_mbuf_sz; rxbuf->m_head->m_flags &= ~M_HASFCS; /* we strip it */ rxbuf->m_head->m_pkthdr.len = adapter->rx_mbuf_sz; @@ -3929,25 +3944,24 @@ em_setup_receive_ring(struct rx_ring *rx if (error != 0) { m_freem(rxbuf->m_head); rxbuf->m_head = NULL; - return (error); + goto fail; } bus_dmamap_sync(rxr->rxtag, rxbuf->map, BUS_DMASYNC_PREREAD); /* Update descriptor */ - rxr->rx_base[j].buffer_addr = htole64(seg[0].ds_addr); + rxr->rx_base[i].buffer_addr = htole64(seg[0].ds_addr); + i = j; + if (++j == adapter->num_rx_desc) + j = 0; } - - /* Setup our descriptor indices */ - rxr->next_to_check = 0; - rxr->next_to_refresh = 0; - +fail: + rxr->next_to_refresh = i; bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - EM_RX_UNLOCK(rxr); - return (0); + return (error); } /********************************************************************* @@ -3959,9 +3973,9 @@ static int em_setup_receive_structures(struct adapter *adapter) { struct rx_ring *rxr = adapter->rx_rings; - int j; + int q; - for (j = 0; j < adapter->num_queues; j++, rxr++) + for (q = 0; q < adapter->num_queues; q++, rxr++) if (em_setup_receive_ring(rxr)) goto fail; @@ -3970,11 +3984,12 @@ fail: /* * Free RX buffers allocated so far, we will only handle * the rings that completed, the failing case will have - * cleaned up for itself. 'j' failed, so its the terminus. + * cleaned up for itself. 'q' failed, so its the terminus. */ - for (int i = 0; i < j; ++i) { + for (int i = 0, n = 0; i < q; ++i) { rxr = &adapter->rx_rings[i]; - for (int n = 0; n < adapter->num_rx_desc; n++) { + n = rxr->next_to_check; + while(n != rxr->next_to_refresh) { struct em_buffer *rxbuf; rxbuf = &rxr->rx_buffers[n]; if (rxbuf->m_head != NULL) { @@ -3984,7 +3999,11 @@ fail: m_freem(rxbuf->m_head); rxbuf->m_head = NULL; } + if (++n == adapter->num_rx_desc) + n = 0; } + rxr->next_to_check = 0; + rxr->next_to_refresh = 0; } return (ENOBUFS); @@ -4025,7 +4044,8 @@ em_free_receive_buffers(struct rx_ring * INIT_DEBUGOUT("free_receive_buffers: begin"); if (rxr->rx_buffers != NULL) { - for (int i = 0; i < adapter->num_rx_desc; i++) { + int i = rxr->next_to_check; + while(i != rxr->next_to_refresh) { rxbuf = &rxr->rx_buffers[i]; if (rxbuf->map != NULL) { bus_dmamap_sync(rxr->rxtag, rxbuf->map, @@ -4037,9 +4057,13 @@ em_free_receive_buffers(struct rx_ring * m_freem(rxbuf->m_head); rxbuf->m_head = NULL; } + if (++i == adapter->num_rx_desc) + i = 0; } free(rxr->rx_buffers, M_DEVBUF); rxr->rx_buffers = NULL; + rxr->next_to_check = 0; + rxr->next_to_refresh = 0; } if (rxr->rxtag != NULL) { @@ -4122,8 +4146,8 @@ em_initialize_receive_unit(struct adapte E1000_WRITE_REG(hw, E1000_RDBAH(i), (u32)(bus_addr >> 32)); E1000_WRITE_REG(hw, E1000_RDBAL(i), (u32)bus_addr); /* Setup the Head and Tail Descriptor Pointers */ - E1000_WRITE_REG(hw, E1000_RDH(i), 0); - E1000_WRITE_REG(hw, E1000_RDT(i), adapter->num_rx_desc - 1); + E1000_WRITE_REG(hw, E1000_RDH(i), rxr->next_to_check); + E1000_WRITE_REG(hw, E1000_RDT(i), rxr->next_to_refresh); } /* Set early receive threshold on appropriate hw */ @@ -4303,7 +4327,8 @@ next_desc: } /* Catch any remaining refresh work */ - em_refresh_mbufs(rxr, i); + if (processed != 0 || i == rxr->next_to_refresh) + em_refresh_mbufs(rxr, i); rxr->next_to_check = i; if (done != NULL) @@ -4743,10 +4768,8 @@ em_enable_wakeup(device_t dev) if ((adapter->hw.mac.type == e1000_ich8lan) || (adapter->hw.mac.type == e1000_pchlan) || (adapter->hw.mac.type == e1000_ich9lan) || - (adapter->hw.mac.type == e1000_ich10lan)) { + (adapter->hw.mac.type == e1000_ich10lan)) e1000_disable_gig_wol_ich8lan(&adapter->hw); - e1000_hv_phy_powerdown_workaround_ich8lan(&adapter->hw); - } /* Keep the laser running on Fiber adapters */ if (adapter->hw.phy.media_type == e1000_media_type_fiber || @@ -5442,17 +5465,7 @@ em_add_int_delay_sysctl(struct adapter * } static void -em_add_rx_process_limit(struct adapter *adapter, const char *name, - const char *description, int *limit, int value) -{ - *limit = value; - SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)), - OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, limit, value, description); -} - -static void -em_set_flow_cntrl(struct adapter *adapter, const char *name, +em_set_sysctl_value(struct adapter *adapter, const char *name, const char *description, int *limit, int value) { *limit = value; Modified: projects/altix/sys/dev/e1000/if_em.h ============================================================================== --- projects/altix/sys/dev/e1000/if_em.h Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/if_em.h Fri Mar 18 23:48:06 2011 (r219761) @@ -212,6 +212,10 @@ #define EM_BAR_MEM_TYPE_64BIT 0x00000004 #define EM_MSIX_BAR 3 /* On 82575 */ +#if !defined(SYSTCL_ADD_UQUAD) +#define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD +#endif + /* Defines for printing debug information */ #define DEBUG_INIT 0 #define DEBUG_IOCTL 0 Modified: projects/altix/sys/dev/e1000/if_igb.c ============================================================================== --- projects/altix/sys/dev/e1000/if_igb.c Fri Mar 18 22:56:53 2011 (r219760) +++ projects/altix/sys/dev/e1000/if_igb.c Fri Mar 18 23:48:06 2011 (r219761) @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2011, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -99,7 +99,7 @@ int igb_display_debug_stats = 0; /********************************************************************* * Driver version: *********************************************************************/ -char igb_driver_version[] = "version - 2.1.4"; +char igb_driver_version[] = "version - 2.1.7"; /********************************************************************* @@ -255,14 +255,13 @@ static void igb_enable_wakeup(device static void igb_led_func(void *, int); static int igb_irq_fast(void *); -static void igb_add_rx_process_limit(struct adapter *, const char *, - const char *, int *, int); +static void igb_msix_que(void *); +static void igb_msix_link(void *); static void igb_handle_que(void *context, int pending); static void igb_handle_link(void *context, int pending); -/* These are MSIX only irq handlers */ -static void igb_msix_que(void *); -static void igb_msix_link(void *); +static void igb_set_sysctl_value(struct adapter *, const char *, + const char *, int *, int); #ifdef DEVICE_POLLING static poll_handler_t igb_poll; @@ -350,6 +349,17 @@ TUNABLE_INT("hw.igb.rx_process_limit", & static int igb_fc_setting = e1000_fc_full; TUNABLE_INT("hw.igb.fc_setting", &igb_fc_setting); +/* Energy Efficient Ethernet - default to off */ +static int igb_eee_setting = FALSE; +TUNABLE_INT("hw.igb.ee_setting", &igb_eee_setting); + +/* +** DMA Coalescing, only for i350 - default to off, +** this feature is for power savings +*/ +static int igb_dma_coalesce = FALSE; +TUNABLE_INT("hw.igb.dma_coalesce", &igb_dma_coalesce); + /********************************************************************* * Device identification routine * @@ -430,11 +440,6 @@ igb_attach(device_t dev) OID_AUTO, "nvm", CTLTYPE_INT|CTLFLAG_RW, adapter, 0, igb_sysctl_nvm_info, "I", "NVM Information"); - SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)), - OID_AUTO, "flow_control", CTLTYPE_INT|CTLFLAG_RW, - &igb_fc_setting, 0, "Flow Control"); - SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "enable_aim", CTLTYPE_INT|CTLFLAG_RW, @@ -461,11 +466,16 @@ igb_attach(device_t dev) e1000_get_bus_info(&adapter->hw); - /* Sysctls for limiting the amount of work done in the taskqueue */ - igb_add_rx_process_limit(adapter, "rx_processing_limit", + /* Sysctl for limiting the amount of work done in the taskqueue */ + igb_set_sysctl_value(adapter, "rx_processing_limit", "max number of rx packets to process", &adapter->rx_process_limit, igb_rx_process_limit); + /* Sysctl for setting the interface flow control */ + igb_set_sysctl_value(adapter, "flow_control", + "configure flow control", + &adapter->fc_setting, igb_fc_setting); + /* * Validate number of transmit and receive descriptors. It * must not exceed hardware maximum, and must be multiple @@ -537,6 +547,18 @@ igb_attach(device_t dev) goto err_late; } + /* Some adapter-specific advanced features */ + if (adapter->hw.mac.type >= e1000_i350) { + igb_set_sysctl_value(adapter, "dma_coalesce", + "configure dma coalesce", + &adapter->dma_coalesce, igb_dma_coalesce); + igb_set_sysctl_value(adapter, "eee_control", + "enable Energy Efficient Ethernet", + &adapter->hw.dev_spec._82575.eee_disable, + igb_eee_setting); + e1000_set_eee_i350(&adapter->hw); + } + /* ** Start from a known state, this is ** important in reading the nvm and @@ -1436,6 +1458,10 @@ igb_msix_que(void *arg) more_tx = igb_txeof(txr); IGB_TX_UNLOCK(txr); + /* If RX ring is depleted do refresh first */ + if (rxr->next_to_check == rxr->next_to_refresh) + igb_refresh_mbufs(rxr, rxr->next_to_check); + more_rx = igb_rxeof(que, adapter->rx_process_limit, NULL); if (igb_enable_aim == FALSE) @@ -1938,7 +1964,7 @@ igb_local_timer(void *arg) out: callout_reset(&adapter->timer, hz, igb_local_timer, adapter); #ifndef DEVICE_POLLING - /* Fire off all queue interrupts - deadlock protection */ + /* Schedule all queue interrupts - deadlock protection */ E1000_WRITE_REG(&adapter->hw, E1000_EICS, adapter->que_mask); #endif return; @@ -1963,7 +1989,9 @@ igb_update_link_status(struct adapter *a struct ifnet *ifp = adapter->ifp; device_t dev = adapter->dev; *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Mar 18 23:55:26 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 09EEB1065670; Fri, 18 Mar 2011 23:55:26 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EEB6C8FC1B; Fri, 18 Mar 2011 23:55:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2INtP1W083907; Fri, 18 Mar 2011 23:55:25 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2INtP0J083905; Fri, 18 Mar 2011 23:55:25 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201103182355.p2INtP0J083905@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 18 Mar 2011 23:55:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219762 - projects/altix/sys/ia64/ia64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Mar 2011 23:55:26 -0000 Author: marcel Date: Fri Mar 18 23:55:25 2011 New Revision: 219762 URL: http://svn.freebsd.org/changeset/base/219762 Log: Fix merge botch. Modified: projects/altix/sys/ia64/ia64/genassym.c Modified: projects/altix/sys/ia64/ia64/genassym.c ============================================================================== --- projects/altix/sys/ia64/ia64/genassym.c Fri Mar 18 23:48:06 2011 (r219761) +++ projects/altix/sys/ia64/ia64/genassym.c Fri Mar 18 23:55:25 2011 (r219762) @@ -82,11 +82,6 @@ ASSYM(IA64_PBVM_PAGE_SHIFT, IA64_PBVM_PA ASSYM(IA64_PBVM_PGTBL, IA64_PBVM_PGTBL); ASSYM(IA64_PBVM_RR, IA64_PBVM_RR); -ASSYM(IA64_PBVM_BASE, IA64_PBVM_BASE); -ASSYM(IA64_PBVM_PAGE_SHIFT, IA64_PBVM_PAGE_SHIFT); -ASSYM(IA64_PBVM_PGTBL, IA64_PBVM_PGTBL); -ASSYM(IA64_PBVM_RR, IA64_PBVM_RR); - ASSYM(KSTACK_PAGES, KSTACK_PAGES); ASSYM(MC_PRESERVED, offsetof(mcontext_t, mc_preserved)); From owner-svn-src-projects@FreeBSD.ORG Sat Mar 19 14:44:25 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C3DAD106567B; Sat, 19 Mar 2011 14:44:24 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9A5F98FC1F; Sat, 19 Mar 2011 14:44:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2JEiOud026056; Sat, 19 Mar 2011 14:44:24 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2JEiO92026053; Sat, 19 Mar 2011 14:44:24 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103191444.p2JEiO92026053@svn.freebsd.org> From: Alexander Motin Date: Sat, 19 Mar 2011 14:44:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219774 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Mar 2011 14:44:25 -0000 Author: mav Date: Sat Mar 19 14:44:24 2011 New Revision: 219774 URL: http://svn.freebsd.org/changeset/base/219774 Log: Make `graid delete` command interpret optional num argument as volume ID, used in `raid/rX` provider names, instead of internal position in metadata. It seems better to not introduce new number without a reason. This fixes `graid delete` for Promise. Modified: projects/graid/head/sys/geom/raid/md_intel.c projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_intel.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_intel.c Sat Mar 19 14:38:28 2011 (r219773) +++ projects/graid/head/sys/geom/raid/md_intel.c Sat Mar 19 14:44:24 2011 (r219774) @@ -1803,7 +1803,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj i = strtol(volname, &tmp, 10); if (verb != volname && tmp[0] == 0) { TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { - if ((intptr_t)vol->v_md_data == i) + if (vol->v_global_id == i) break; } } Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 14:38:28 2011 (r219773) +++ projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 14:44:24 2011 (r219774) @@ -1570,7 +1570,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o i = strtol(volname, &tmp, 10); if (verb != volname && tmp[0] == 0) { TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { - if ((intptr_t)vol->v_md_data == i) + if (vol->v_global_id == i) break; } } From owner-svn-src-projects@FreeBSD.ORG Sat Mar 19 17:14:07 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7A3DE1065672; Sat, 19 Mar 2011 17:14:07 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 62EF48FC1B; Sat, 19 Mar 2011 17:14:07 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2JHE6nK029425; Sat, 19 Mar 2011 17:14:06 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2JHE6oa029423; Sat, 19 Mar 2011 17:14:06 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103191714.p2JHE6oa029423@svn.freebsd.org> From: Alexander Motin Date: Sat, 19 Mar 2011 17:14:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219777 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Mar 2011 17:14:07 -0000 Author: mav Date: Sat Mar 19 17:14:06 2011 New Revision: 219777 URL: http://svn.freebsd.org/changeset/base/219777 Log: Implement simple `graid label` for now, supporting only one volume per disk. Correctly implement metadata erasing. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 16:52:06 2011 (r219776) +++ projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 17:14:06 2011 (r219777) @@ -395,16 +395,18 @@ promise_meta_erase(struct g_consumer *cp { struct g_provider *pp; char *buf; - int error; + int error, subdisk; pp = cp->provider; - buf = malloc(pp->sectorsize, M_MD_PROMISE, M_WAITOK | M_ZERO); - error = g_write_data(cp, - pp->mediasize - 2 * pp->sectorsize, - buf, pp->sectorsize); - if (error != 0) { - G_RAID_DEBUG(1, "Cannot erase metadata on %s (error=%d).", - pp->name, error); + buf = malloc(4 * pp->sectorsize, M_MD_PROMISE, M_WAITOK | M_ZERO); + for (subdisk = 0; subdisk < PROMISE_MAX_SUBDISKS; subdisk++) { + error = g_write_data(cp, pp->mediasize - pp->sectorsize * + (63 - subdisk * PROMISE_META_OFFSET), + buf, 4 * pp->sectorsize); + if (error != 0) { + G_RAID_DEBUG(1, "Cannot erase metadata on %s (error=%d).", + pp->name, error); + } } free(buf, M_MD_PROMISE); return (error); @@ -934,13 +936,27 @@ static int g_raid_md_create_promise(struct g_raid_md_object *md, struct g_class *mp, struct g_geom **gp) { + struct g_geom *geom; struct g_raid_softc *sc; - struct g_raid_md_promise_object *mdi; - char name[16]; - mdi = (struct g_raid_md_promise_object *)md; - snprintf(name, sizeof(name), "Promise"); - sc = g_raid_create_node(mp, name, md); + /* Search for existing node. */ + LIST_FOREACH(geom, &mp->geom, geom) { + sc = geom->softc; + if (sc == NULL) + continue; + if (sc->sc_stopping != 0) + continue; + if (sc->sc_md->mdo_class != md->mdo_class) + continue; + break; + } + if (geom != NULL) { + *gp = geom; + return (G_RAID_MD_TASTE_EXISTING); + } + + /* Create new one if not found. */ + sc = g_raid_create_node(mp, "Promise", md); if (sc == NULL) return (G_RAID_MD_TASTE_FAIL); md->mdo_softc = sc; @@ -1137,9 +1153,10 @@ g_raid_md_ctl_promise(struct g_raid_md_o struct g_raid_softc *sc; struct g_raid_volume *vol, *vol1; struct g_raid_subdisk *sd; - struct g_raid_disk *disk; + struct g_raid_disk *disk, *disks[PROMISE_MAX_DISKS]; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd; + struct g_raid_md_promise_pervolume *pv; struct g_consumer *cp; struct g_provider *pp; char arg[16]; @@ -1189,6 +1206,7 @@ g_raid_md_ctl_promise(struct g_raid_md_o /* Search for disks, connect them and probe. */ size = 0x7fffffffffffffffllu; sectorsize = 0; + bzero(disks, sizeof(disks)); for (i = 0; i < numdisks; i++) { snprintf(arg, sizeof(arg), "arg%d", i + 3); diskname = gctl_get_asciiparam(req, arg); @@ -1197,31 +1215,23 @@ g_raid_md_ctl_promise(struct g_raid_md_o error = -6; break; } - if (strcmp(diskname, "NONE") == 0) { - cp = NULL; - pp = NULL; - } else { - g_topology_lock(); - cp = g_raid_open_consumer(sc, diskname); - if (cp == NULL) { - gctl_error(req, "Can't open disk '%s'.", - diskname); - g_topology_unlock(); - error = -4; - break; - } - pp = cp->provider; + if (strcmp(diskname, "NONE") == 0) + continue; + g_topology_lock(); + cp = g_raid_open_consumer(sc, diskname); + if (cp == NULL) { + gctl_error(req, "Can't open disk '%s'.", + diskname); + g_topology_unlock(); + error = -4; + break; } + pp = cp->provider; pd = malloc(sizeof(*pd), M_MD_PROMISE, M_WAITOK | M_ZERO); -// pd->pd_disk_pos = i; disk = g_raid_create_disk(sc); disk->d_md_data = (void *)pd; disk->d_consumer = cp; - if (cp == NULL) { -// pd->pd_disk_meta.id = 0xffffffff; -// pd->pd_disk_meta.flags = PROMISE_F_ASSIGNED; - continue; - } + disks[i] = disk; cp->private = disk; g_topology_unlock(); @@ -1235,19 +1245,17 @@ g_raid_md_ctl_promise(struct g_raid_md_o "Dumping not supported by %s.", cp->provider->name); -// pd->pd_disk_meta.sectors = pp->mediasize / pp->sectorsize; if (size > pp->mediasize) size = pp->mediasize; if (sectorsize < pp->sectorsize) sectorsize = pp->sectorsize; -// pd->pd_disk_meta.id = 0; -// pd->pd_disk_meta.flags = PROMISE_F_ASSIGNED | PROMISE_F_ONLINE; } if (error != 0) return (error); /* Reserve some space for metadata. */ - size -= ((4096 + sectorsize - 1) / sectorsize) * sectorsize; + size -= size % (63 * sectorsize); + size -= 63 * sectorsize; /* Handle size argument. */ len = sizeof(*sizearg); @@ -1276,10 +1284,6 @@ g_raid_md_ctl_promise(struct g_raid_md_o gctl_error(req, "Incorrect strip size."); return (-11); } - if (strip > 65535 * sectorsize) { - gctl_error(req, "Strip size too big."); - return (-12); - } strip = *striparg; } @@ -1301,18 +1305,24 @@ g_raid_md_ctl_promise(struct g_raid_md_o } /* We have all we need, create things: volume, ... */ - mdi->mdio_started = 1; + pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO); + arc4rand(&pv->pv_id, sizeof(pv->pv_id), 0); + pv->pv_generation = 0; + pv->pv_started = 1; vol = g_raid_create_volume(sc, volname); - vol->v_md_data = (void *)(intptr_t)0; + vol->v_md_data = pv; vol->v_raid_level = level; vol->v_raid_level_qualifier = G_RAID_VOLUME_RLQ_NONE; vol->v_strip_size = strip; vol->v_disks_count = numdisks; - if (level == G_RAID_VOLUME_RL_RAID0) + if (level == G_RAID_VOLUME_RL_RAID0 || + level == G_RAID_VOLUME_RL_CONCAT || + level == G_RAID_VOLUME_RL_SINGLE) vol->v_mediasize = size * numdisks; else if (level == G_RAID_VOLUME_RL_RAID1) vol->v_mediasize = size; - else if (level == G_RAID_VOLUME_RL_RAID5) + else if (level == G_RAID_VOLUME_RL_RAID3 || + level == G_RAID_VOLUME_RL_RAID5) vol->v_mediasize = size * (numdisks - 1); else { /* RAID1E */ vol->v_mediasize = ((size * numdisks) / strip / 2) * @@ -1322,10 +1332,10 @@ g_raid_md_ctl_promise(struct g_raid_md_o g_raid_start_volume(vol); /* , and subdisks. */ -#if 0 - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + for (i = 0; i < numdisks; i++) { + disk = disks[i]; pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - sd = &vol->v_subdisks[pd->pd_disk_pos]; + sd = &vol->v_subdisks[i]; sd->sd_disk = disk; sd->sd_offset = 0; sd->sd_size = size; @@ -1341,7 +1351,6 @@ g_raid_md_ctl_promise(struct g_raid_md_o g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); } } -#endif /* Write metadata based on created entities. */ G_RAID_DEBUG1(0, sc, "Array started."); @@ -1776,11 +1785,13 @@ g_raid_md_write_promise(struct g_raid_md pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; pd->pd_updated = 0; - for (i = 0; i < pd->pd_subdisks; i++) { + for (i = 0; i < pd->pd_subdisks; ) { vol = g_raid_md_promise_get_volume(sc, pd->pd_meta[i]->volume_id); - if (vol != NULL && !vol->v_stopping) + if (vol != NULL && !vol->v_stopping) { + i++; continue; + } free(pd->pd_meta[i], M_MD_PROMISE); for (j = i; j < pd->pd_subdisks - 1; j++) pd->pd_meta[j] = pd->pd_meta[j + 1]; @@ -1840,10 +1851,7 @@ g_raid_md_write_promise(struct g_raid_md meta->cylinders = meta->total_sectors / (255 * 63) - 1; meta->heads = 254; meta->sectors = 63; - if (pv->pv_meta != NULL) - meta->volume_id = pv->pv_meta->volume_id; - else - arc4rand(&meta->volume_id, sizeof(meta->volume_id), 0); + meta->volume_id = pv->pv_id; rebuild_lba64 = UINT64_MAX; rebuild = 0; for (i = 0; i < vol->v_disks_count; i++) { From owner-svn-src-projects@FreeBSD.ORG Sat Mar 19 18:26:54 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A2F3E106566B; Sat, 19 Mar 2011 18:26:54 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7F0FF8FC20; Sat, 19 Mar 2011 18:26:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2JIQsiO031382; Sat, 19 Mar 2011 18:26:54 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2JIQsYH031380; Sat, 19 Mar 2011 18:26:54 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103191826.p2JIQsYH031380@svn.freebsd.org> From: Alexander Motin Date: Sat, 19 Mar 2011 18:26:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219778 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Mar 2011 18:26:54 -0000 Author: mav Date: Sat Mar 19 18:26:54 2011 New Revision: 219778 URL: http://svn.freebsd.org/changeset/base/219778 Log: Make metadata writing respect all arguments to not touch unrelated drives. Improve marking disk as failed by attempting write flags to disk itself. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 17:14:06 2011 (r219777) +++ projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 18:26:54 2011 (r219778) @@ -1805,8 +1805,20 @@ g_raid_md_write_promise(struct g_raid_md TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) { if (vol->v_stopping) continue; + + /* Skip volumes not related to specified targets. */ if (tvol != NULL && vol != tvol) continue; + if (tsd != NULL && vol != tsd->sd_volume) + continue; + if (tdisk != NULL) { + for (i = 0; i < vol->v_disks_count; i++) { + if (vol->v_subdisks[i].sd_disk == tdisk) + break; + } + if (i >= vol->v_disks_count) + continue; + } pv = (struct g_raid_md_promise_pervolume *)vol->v_md_data; pv->pv_generation++; @@ -1978,26 +1990,36 @@ g_raid_md_fail_disk_promise(struct g_rai struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd; struct g_raid_subdisk *sd; + int i, pos; sc = md->mdo_softc; mdi = (struct g_raid_md_promise_object *)md; pd = (struct g_raid_md_promise_perdisk *)tdisk->d_md_data; /* We can't fail disk that is not a part of array now. */ -// if (pd->pd_disk_pos < 0) -// return (-1); + if (tdisk->d_state != G_RAID_DISK_S_ACTIVE) + return (-1); /* * Mark disk as failed in metadata and try to write that metadata * to the disk itself to prevent it's later resurrection as STALE. */ -#if 0 - mdi->mdio_meta->disk[pd->pd_disk_pos].flags = PROMISE_F_FAILED; - pd->pd_disk_meta.flags = PROMISE_F_FAILED; - g_raid_md_promise_print(mdi->mdio_meta); - if (tdisk->d_consumer) - promise_meta_write(tdisk->d_consumer, mdi->mdio_meta); -#endif + if (pd->pd_subdisks > 0 && tdisk->d_consumer != NULL) + G_RAID_DEBUG(1, "Writing Promise metadata to %s", + g_raid_get_diskname(tdisk)); + for (i = 0; i < pd->pd_subdisks; i++) { + pd->pd_meta[i]->disk.flags |= + PROMISE_F_DOWN | PROMISE_F_REDIR; + pos = pd->pd_meta[i]->disk.number; + if (pos >= 0 && pos < PROMISE_MAX_DISKS) { + pd->pd_meta[i]->disks[pos].flags |= + PROMISE_F_DOWN | PROMISE_F_REDIR; + } + g_raid_md_promise_print(pd->pd_meta[i]); + } + if (tdisk->d_consumer != NULL) + promise_meta_write(tdisk->d_consumer, + pd->pd_meta, pd->pd_subdisks); /* Change states. */ g_raid_change_disk_state(tdisk, G_RAID_DISK_S_FAILED); From owner-svn-src-projects@FreeBSD.ORG Sat Mar 19 19:58:09 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9B2E4106564A; Sat, 19 Mar 2011 19:58:09 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 91AC68FC13; Sat, 19 Mar 2011 19:58:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2JJw9dI033417; Sat, 19 Mar 2011 19:58:09 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2JJw9JS033416; Sat, 19 Mar 2011 19:58:09 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103191958.p2JJw9JS033416@svn.freebsd.org> From: Alexander Motin Date: Sat, 19 Mar 2011 19:58:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219784 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Mar 2011 19:58:09 -0000 Author: mav Date: Sat Mar 19 19:58:09 2011 New Revision: 219784 URL: http://svn.freebsd.org/changeset/base/219784 Log: Do not use disks in G_RAID_DISK_S_OFFLINE state for keeping places. It works fine for other formats, but for Promise in most it is impossible to say how many disks are missing, so the whole idea of placeholders is not applicable. Modified: projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 19:50:36 2011 (r219783) +++ projects/graid/head/sys/geom/raid/md_promise.c Sat Mar 19 19:58:09 2011 (r219784) @@ -1117,9 +1117,8 @@ g_raid_md_event_promise(struct g_raid_md /* Write updated metadata to all disks. */ g_raid_md_write_promise(md, NULL, NULL, NULL); - /* Check if anything left except placeholders. */ - if (g_raid_ndisks(sc, -1) == - g_raid_ndisks(sc, G_RAID_DISK_S_OFFLINE)) + /* Check if anything left. */ + if (g_raid_ndisks(sc, -1) == 0) g_raid_destroy_node(sc, 0); else g_raid_md_promise_refill(sc); @@ -1340,16 +1339,12 @@ g_raid_md_ctl_promise(struct g_raid_md_o sd->sd_offset = 0; sd->sd_size = size; TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); - if (sd->sd_disk->d_consumer != NULL) { - g_raid_change_disk_state(disk, - G_RAID_DISK_S_ACTIVE); - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_ACTIVE); - g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, - G_RAID_EVENT_SUBDISK); - } else { - g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - } + g_raid_change_disk_state(disk, + G_RAID_DISK_S_ACTIVE); + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); } /* Write metadata based on created entities. */ @@ -1651,35 +1646,16 @@ g_raid_md_ctl_promise(struct g_raid_md_o pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - /* Erase metadata on deleting disk. */ + /* Erase metadata on deleting disk and destroy it. */ promise_meta_erase(disk->d_consumer); - - /* If disk was assigned, just update statuses. */ - if (pd->pd_subdisks >= 0) { - g_raid_change_disk_state(disk, G_RAID_DISK_S_OFFLINE); - if (disk->d_consumer) { - g_raid_kill_consumer(sc, disk->d_consumer); - disk->d_consumer = NULL; - } - TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { - g_raid_change_subdisk_state(sd, - G_RAID_SUBDISK_S_NONE); - g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED, - G_RAID_EVENT_SUBDISK); - } - } else { - /* Otherwise -- delete. */ - g_raid_change_disk_state(disk, G_RAID_DISK_S_NONE); - g_raid_destroy_disk(disk); - } + g_raid_destroy_disk(disk); } /* Write updated metadata to remaining disks. */ g_raid_md_write_promise(md, NULL, NULL, NULL); - /* Check if anything left except placeholders. */ - if (g_raid_ndisks(sc, -1) == - g_raid_ndisks(sc, G_RAID_DISK_S_OFFLINE)) + /* Check if anything left. */ + if (g_raid_ndisks(sc, -1) == 0) g_raid_destroy_node(sc, 0); else g_raid_md_promise_refill(sc); @@ -2033,9 +2009,8 @@ g_raid_md_fail_disk_promise(struct g_rai /* Write updated metadata to remaining disks. */ g_raid_md_write_promise(md, NULL, NULL, tdisk); - /* Check if anything left except placeholders. */ - if (g_raid_ndisks(sc, -1) == - g_raid_ndisks(sc, G_RAID_DISK_S_OFFLINE)) + /* Check if anything left. */ + if (g_raid_ndisks(sc, -1) == 0) g_raid_destroy_node(sc, 0); else g_raid_md_promise_refill(sc);