Changeset 619 for GPL/branches/uniaud32-next/lib32/memory.c
- Timestamp:
- Jan 1, 2021, 11:24:39 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-next/lib32/memory.c
r615 r619 650 650 //****************************************************************************** 651 651 //****************************************************************************** 652 #if 0 652 653 size_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 //****************************************************************************** 653 666 /* krealloc() wrapper */ 654 void *krealloc(const void *p, size_t new_size, unsigned int flags) 655 { 656 void *n; 667 //from linux 2.6 668 void *krealloc(const void *p, size_t new_size, gfp_t flags) 669 { 670 void *ret; 657 671 658 672 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); 756 674 757 675 if (!new_size) { 758 676 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); 766 686 return ret; 767 687 } 768 #endif769 688 770 689 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.