I agree, let's do it.

Klemens Nanni <k...@openbsd.org> wrote:

> 22.05.2025 06:07, Klemens Nanni пишет:
> > 15.05.2025 13:05, Mark Kettenis пишет:
> >>> Date: Thu, 15 May 2025 11:22:17 +0200
> >>> From: Claudio Jeker <cje...@diehard.n-r-g.com>
> >>>
> >>> On Thu, May 15, 2025 at 06:28:42PM +1000, Jonathan Matthew wrote:
> >>>> On Tue, May 13, 2025 at 07:55:03AM +0200, Otto Moerbeek wrote:
> >>>>> On Mon, May 12, 2025 at 08:07:11PM +0200, Sebastien Marie wrote:
> >>>>>
> >>>>>>> I suppose the same could occurs with lld (untested for now).
> >>>>>>
> >>>>>> I confirm it is the same problem with lld.
> >>>>>>
> >>>>>> $ cd /usr/share/relink/kernel/GENERIC.MP
> >>>>>> $ ld -T ld.script -X --warn-common -nopie -o /tmp/newbsd *.o && echo ok
> >>>>>>
> >>>>>> /tmp: write failed, file system is full
> >>>>>> ok
> >>>>>> $ ls -l /tmp/newbsd
> >>>>>> -rwxr-xr-x  1 semarie  wheel  236434608 May 12 20:05 /tmp/newbsd*
> >>>>>>
> >>>>>> And my dmesg has the following:
> >>>>>> uvn_flush: obj=0xfffffd86e3311608, offset=0x16b0000.  error during 
> >>>>>> pageout.
> >>>>>> uvn_flush: WARNING: changes to page may be lost!
> >>>>>
> >>>>> So this code is using mmapped files for writing, which makes proper
> >>>>> error handling extremely difficult or even impossible. Best bet is
> >>>>> making sure enough space is available before starting. 
> >>>>
> >>>> lld has a --no-mmap-output-file option that causes it to use plain 
> >>>> write(2)
> >>>> calls to generate the output file. Perhaps it'd be worth using that for
> >>>> kernel linking and other stuff we relink at boot time?
> >>>  
> >>> Maybe that should be the default. Having lld produce bad binaries but exit
> >>> 0 is just very wrong. Not sure if this a problem that only manifests on
> >>> OpenBSD since there is no unified buffer cache or if other systems would
> >>> hit the same issue as well. As Otto mentioned detection IO errors when
> >>> using mmap to write files is not trivial.
> >>
> >> I think the same problem exists on other OSes, even those with a
> >> unified buffer cache.  I suppose lld(1) could use msync(2) (with the
> >> MS_SYNC) flag to make sure everything lands on disk correctly.  But
> >> that obviously would remove some of the benefits of using mmap(),
> >> namely the async completion of the writes.
> >>
> >> It would be intersting to see what the impact on build times of
> >> changing the defaults would be.  But I'm somewhat hesitant to change
> >> the default since the --no-mmap-output-file code path isn't tested
> >> much on other OSes.
> > 
> > Shall we first try it for kernels only?
> > 
> >     # make && make install && reboot
> >     ld -T ld.script -X --warn-common -nopie --no-mmap-output-file -o bsd 
> > ${SYSTEM_HEAD} vers.o ${OBJS}
> >     text    data    bss     dec     hex
> >     26918218        492744  1351680 28762642        1b6e212
> >     mv bsd bsd.gdb
> >     ctfstrip -S -o bsd bsd.gdb
> > 
> >     $ cat /usr/share/relink/kernel/GENERIC.MP/relink.log    
> >     (SHA256) /bsd: OK
> >     LD="ld" sh makegap.sh 0xcccccccc gapdummy.o
> >     ld -T ld.script -X --warn-common -nopie --no-mmap-output-file -o newbsd 
> > ${SYSTEM_HEAD} vers.o ${OBJS}
> >     text    data    bss     dec     hex
> >     26908374        489800  1347584 28745758        1b6a01e
> >     mv newbsd newbsd.gdb
> >     [...]
> > 
> > This also effects installs and upgrades.
> 
> Any thoughts on doing this for all architectures using clang?
> Looks like that'd be <bsd.own.mk> CLANG_ARCH modulo sparc64.
> 
> > 
> > Index: sys/arch/amd64/conf/Makefile.amd64
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/amd64/conf/Makefile.amd64,v
> > diff -u -p -r1.142 Makefile.amd64
> > --- sys/arch/amd64/conf/Makefile.amd64      5 May 2025 20:43:32 -0000       
> > 1.142
> > +++ sys/arch/amd64/conf/Makefile.amd64      22 May 2025 02:44:05 -0000
> > @@ -111,6 +111,8 @@ COPTIMIZE?=     -O2
> >  CFLAGS=            ${DEBUG} ${CWARNFLAGS} ${CMACHFLAGS} ${COPTIMIZE} 
> > ${COPTS} ${PIPE}
> >  AFLAGS=            -D_LOCORE -x assembler-with-cpp ${CWARNFLAGS} 
> > ${CMACHFLAGS}
> >  LINKFLAGS= -T ld.script -X --warn-common -nopie
> > +# propagate failure like ENOSPC on relink
> > +LINKFLAGS+=        --no-mmap-output-file
> >  
> >  HOSTCC?=   ${CC}
> >  HOSTED_CPPFLAGS=${CPPFLAGS:S/^-nostdinc$//}
> > 
> 

Reply via email to