mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
Make graid3 fallback to malloc() when component request size is bigger
then maximal prepared UMA zone size. This fixes crash with MAXPHYS > 128K.
This commit is contained in:
parent
eb8e36c9f6
commit
d4060fa67d
2 changed files with 15 additions and 9 deletions
|
|
@ -183,15 +183,17 @@ static void *
|
|||
g_raid3_alloc(struct g_raid3_softc *sc, size_t size, int flags)
|
||||
{
|
||||
void *ptr;
|
||||
enum g_raid3_zones zone;
|
||||
|
||||
if (g_raid3_use_malloc)
|
||||
if (g_raid3_use_malloc ||
|
||||
(zone = g_raid3_zone(size)) == G_RAID3_NUM_ZONES)
|
||||
ptr = malloc(size, M_RAID3, flags);
|
||||
else {
|
||||
ptr = uma_zalloc_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone,
|
||||
&sc->sc_zones[g_raid3_zone(size)], flags);
|
||||
sc->sc_zones[g_raid3_zone(size)].sz_requested++;
|
||||
ptr = uma_zalloc_arg(sc->sc_zones[zone].sz_zone,
|
||||
&sc->sc_zones[zone], flags);
|
||||
sc->sc_zones[zone].sz_requested++;
|
||||
if (ptr == NULL)
|
||||
sc->sc_zones[g_raid3_zone(size)].sz_failed++;
|
||||
sc->sc_zones[zone].sz_failed++;
|
||||
}
|
||||
return (ptr);
|
||||
}
|
||||
|
|
@ -199,12 +201,14 @@ g_raid3_alloc(struct g_raid3_softc *sc, size_t size, int flags)
|
|||
static void
|
||||
g_raid3_free(struct g_raid3_softc *sc, void *ptr, size_t size)
|
||||
{
|
||||
enum g_raid3_zones zone;
|
||||
|
||||
if (g_raid3_use_malloc)
|
||||
if (g_raid3_use_malloc ||
|
||||
(zone = g_raid3_zone(size)) == G_RAID3_NUM_ZONES)
|
||||
free(ptr, M_RAID3);
|
||||
else {
|
||||
uma_zfree_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone,
|
||||
ptr, &sc->sc_zones[g_raid3_zone(size)]);
|
||||
uma_zfree_arg(sc->sc_zones[zone].sz_zone,
|
||||
ptr, &sc->sc_zones[zone]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -183,7 +183,9 @@ enum g_raid3_zones {
|
|||
|
||||
static __inline enum g_raid3_zones
|
||||
g_raid3_zone(size_t nbytes) {
|
||||
if (nbytes > 16384)
|
||||
if (nbytes > 65536)
|
||||
return (G_RAID3_NUM_ZONES);
|
||||
else if (nbytes > 16384)
|
||||
return (G_RAID3_ZONE_64K);
|
||||
else if (nbytes > 4096)
|
||||
return (G_RAID3_ZONE_16K);
|
||||
|
|
|
|||
Loading…
Reference in a new issue