Re: master: Use soft card marking on all fixedobj pages

Stas Boukarev <[email protected]> Wed, 8 Apr 2026 07:05:08 +0300
Newsgroups gmane.lisp.steel-bank.cvs,gmane.lisp.steel-bank.devel
Message-ID <CAF63=10KmHgrXPVQLOw7U7cfC6zgbENbxf1F9V-MfKDH02G7ig@mail.gmail.com>
And --without-sb-thread seems to have been broken by this commit.

On Tue, Apr 7, 2026 at 6:06 PM Stas Boukarev <[email protected]> wrote:
>
> On Tue, Apr 7, 2026 at 5:56 PM snuglas via Sbcl-commits
> <[email protected]> wrote:
> >
> > The branch "master" has been updated in SBCL:
> >        via  5f3bf0b9e4083e0b626aedfcdf7014f9bb2a25ae (commit)
> >       from  d62ed2476fb4a4f7ed6966426f1608354410d11c (commit)
> >
> > - Log -----------------------------------------------------------------
> > commit 5f3bf0b9e4083e0b626aedfcdf7014f9bb2a25ae
> > Author: Douglas Katzman <[email protected]>
> > Date:   Tue Apr 7 10:20:50 2026 -0400
> >
> >     Use soft card marking on all fixedobj pages
> > ---
> >  src/assembly/x86-64/assem-rtns.lisp | 41 ++++++++++++++++++++++++++++
> >  src/compiler/x86-64/cell.lisp       | 52 +++++++++++++++++++++++++-----------
> >  src/compiler/x86-64/memory.lisp     | 23 +++++++++-------
> >  src/compiler/x86-64/tls.lisp        | 53 +++++++++++++++++++++++++------------
> >  src/runtime/immobile-space.c        | 29 +-------------------
> >  5 files changed, 127 insertions(+), 71 deletions(-)
> >
> > diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp
> > index cad007afb..f1d24d7c8 100644
> > --- a/src/assembly/x86-64/assem-rtns.lisp
> > +++ b/src/assembly/x86-64/assem-rtns.lisp
> > @@ -466,6 +466,47 @@
> >        (inst leave)
> >        (inst ret)))))
> >
> > +#+(and immobile-space sb-assembling)
> > +(define-assembly-routine (mark-symbol-card
> > +                          (:return-style :none)
> > +                          (:export mark-card)) ; if the space is unknown
> > +    ((:temp rax unsigned-reg rax-offset)
> > +     (:temp rdx unsigned-reg rdx-offset))
> > +  (inst push rax)
> > +  (inst mov rax (ea 16 rsp-tn)) ; load the argument
> > +  (inst push rdx)
> > +  ;; stack: symbol
> > +  ;;        return PC
> > +  ;;        saved rax
> > +  ;;        saved rdx
> > +  (inst mov rdx (rip-relative-ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref)))
> > +  (inst sub rax (ea rdx)) ; compute symbol - FIXEDOBJ_SPACE_START
> > +  (inst shr rax (1- (integer-length immobile-card-bytes)))
> > +  FIXEDOBJ
> > +  (inst mov rdx (rip-relative-ea (make-fixup "fixedobj_pages" :foreign-dataref)))
> > +  (inst mov rdx (ea rdx))
> > +  (inst mov :byte (ea 4 rdx rax 8) #x40) ; SET_WP_FLAG to WRITE_PROTECT_CLEARED
> > +  (inst pop rdx)
> > +  (inst pop rax)
> > +  (inst ret 8) ; remove 1 stack arg
> > +  (inst .align 4 :long-nop)
> > +  MARK-CARD
> > +  (inst push rax)
> > +  (inst mov rax (ea 16 rsp-tn)) ; load the argument
> > +  (inst push rdx)
> > +  (inst mov rdx (rip-relative-ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref)))
> > +  (inst sub rax (ea rdx)) ; compute symbol - FIXEDOBJ_SPACE_START
> > +  ;; Preserve the sign in the right-shift so that one comparison suffices.
> > +  ;; (If the difference was negative, is looks like a large positive.)
> > +  (inst sar rax (1- (integer-length immobile-card-bytes)))
> > +  (inst cmp rax (/ fixedobj-space-size immobile-card-bytes))
> > +  (inst jmp :B FIXEDOBJ) ; unsigned comparison
> > +  (inst mov rax (ea 24 rsp-tn)) ; reload the argument
> > +  (mark-gc-card rax)
> > +  (inst pop rdx)
> > +  (inst pop rax)
> > +  (inst ret 8)) ; remove 1 stack arg
> > +
> >  ;; Adding to the thread-local remset has to be pseudo-atomic because GC takes
> >  ;; ownership of the the vector when it inserts rememberd objects into the common
> >  ;; remset and it assigns 0 into the thread slot.
> > diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp
> > index d56f04fc3..10029ee37 100644
> > --- a/src/compiler/x86-64/cell.lisp
> > +++ b/src/compiler/x86-64/cell.lisp
> > @@ -76,13 +76,23 @@
> >    (:results (result :scs (descriptor-reg any-reg)))
> >    (:vop-var vop)
> >    (:generator 5
> > -     (let ((newval-tn-ref (vop-nth-arg 2 vop)))
> > -       (if (eq name 'sb-impl::cas-symbol-%info)
> > -           (emit-symbol-write-barrier vop object rax newval-tn-ref)
> > -           (emit-gengc-barrier object nil rax newval-tn-ref)))
> > -     (move rax old)
> > -     (inst cmpxchg :lock (ea (- (* offset n-word-bytes) lowtag) object) new)
> > -     (move result rax)))
> > +    (let ((newval-tn-ref (vop-nth-arg 2 vop)))
> > +      (cond
> > +        #+immobile-space
> > +        ((eq name 'sb-impl::cas-symbol-%info)
> > +         (pseudo-atomic ()
> > +          (emit-symbol-write-barrier vop object rax newval-tn-ref)
> > +          (move rax old)
> > +          (inst cmpxchg :lock (ea (- (* offset n-word-bytes) lowtag) object) new)))
> > +        (t
> > +         (if (eq name 'sb-impl::cas-symbol-%info)
> > +             ;; symbol-write-barrier includes the special case for #+permgen
> > +             (emit-symbol-write-barrier vop object rax newval-tn-ref)
> > +             (emit-gengc-barrier object nil rax newval-tn-ref))
> > +         (emit-gengc-barrier object nil rax newval-tn-ref)
>
> Looks like the emit-gengc-barrier after the IF is wrong.


_______________________________________________
Sbcl-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sbcl-commits