Changeset 15816


Ignore:
Timestamp:
May 23, 2013, 3:22:59 PM (8 years ago)
Author:
gb
Message:

Start new scheme: maintain a second bitmap with 1 bit for every 256
in the global ephemeral refmap. (According too my calculations, this
should be ... 256X smaller than the refmap and should be easier to
traverse on machines with relatively small caches.

So far, we just allocate it (at overestimated maximum size) and map
it all read/write. Maintain this in the write barrier on x86 (so far)
and in pc_luser_xp's emulation of the write barrier

Todo: map at correct size and associate with managed_static
and tenured areas, and actually traverse this.

Last commit added a kernel global to support this.

Location:
trunk/source/lisp-kernel
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/arm-exceptions.c

    r15815 r15816  
    16781678          ((LispObj)ea < val)) {
    16791679        atomic_set_bit(refbits, bitnumber);
     1680        atomic_set_but(global_refidx, bitnumber>>8);
    16801681        if (need_memoize_root) {
    16811682          bitnumber = area_dnode(root, lisp_global(REF_BASE));
    16821683          atomic_set_bit(refbits, bitnumber);
     1684          atomic_set_bit(global_refidx,bitnumber>>8);
    16831685        }
    16841686      }
  • trunk/source/lisp-kernel/gc.h

    r15815 r15816  
    6464extern LispObj GCarealow, GCareadynamiclow;
    6565extern natural GCndnodes_in_area, GCndynamic_dnodes_in_area;
    66 extern bitvector GCmarkbits, GCdynamic_markbits,managed_static_refbits;
     66extern bitvector GCmarkbits, GCdynamic_markbits,managed_static_refbits,global_refidx;
    6767LispObj *global_reloctab, *GCrelocptr;
    6868LispObj GCfirstunmarked;
  • trunk/source/lisp-kernel/pmcl-kernel.c

    r15815 r15816  
    136136
    137137LispObj lisp_nil = (LispObj) 0;
    138 bitvector global_mark_ref_bits = NULL, dynamic_mark_ref_bits = NULL, relocatable_mark_ref_bits = NULL;
     138bitvector global_mark_ref_bits = NULL, dynamic_mark_ref_bits = NULL, relocatable_mark_ref_bits = NULL, global_refidx = NULL;
    139139
    140140
     
    525525{
    526526  Ptr h;
    527   natural base;
     527  natural base, refbits_size;
    528528  BytePtr
    529529    end,
     
    571571  end = lastbyte;
    572572  reserved_region_end = lastbyte;
    573   end = (BytePtr) ((natural)((((natural)end) - ((totalsize+63)>>6)) & ~4095));
     573  refbits_size = ((totalsize+63)>>6); /* word size! */
     574  end = (BytePtr) ((natural)((((natural)end) - refbits_size) & ~4095));
    574575
    575576  global_mark_ref_bits = (bitvector)end;
     577  end  = (BytePtr) ((natural)((((natural)end) - ((refbits_size+255) >> 8)) & ~4095));
     578  global_refidx = (bitvector)end;
     579  /* Don't really want to commit so much so soon */
     580  CommitMemory((BytePtr)global_refidx,(BytePtr)global_mark_ref_bits-(BytePtr)global_refidx);
     581   
    576582  end = (BytePtr) ((natural)((((natural)end) - ((totalsize+63) >> 6)) & ~4095));
    577583  global_reloctab = (LispObj *) end;
     
    17551761    lisp_global(STATIC_CONS_AREA) = ptr_to_lispobj(static_cons_area);
    17561762    lisp_global(REFBITS) = ptr_to_lispobj(global_mark_ref_bits);
     1763    lisp_global(EPHEMERAL_REFIDX) = ptr_to_lispobj(global_refidx);
    17571764    g2_area->threshold = default_g2_threshold;
    17581765    g1_area->threshold = default_g1_threshold;
  • trunk/source/lisp-kernel/ppc-exceptions.c

    r15815 r15816  
    19991999          ((LispObj)ea < val)) {
    20002000        atomic_set_bit(refbits, bitnumber);
     2001        atomic_set_bit(global_refidx, bitnumber>>8);
    20012002        if (need_memoize_root) {
    20022003          bitnumber = area_dnode(root, lisp_global(REF_BASE));
    20032004          atomic_set_bit(refbits, bitnumber);
     2005          atomic_set_bit(global_refidx,bitnumber>>8);
    20042006        }
    20052007      }
  • trunk/source/lisp-kernel/x86-exceptions.c

    r15815 r15816  
    27602760        if ((bitnumber < lisp_global(OLDSPACE_DNODE_COUNT))) {
    27612761          atomic_set_bit(refbits, bitnumber);
     2762          atomic_set_bit(global_refidx,bitnumber>>8);
    27622763          if (need_memoize_root) {
    27632764            atomic_set_bit(refbits, rootbitnumber);
     2765            atomic_set_bit(global_refidx,rootbitnumber>>8);
    27642766          }
    27652767        }
  • trunk/source/lisp-kernel/x86-spentry32.s

    r15815 r15816  
    17321732        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    17331733        __(jae 2f)
     1734        __(movd %imm0,%mm0)
    17341735        __(ref_global(refbits,%temp0))
    17351736        __(xorb $31,%imm0_b)
    17361737        __(lock)
    17371738        __(btsl %imm0,(%temp0))
     1739        __(shrl $8,%imm0)
    17381740        __(xorb $31,%imm0_b)
     1741        __(ref_global(ephemeral_refidx,%temp0))
     1742        __(lock)
     1743        __(btsl %imm0,(%temp0))
     1744        __(movd %mm0,%imm0)
    173917452:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    17401746        __(jae 0b)
     
    17591765        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    17601766        __(jae 2f)
     1767        __(movd %imm0,%mm0)
    17611768        __(ref_global(refbits,%temp0))
    17621769        __(xorb $31,%imm0_b)
    17631770        __(lock)
    17641771        __(btsl %imm0,(%temp0))
    1765         __(xorb $31,%imm0_b)       
     1772        __(shrl $8,%imm0)
     1773        __(xorb $31,%imm0_b)
     1774        __(ref_global(ephemeral_refidx,%temp0))
     1775        __(lock)
     1776        __(btsl %imm0,(%temp0))
     1777        __(movd %mm0,%imm0)
    176617782:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    17671779        __(jae 0b)
     
    17881800        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    17891801        __(jae 2f)
     1802        __(movd %imm0,%mm0)
    17901803        __(ref_global(refbits,%temp1))
    17911804        __(xorb $31,%imm0_b)
    17921805        __(lock)
    17931806        __(btsl %imm0,(%temp1))
     1807        __(shrl $8,%imm0)
    17941808        __(xorb $31,%imm0_b)
     1809        __(ref_global(ephemeral_refidx,%temp1))
     1810        __(lock)
     1811        __(btsl %imm0,(%temp1))
     1812        __(movd %mm0,%imm0)
    179518132:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    17961814        __(jae 0b)
     
    18231841        __(lock)
    18241842        __(btsl %imm0,(%temp1))
     1843        __(shrl $8,%imm0)
     1844        __(xorb $31,%imm0_b)
     1845        __(ref_global(ephemeral_refidx,%temp1))
     1846        __(lock)
     1847        __(btsl %imm0,(%temp1))
    18251848        /* Now memoize the address of the hash vector */
     1849        __(ref_global(refbits,%temp1))
    18261850        __(movl %temp0,%imm0)
    18271851        __(subl lisp_global(ref_base),%imm0)
     
    18301854        __(lock)
    18311855        __(btsl %imm0,(%temp1))
     1856        __(shrl $8,%imm0)
     1857        __(xorb $31,%imm0_b)
     1858        __(ref_global(ephemeral_refidx,%temp1))
     1859        __(lock)
     1860        __(btsl %imm0,(%temp1))
    18321861        __(lea misc_data_offset(%temp0,%arg_y),%imm0)
    18331862        __(subl lisp_global(ref_base),%imm0)
     
    18751904        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
    18761905        __(jae 2f)
     1906        __(movd %imm0,%mm0)
    18771907        __(ref_global(refbits,%arg_y))
    18781908        __(xorb $31,%imm0_b)
    18791909        __(lock)
    18801910        __(btsl %imm0,(%arg_y))
     1911        __(shrl $8,%imm0)
    18811912        __(xorb $31,%imm0_b)
     1913        __(ref_global(ephemeral_refidx,%arg_y))
     1914        __(lock)
     1915        __(btsl %imm0,(%arg_y))
     1916        __(movd %mm0,%imm0)
    188219172:      __(cmpl lisp_global(managed_static_dnodes),%imm0)
    18831918        __(jae 8f)
     
    19171952        __(lock)
    19181953        __(btsl %imm0,(%arg_y))
     1954        __(shrl $8,%imm0)
     1955        __(xorb $31,%imm0_b)
     1956        __(ref_global(ephemeral_refidx,%arg_y))
     1957        __(lock)
     1958        __(btsl %imm0,(%arg_y))
    19191959        /* Now memoize the address of the hash vector */
     1960        __(ref_global(refbits,%arg_y))
    19201961        __(movl %temp1,%imm0)
    19211962        __(subl lisp_global(ref_base),%imm0)
     
    19241965        __(lock)
    19251966        __(btsl %imm0,(%arg_y))
     1967        __(ref_global(ephemeral_refidx,%arg_y))
     1968        __(shrl $8,%imm0)
     1969        __(xorb $31,%imm0_b)
     1970        __(lock)
     1971        __(btsl %imm0,(%arg_y))
    19261972        __(leal misc_data_offset(%temp1,%temp0),%imm0)
    19271973        __(subl lisp_global(ref_base),%imm0)
  • trunk/source/lisp-kernel/x86-spentry64.s

    r15815 r15816  
    17781778        __(lock)
    17791779        __(btsq %imm0,(%temp0))
     1780        __(ref_global(ephemeral_refidx,%temp0))
     1781        __(shrq $8,%imm0)
     1782        __(xorb $63,%imm0_b)
     1783        __(lock)
     1784        __(btsq %imm0,(%temp0))
    178017852:      __(cmpq lisp_global(managed_static_dnodes),%imm1)
    17811786        __(jae 0b)
     
    18051810        __(lock)
    18061811        __(btsq %imm0,(%temp0))
    1807         __(ret)
     1812        __(ref_global(ephemeral_refidx,%temp0))
     1813        __(shrq $8,%imm0)
     1814        __(xorb $63,%imm0_b)
     1815        __(lock)
     1816        __(btsq %imm0,(%temp0))
    180818172:      __(cmpq lisp_global(managed_static_dnodes),%imm1)
    18091818        __(jae 0b)
     
    18361845        __(lock)
    18371846        __(btsq %imm0,(%temp0))
     1847        __(ref_global(ephemeral_refidx,%temp0))
     1848        __(shrq $8,%imm0)
     1849        __(xorb $63,%imm0_b)
     1850        __(lock)
     1851        __(btsq %imm0,(%temp0))
    183818522:      __(cmpq lisp_global(managed_static_dnodes),%imm1)
    18391853        __(jae 0b)
     
    18681882        __(lock)
    18691883        __(btsq %imm0,(%temp0))
     1884        __(ref_global(ephemeral_refidx,%temp0))
     1885        __(shrq $8,%imm0)
     1886        __(xorb $63,%imm0_b)
     1887        __(lock)
     1888        __(btsq %imm0,(%temp0))
    18701889        /* Now memoize the address of the hash vector   */
     1890        __(ref_global(refbits,%temp0))
    18711891        __(movq %arg_x,%imm0)
    18721892        __(subq lisp_global(ref_base),%imm0)
    18731893        __(shrq $dnode_shift,%imm0)
     1894        __(xorb $63,%imm0_b)
     1895        __(lock)
     1896        __(btsq %imm0,(%temp0))
     1897        __(ref_global(ephemeral_refidx,%temp0))
     1898        __(shrq $8,%imm0)
    18741899        __(xorb $63,%imm0_b)
    18751900        __(lock)
     
    19161941        __(ref_global(refbits,%temp1))
    19171942        __(jae 2f)
     1943        __(xorb $63,%imm0_b)
     1944        __(lock)
     1945        __(btsq %imm0,(%temp1))
     1946        __(shrq $8,%imm0)
     1947        __(ref_global(ephemeral_refidx,%temp1))
    19181948        __(xorb $63,%imm0_b)
    19191949        __(lock)
     
    19551985        __(lock)
    19561986        __(btsq %imm0,(%temp1))
     1987        __(shrq $8,%imm0)
     1988        __(xorb $63,%imm0_b)
     1989        __(ref_global(ephemeral_refidx,%temp1))
     1990        __(lock)
     1991        __(btsq %imm0,(%temp1))
    19571992        /* Now memoize the address of the hash vector   */
    19581993        __(movq %arg_x,%imm0)
    19591994        __(subq lisp_global(ref_base),%imm0)
     1995        __(ref_global(refbits,%temp1))
    19601996        __(shrq $dnode_shift,%imm0)
    19611997        __(xorb $63,%imm0_b)
     1998        __(lock)
     1999        __(btsq %imm0,(%temp1))
     2000        __(shrq $8,%imm0)
     2001        __(xorb $63,%imm0_b)
     2002        __(ref_global(ephemeral_refidx,%temp1))
    19622003        __(lock)
    19632004        __(btsq %imm0,(%temp1))
Note: See TracChangeset for help on using the changeset viewer.