Ignore:
Timestamp:
Jan 1, 2021, 11:24:39 PM (5 years ago)
Author:
Paul Smedley
Message:

Revise krealloc implementation. Fixes mixer controls in Debug builds; still traps in Release Builds

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud32-next/lib32/memory.c

    r615 r619  
    650650//******************************************************************************
    651651//******************************************************************************
    652 #if 0
     652
     653size_t ksize(const void *block)
     654{
     655        size_t size;
     656
     657        if (block == ZERO_SIZE_PTR)
     658                return 0;
     659
     660        GetBaseAddress((ULONG)block, (ULONG NEAR *)__Stack32ToFlat(&size));
     661
     662        return size;
     663}
     664//******************************************************************************
     665//******************************************************************************
    653666/* krealloc() wrapper */
    654 void *krealloc(const void *p, size_t new_size, unsigned int flags)
    655 {
    656         void *n;
     667//from linux 2.6
     668void *krealloc(const void *p, size_t new_size, gfp_t flags)
     669{
     670        void *ret;
    657671
    658672        if (!p)
    659                 return _kmalloc(new_size, flags);
    660 pr_warn("krealloc2");
    661         if (!new_size) {
    662                 _kfree(p);
    663                 return NULL;
    664         }
    665 pr_warn("krealloc3");
    666         n = _kmalloc(new_size, flags);
    667         if (!n)
    668                 return NULL;
    669 pr_warn("krealloc4");
    670         memcpy(n, p, new_size);
    671 pr_warn("krealloc5");
    672         _kfree(p);
    673         return n;
    674 }
    675 #else
    676 typedef s16 slobidx_t;
    677 struct slob_block {
    678         slobidx_t units;
    679 };
    680 typedef struct slob_block slob_t;
    681 struct slob_page {
    682         union {
    683                 struct {
    684                         unsigned long flags;    /* mandatory */
    685                         atomic_t _count;        /* mandatory */
    686                         slobidx_t units;        /* free units left in page */
    687                         unsigned long pad[2];
    688                         slob_t *free;           /* first free slob_t in page */
    689                         struct list_head list;  /* linked list of free pages */
    690                 };
    691                 struct page page;
    692         };
    693 };
    694 
    695 #define SLOB_UNIT sizeof(slob_t)
    696 #define SLOB_UNITS(size) (((size) + SLOB_UNIT - 1)/SLOB_UNIT)
    697 /* can't use ksize for kmem_cache_alloc memory, only kmalloc */
    698 /*
    699  * We use struct page fields to manage some slob allocation aspects,
    700  * however to avoid the horrible mess in include/linux/mm_types.h, we'll
    701  * just define our own struct page type variant here.
    702  */
    703 #if 0
    704 size_t ksize(const void *block)
    705 {
    706         struct slob_page *sp;
    707 
    708 //      BUG_ON(!block);
    709         if (block == ZERO_SIZE_PTR)
    710                 return 0;
    711 
    712         sp = slob_page(block);
    713         if (is_slob_page(sp)) {
    714                 int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
    715                 unsigned int *m = (unsigned int *)(block - align);
    716                 return SLOB_UNITS(*m) * SLOB_UNIT;
    717         } else
    718                 return sp->page.private;
    719 }
    720 #endif
    721 
    722 static inline void *__do_krealloc(const void *p, size_t new_size,
    723                                            gfp_t flags)
    724 {
    725         void *ret;
    726         size_t ks = 0;
    727 
    728 #if 0 //fixme ksize
    729         if (p)
    730                 ks = ksize(p);
    731 
    732         if (ks >= new_size)
    733                 return (void *)p;
    734 #endif
    735         ret = __kmalloc(new_size, flags);
    736         if (ret && p)
    737                 memcpy(ret, p, ks);
    738 
    739         return ret;
    740 }
    741 
    742 /**
    743  * krealloc - reallocate memory. The contents will remain unchanged.
    744  * @p: object to reallocate memory for.
    745  * @new_size: how many bytes of memory are required.
    746  * @flags: the type of memory to allocate.
    747  *
    748  * The contents of the object pointed to are preserved up to the
    749  * lesser of the new and old sizes.  If @p is %NULL, krealloc()
    750  * behaves exactly like kmalloc().  If @new_size is 0 and @p is not a
    751  * %NULL pointer, the object pointed to is freed.
    752  */
    753 void *krealloc(const void *p, size_t new_size, gfp_t flags)
    754 {
    755         void *ret;
     673                return __kmalloc(new_size, flags);
    756674
    757675        if (!new_size) {
    758676                kfree(p);
    759                 return ZERO_SIZE_PTR;
    760         }
    761 
    762         ret = __do_krealloc(p, new_size, flags);
    763         if (ret && p != ret)
    764                 kfree(p);
    765 
     677                return NULL;
     678        }
     679
     680        ret = __kmalloc(new_size, flags);
     681        if (!ret)
     682                return NULL;
     683
     684        memcpy(ret, p, min(new_size, ksize(p)));
     685        kfree(p);
    766686        return ret;
    767687}
    768 #endif
    769688
    770689//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.