Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: raspberry pi panic 7.0_BETA after install fs resize
On Thu, Nov 06, 2014 at 06:01:41PM +0100, Maxime Villard wrote:
> Le 06/11/2014 08:28, Michael van Elst a ?crit :
> >petri.laakso%asd.fi@localhost (Petri Laakso) writes:
> >
> >
> >>On Fri, 31 Oct 2014, Maxime Villard wrote:
> >>>That's KMEM_SIZE. Great.
> >>>It means that it caught a memory corruption somewhere.
> >>>That being said, I don't think I can help without a trace...
> >
> >>Here's backtrace and steps how I ended up with panic. This was in
> >>single user mode after fresh 7.0_BETA install (sources from last night)
> >
> >>http://www.asd.fi/~petri/tmp/rpi_bt.jpg
> >
> >>Petri
> >
> >malloc considered useful:
> >
> >allocation in ffs_mountfs:
> > bsize = fs->fs_cssize;
> > if (fs->fs_contigsumsize > 0)
> > bsize += fs->fs_ncg * sizeof(int32_t);
> > bsize += fs->fs_ncg * sizeof(*fs->fs_contigdirs);
> > allocsbsize = bsize;
> > space = kmem_alloc((u_long)allocsbsize, KM_SLEEP);
> > fs->fs_csp = space;
> >
> >deallocation in ffs_unmount:
> > bsize = fs->fs_cssize;
> > if (fs->fs_contigsumsize > 0)
> > bsize += fs->fs_ncg * sizeof(int32_t);
> > bsize += fs->fs_ncg * sizeof(*fs->fs_contigdirs);
> > kmem_free(fs->fs_csp, bsize);
> >
> >
> >allocsbsize only exists to handle some error paths, but since
> >it is not stored globally, the value is recalculated, assuming
> >that the underlying values do not change.
> >
> >Apparently that's not true after the resize of the filesystem.
>
> Yes. That's similar to the mail I sent some days ago on tech-kern@:
>
> http://mail-index.netbsd.org/tech-kern/2014/10/27/msg017874.html
>
> I think we should implement a set of kmem_vXX functions, which
> don't need a size argument to free:
> void *kmem_valloc(size_t size)
> void kmem_vfree(void *ptr)
>
> Such an allocator would be very useful; not only in ffs, but in
> many other places where strange hacks in structures are necessary
> to hold the allocated size.
>
> It is easy to implement, and kmem_valloc(0) wouldn't panic the
> system - contrary to kmem_alloc().
You can do that now, using the existing allocation routines, and, at
the cost of possible suboptimal "block" alignment, allocate size_t
extra bytes at the start to hold the allocated size:
void *
allocate(size_t size, int type)
{
uint8_t *p;
p = kmem_alloc(size + sizeof(size_t), type);
memcpy(p, &size, sizeof(size));
return &p[sizeof(size)];
}
void
deallocate(void *ptr)
{
uint8_t *p = (uint8_t *)ptr;
size_t size;
p -= sizeof(size);
memcpy(&size, p, sizeof(size));
kmem_free(p, size);
}
Regards,
Alistair
Home |
Main Index |
Thread Index |
Old Index