[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Remove unused old xmalloc.c file.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1224689977 -3600 # Node ID 734a5493f03a9ca31d47adf7a2f78e255e5e9ea9 # Parent 94227875c13d4713b3c44f322663881b5c4ea4a0 Remove unused old xmalloc.c file. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/common/xmalloc.c | 286 --------------------------------------------------- 1 files changed, 286 deletions(-) diff -r 94227875c13d -r 734a5493f03a xen/common/xmalloc.c --- a/xen/common/xmalloc.c Wed Oct 22 15:11:54 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/****************************************************************************** - * Simple allocator for Xen. If larger than a page, simply use the - * page-order allocator. - * - * Copyright (C) 2005 Rusty Russell IBM Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * TODO (Keir, 17/2/05): - * 1. Use space in page_info to avoid xmalloc_hdr in allocated blocks. - * 2. page_info points into free list to make xfree() O(1) complexity. - * 3. Perhaps make this a sub-page buddy allocator? xmalloc() == O(1). - * (Disadvantage is potentially greater internal fragmentation). - */ - -#include <xen/config.h> -#include <xen/mm.h> -#include <xen/spinlock.h> -#include <xen/timer.h> -#include <xen/cache.h> -#include <xen/prefetch.h> -#include <xen/irq.h> -#include <xen/smp.h> - -/* - * XMALLOC_DEBUG: - * 1. Free data blocks are filled with poison bytes. - * 2. In-use data blocks have guard bytes at the start and end. - */ -#ifndef NDEBUG -#define XMALLOC_DEBUG 1 -#endif - -static LIST_HEAD(freelist); -static DEFINE_SPINLOCK(freelist_lock); - -struct xmalloc_hdr -{ - /* Size is total including this header. */ - size_t size; - struct list_head freelist; -} __cacheline_aligned; - -static void add_to_freelist(struct xmalloc_hdr *hdr) -{ -#if XMALLOC_DEBUG - memset(hdr + 1, 0xa5, hdr->size - sizeof(*hdr)); -#endif - list_add(&hdr->freelist, &freelist); -} - -static void del_from_freelist(struct xmalloc_hdr *hdr) -{ -#if XMALLOC_DEBUG - size_t i; - unsigned char *data = (unsigned char *)(hdr + 1); - for ( i = 0; i < (hdr->size - sizeof(*hdr)); i++ ) - BUG_ON(data[i] != 0xa5); - BUG_ON((hdr->size <= 0) || (hdr->size >= PAGE_SIZE)); -#endif - list_del(&hdr->freelist); -} - -static void *data_from_header(struct xmalloc_hdr *hdr) -{ -#if XMALLOC_DEBUG - /* Data block contain SMP_CACHE_BYTES of guard canary. */ - unsigned char *data = (unsigned char *)(hdr + 1); - memset(data, 0x5a, SMP_CACHE_BYTES); - memset(data + hdr->size - sizeof(*hdr) - SMP_CACHE_BYTES, - 0x5a, SMP_CACHE_BYTES); - return data + SMP_CACHE_BYTES; -#else - return hdr + 1; -#endif -} - -static struct xmalloc_hdr *header_from_data(void *p) -{ -#if XMALLOC_DEBUG - unsigned char *data = (unsigned char *)p - SMP_CACHE_BYTES; - struct xmalloc_hdr *hdr = (struct xmalloc_hdr *)data - 1; - size_t i; - - /* Check header guard canary. */ - for ( i = 0; i < SMP_CACHE_BYTES; i++ ) - BUG_ON(data[i] != 0x5a); - - /* Check footer guard canary. */ - data += hdr->size - sizeof(*hdr) - SMP_CACHE_BYTES; - for ( i = 0; i < SMP_CACHE_BYTES; i++ ) - BUG_ON(data[i] != 0x5a); - - return hdr; -#else - return (struct xmalloc_hdr *)p - 1; -#endif -} - -static void maybe_split(struct xmalloc_hdr *hdr, size_t size, size_t block) -{ - struct xmalloc_hdr *extra; - size_t leftover = block - size; - - /* If enough is left to make a block, put it on free list. */ - if ( leftover >= (2 * sizeof(struct xmalloc_hdr)) ) - { - extra = (struct xmalloc_hdr *)((unsigned long)hdr + size); - extra->size = leftover; - add_to_freelist(extra); - } - else - { - size = block; - } - - hdr->size = size; - /* Debugging aid. */ - hdr->freelist.next = hdr->freelist.prev = NULL; -} - -static void *xmalloc_new_page(size_t size) -{ - struct xmalloc_hdr *hdr; - - hdr = alloc_xenheap_page(); - if ( hdr == NULL ) - return NULL; - - spin_lock(&freelist_lock); - maybe_split(hdr, size, PAGE_SIZE); - spin_unlock(&freelist_lock); - - return data_from_header(hdr); -} - -/* Big object? Just use the page allocator. */ -static void *xmalloc_whole_pages(size_t size) -{ - struct xmalloc_hdr *hdr; - unsigned int pageorder = get_order_from_bytes(size); - - hdr = alloc_xenheap_pages(pageorder); - if ( hdr == NULL ) - return NULL; - - hdr->size = (1 << (pageorder + PAGE_SHIFT)); - /* Debugging aid. */ - hdr->freelist.next = hdr->freelist.prev = NULL; - - return data_from_header(hdr); -} - -/* Return size, increased to alignment with align. */ -static inline size_t align_up(size_t size, size_t align) -{ - return (size + align - 1) & ~(align - 1); -} - -void *_xmalloc(size_t size, size_t align) -{ - struct xmalloc_hdr *i; - - ASSERT(!in_irq()); - - /* We currently always return cacheline aligned. */ - BUG_ON(align > SMP_CACHE_BYTES); - -#if XMALLOC_DEBUG - /* Add room for canaries at start and end of data block. */ - size += 2 * SMP_CACHE_BYTES; -#endif - - /* Add room for header, pad to align next header. */ - size += sizeof(struct xmalloc_hdr); - size = align_up(size, __alignof__(struct xmalloc_hdr)); - - /* For big allocs, give them whole pages. */ - if ( size >= PAGE_SIZE ) - return xmalloc_whole_pages(size); - - /* Search free list. */ - spin_lock(&freelist_lock); - list_for_each_entry( i, &freelist, freelist ) - { - if ( i->size < size ) - continue; - del_from_freelist(i); - maybe_split(i, size, i->size); - spin_unlock(&freelist_lock); - return data_from_header(i); - } - spin_unlock(&freelist_lock); - - /* Alloc a new page and return from that. */ - return xmalloc_new_page(size); -} - -void xfree(void *p) -{ - struct xmalloc_hdr *i, *tmp, *hdr; - - ASSERT(!in_irq()); - - if ( p == NULL ) - return; - - hdr = header_from_data(p); - - /* We know hdr will be on same page. */ - BUG_ON(((long)p & PAGE_MASK) != ((long)hdr & PAGE_MASK)); - - /* Not previously freed. */ - BUG_ON(hdr->freelist.next || hdr->freelist.prev); - - /* Big allocs free directly. */ - if ( hdr->size >= PAGE_SIZE ) - { - free_xenheap_pages(hdr, get_order_from_bytes(hdr->size)); - return; - } - - /* Merge with other free block, or put in list. */ - spin_lock(&freelist_lock); - list_for_each_entry_safe( i, tmp, &freelist, freelist ) - { - unsigned long _i = (unsigned long)i; - unsigned long _hdr = (unsigned long)hdr; - - /* Do not merge across page boundaries. */ - if ( ((_i ^ _hdr) & PAGE_MASK) != 0 ) - continue; - - /* We follow this block? Swallow it. */ - if ( (_i + i->size) == _hdr ) - { - del_from_freelist(i); - i->size += hdr->size; - hdr = i; - } - - /* We precede this block? Swallow it. */ - if ( (_hdr + hdr->size) == _i ) - { - del_from_freelist(i); - hdr->size += i->size; - } - } - - /* Did we merge an entire page? */ - if ( hdr->size == PAGE_SIZE ) - { - BUG_ON((((unsigned long)hdr) & (PAGE_SIZE-1)) != 0); - free_xenheap_pages(hdr, 0); - } - else - { - add_to_freelist(hdr); - } - - spin_unlock(&freelist_lock); -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |