summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2009-01-13 12:09:47 +0100
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2009-01-13 12:09:47 +0100
commit22e14e744f8a740e9382ec282d858e6af7e47826 (patch)
treebea7e394d9a0833254aecde3a8943927dda93449
parentd15714ec008de4cbcd2c0aa9389b5ca407f1abcf (diff)
Add copyright notice. Delete unused File.
-rw-r--r--src/wsbm_atomic.h5
-rw-r--r--src/wsbm_driver.c10
-rw-r--r--src/wsbm_driver.h10
-rw-r--r--src/wsbm_fencemgr.c10
-rw-r--r--src/wsbm_fencemgr.h10
-rw-r--r--src/wsbm_mallocpool.c11
-rw-r--r--src/wsbm_manager.c11
-rw-r--r--src/wsbm_manager.h11
-rw-r--r--src/wsbm_mm.c5
-rw-r--r--src/wsbm_mm.h3
-rw-r--r--src/wsbm_pool.h11
-rw-r--r--src/wsbm_priv.h10
-rw-r--r--src/wsbm_slabpool.c11
-rw-r--r--src/wsbm_slabpool_new.c1213
-rw-r--r--src/wsbm_ttmpool.c11
-rw-r--r--src/wsbm_userpool.c11
-rw-r--r--src/wsbm_util.h2
17 files changed, 84 insertions, 1271 deletions
diff --git a/src/wsbm_atomic.h b/src/wsbm_atomic.h
index 40980e6..71da6bb 100644
--- a/src/wsbm_atomic.h
+++ b/src/wsbm_atomic.h
@@ -1,3 +1,8 @@
+/**
+ * This file is under no copyright claims due to its
+ * simplicity.
+ */
+
#ifndef _WSBM_ATOMIC_H_
#define _WSBM_ATOMIC_H_
diff --git a/src/wsbm_driver.c b/src/wsbm_driver.c
index 1402715..c044142 100644
--- a/src/wsbm_driver.c
+++ b/src/wsbm_driver.c
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,10 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
**************************************************************************/
/*
* Authors:
diff --git a/src/wsbm_driver.h b/src/wsbm_driver.h
index 7c40744..d5058ed 100644
--- a/src/wsbm_driver.h
+++ b/src/wsbm_driver.h
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,10 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
**************************************************************************/
/*
* Authors:
diff --git a/src/wsbm_fencemgr.c b/src/wsbm_fencemgr.c
index e969776..7a7577d 100644
--- a/src/wsbm_fencemgr.c
+++ b/src/wsbm_fencemgr.c
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Tx., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,10 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
**************************************************************************/
/*
* Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_fencemgr.h b/src/wsbm_fencemgr.h
index 92b0740..58bd7c8 100644
--- a/src/wsbm_fencemgr.h
+++ b/src/wsbm_fencemgr.h
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Tx., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,10 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
**************************************************************************/
/*
* Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_mallocpool.c b/src/wsbm_mallocpool.c
index 7fc748d..c627c34 100644
--- a/src/wsbm_mallocpool.c
+++ b/src/wsbm_mallocpool.c
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_manager.c b/src/wsbm_manager.c
index 79223ce..5e7854e 100644
--- a/src/wsbm_manager.c
+++ b/src/wsbm_manager.c
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 Vmware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_manager.h b/src/wsbm_manager.h
index e9efb62..02b9b0a 100644
--- a/src/wsbm_manager.h
+++ b/src/wsbm_manager.h
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 Vmware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_mm.c b/src/wsbm_mm.c
index e3c32fe..88871ba 100644
--- a/src/wsbm_mm.c
+++ b/src/wsbm_mm.c
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA.
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA.
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -23,7 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- *
**************************************************************************/
/*
@@ -34,6 +35,8 @@
* performance gains if a smarter free list is implemented. Currently it is just an
* unordered stack of free regions. This could easily be improved if an RB-tree
* is used instead. At least if we expect heavy fragmentation.
+ * Note that this implementation is more or less identical to the drm core manager
+ * in the linux kernel.
*
* Authors:
* Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_mm.h b/src/wsbm_mm.h
index 9d97a23..e76b119 100644
--- a/src/wsbm_mm.h
+++ b/src/wsbm_mm.h
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA.
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA.
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -23,7 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- *
**************************************************************************/
/*
diff --git a/src/wsbm_pool.h b/src/wsbm_pool.h
index 37aaaa5..df24475 100644
--- a/src/wsbm_pool.h
+++ b/src/wsbm_pool.h
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_priv.h b/src/wsbm_priv.h
index d39f32a..89e4313 100644
--- a/src/wsbm_priv.h
+++ b/src/wsbm_priv.h
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,10 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
**************************************************************************/
/*
* Authors:
diff --git a/src/wsbm_slabpool.c b/src/wsbm_slabpool.c
index 1c23449..4dbc507 100644
--- a/src/wsbm_slabpool.c
+++ b/src/wsbm_slabpool.c
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_slabpool_new.c b/src/wsbm_slabpool_new.c
deleted file mode 100644
index 92ffb17..0000000
--- a/src/wsbm_slabpool_new.c
+++ /dev/null
@@ -1,1213 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <ttm/ttm_placement_user.h>
-#include <stdint.h>
-#include <sys/time.h>
-#include <errno.h>
-#include <unistd.h>
-#include <assert.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <xf86drm.h>
-#include "wsbm_pool.h"
-#include "wsbm_fencemgr.h"
-#include "wsbm_priv.h"
-#include "wsbm_manager.h"
-#include <stdio.h>
-
-
-#define WSBM_SLABPOOL_ALLOC_RETRIES 100
-#define DRMRESTARTCOMMANDWRITE(_fd, _val, _arg, _ret) \
- do { \
- (_ret) = drmCommandWrite(_fd, _val, &(_arg), sizeof(_arg)); \
- } while ((_ret) == -EAGAIN || (_ret) == -ERESTART); \
-
-#define DRMRESTARTCOMMANDWRITEREAD(_fd, _val, _arg, _ret) \
- do { \
- (_ret) = drmCommandWriteRead(_fd, _val, &(_arg), sizeof(_arg)); \
- } while ((_ret) == -EAGAIN || (_ret) == -ERESTART); \
-
-
-#ifdef DEBUG_FENCESIGNALED
-static int createbuffer = 0;
-static int fencesignaled = 0;
-#endif
-
-struct _WsbmSlab;
-
-struct _WsbmSlabBuffer {
- struct _WsbmKernelBuf kBuf;
- struct _WsbmBufStorage storage;
- struct _WsbmCond event;
-
- /*
- * Remains constant after creation.
- */
-
- int isSlabBuffer;
- struct _WsbmSlab *parent;
- uint32_t start;
- void *virtual;
- unsigned long requestedSize;
- uint64_t mapHandle;
-
- /*
- * Protected by struct _WsbmSlabSizeHeader::mutex
- */
-
- struct _WsbmListHead head;
-
- /*
- * Protected by this::mutex
- */
-
- struct _WsbmFenceObject *fence;
- uint32_t fenceType;
- struct _WsbmAtomic writers; /* (Only upping) */
- int unFenced;
-};
-
-struct _WsbmSlabPool;
-struct _WsbmSlabKernelBO {
-
- /*
- * Constant at creation
- */
-
- struct _WsbmKernelBuf kBuf;
- uint32_t pageAlignment;
- void *virtual;
- unsigned long actualSize;
- uint64_t mapHandle;
-
- /*
- * Protected by struct _WsbmSlabCache::mutex
- */
-
- struct _WsbmSlabPool *slabPool;
- uint32_t proposedPlacement;
- struct _WsbmListHead timeoutHead;
- struct _WsbmListHead head;
- struct timeval timeFreed;
-};
-
-struct _WsbmSlab{
- struct _WsbmListHead head;
- struct _WsbmListHead freeBuffers;
- uint32_t numBuffers;
- uint32_t numFree;
- struct _WsbmSlabBuffer *buffers;
- struct _WsbmSlabSizeHeader *header;
- struct _WsbmSlabKernelBO *kbo;
-};
-
-
-struct _WsbmSlabSizeHeader {
- /*
- * Constant at creation.
- */
- struct _WsbmSlabPool *slabPool;
- uint32_t bufSize;
-
- /*
- * Protected by this::mutex
- */
-
- struct _WsbmListHead slabs;
- struct _WsbmListHead freeSlabs;
- struct _WsbmListHead delayedBuffers;
- uint32_t numDelayed;
- struct _WsbmMutex mutex;
-};
-
-struct _WsbmSlabCache {
- struct timeval slabTimeout;
- struct timeval checkInterval;
- struct timeval nextCheck;
- struct _WsbmListHead timeoutList;
- struct _WsbmListHead unCached;
- struct _WsbmListHead cached;
- struct _WsbmMutex mutex;
-};
-
-
-struct _WsbmSlabPool {
- struct _WsbmBufferPool pool;
-
- /*
- * The data of this structure remains constant after
- * initialization and thus needs no mutex protection.
- */
-
- unsigned int devOffset;
- struct _WsbmSlabCache *cache;
- uint32_t proposedPlacement;
- uint32_t validMask;
- uint32_t *bucketSizes;
- uint32_t numBuckets;
- uint32_t pageSize;
- int pageAlignment;
- int maxSlabSize;
- int desiredNumBuffers;
- struct _WsbmSlabSizeHeader *headers;
-};
-
-static inline struct _WsbmSlabPool *
-slabPoolFromPool(struct _WsbmBufferPool *pool)
-{
- return containerOf(pool, struct _WsbmSlabPool , pool);
-}
-
-static inline struct _WsbmSlabPool *
-slabPoolFromBuf(struct _WsbmSlabBuffer *sBuf)
-{
- return slabPoolFromPool(sBuf->storage.pool);
-}
-
-static inline struct _WsbmSlabBuffer *
-slabBuffer(struct _WsbmBufStorage *buf)
-{
- return containerOf(buf, struct _WsbmSlabBuffer, storage);
-}
-
-
-/*
- * FIXME: Perhaps arrange timeout slabs in size buckets for fast
- * retreival??
- */
-
-
-static inline int
-wsbmTimeAfterEq(struct timeval *arg1, struct timeval *arg2)
-{
- return ((arg1->tv_sec > arg2->tv_sec) ||
- ((arg1->tv_sec == arg2->tv_sec) &&
- (arg1->tv_usec > arg2->tv_usec)));
-}
-
-static inline void
-wsbmTimeAdd(struct timeval *arg, struct timeval *add)
-{
- unsigned int sec;
-
- arg->tv_sec += add->tv_sec;
- arg->tv_usec += add->tv_usec;
- sec = arg->tv_usec / 1000000;
- arg->tv_sec += sec;
- arg->tv_usec -= sec*1000000;
-}
-
-#include <stdio.h>
-
-static void
-wsbmFreeKernelBO(struct _WsbmSlabKernelBO *kbo)
-{
- struct ttm_pl_reference_req arg;
- struct _WsbmSlabPool *slabPool;
-
- if (!kbo)
- return;
-
- fprintf(stderr, "Free kbo size %d\n", kbo->actualSize);
- slabPool = kbo->slabPool;
- arg.handle = kbo->kBuf.handle;
- (void) munmap(kbo->virtual, kbo->actualSize);
- (void) drmCommandWrite(slabPool->pool.fd, slabPool->devOffset + TTM_PL_UNREF,
- &arg, sizeof(arg));
- free(kbo);
-}
-
-
-static void
-wsbmFreeTimeoutKBOsLocked(struct _WsbmSlabCache *cache,
- struct timeval *time)
-{
- struct _WsbmListHead *list, *next;
- struct _WsbmSlabKernelBO *kbo;
-
- if (!wsbmTimeAfterEq(time, &cache->nextCheck))
- return;
-
- WSBMLISTFOREACHSAFE(list, next, &cache->timeoutList) {
- kbo = WSBMLISTENTRY(list, struct _WsbmSlabKernelBO, timeoutHead);
-
- if (!wsbmTimeAfterEq(time, &kbo->timeFreed))
- break;
-
- WSBMLISTDELINIT(&kbo->timeoutHead);
- WSBMLISTDELINIT(&kbo->head);
- wsbmFreeKernelBO(kbo);
- }
-
- cache->nextCheck = *time;
- wsbmTimeAdd(&cache->nextCheck, &cache->checkInterval);
-}
-
-
-/*
- * Add a _SlabKernelBO to the free slab manager.
- * This means that it is available for reuse, but if it's not
- * reused in a while, it will be freed.
- */
-
-static void
-wsbmSetKernelBOFree(struct _WsbmSlabCache *cache,
- struct _WsbmSlabKernelBO *kbo)
-{
- struct timeval time;
- struct timeval timeFreed;
-
- gettimeofday(&time, NULL);
- timeFreed = time;
- WSBM_MUTEX_LOCK(&cache->mutex);
- wsbmTimeAdd(&timeFreed, &cache->slabTimeout);
- kbo->timeFreed = timeFreed;
-
- if (kbo->kBuf.placement & TTM_PL_FLAG_CACHED)
- WSBMLISTADD(&kbo->head, &cache->cached);
- else
- WSBMLISTADD(&kbo->head, &cache->unCached);
-
- WSBMLISTADDTAIL(&kbo->timeoutHead, &cache->timeoutList);
- wsbmFreeTimeoutKBOsLocked(cache, &time);
-
- WSBM_MUTEX_UNLOCK(&cache->mutex);
-}
-
-/*
- * Get a _SlabKernelBO for us to use as storage for a slab.
- */
-
-
-static struct _WsbmSlabKernelBO *
-wsbmAllocKernelBO(struct _WsbmSlabSizeHeader *header)
-
-{
- struct _WsbmSlabPool *slabPool = header->slabPool;
- struct _WsbmSlabCache *cache = slabPool->cache;
- struct _WsbmListHead *list, *head;
- uint32_t size = header->bufSize * slabPool->desiredNumBuffers;
- struct _WsbmSlabKernelBO *kbo;
- struct _WsbmSlabKernelBO *kboTmp;
- int ret;
-
- /*
- * FIXME: We should perhaps allow some variation in slabsize in order
- * to efficiently reuse slabs.
- */
-
-
- size = (size <= slabPool->maxSlabSize) ? size : slabPool->maxSlabSize;
- if (size < header->bufSize)
- size = header->bufSize;
- size = (size + slabPool->pageSize - 1) & ~(slabPool->pageSize - 1);
- WSBM_MUTEX_LOCK(&cache->mutex);
-
- kbo = NULL;
-
- retry:
- head = (slabPool->proposedPlacement & TTM_PL_FLAG_CACHED) ?
- &cache->cached : &cache->unCached;
-
- WSBMLISTFOREACH(list, head) {
- kboTmp = WSBMLISTENTRY(list, struct _WsbmSlabKernelBO, head);
- if ((kboTmp->actualSize == size) &&
- (slabPool->pageAlignment == 0 ||
- (kboTmp->pageAlignment % slabPool->pageAlignment) == 0)) {
-
- if (!kbo)
- kbo = kboTmp;
-
- if ((kbo->proposedPlacement ^ slabPool->proposedPlacement) == 0)
- break;
-
- }
- }
-
- if (kbo) {
- WSBMLISTDELINIT(&kbo->head);
- WSBMLISTDELINIT(&kbo->timeoutHead);
- }
-
- WSBM_MUTEX_UNLOCK(&cache->mutex);
-
- if (kbo) {
- uint32_t new_mask = kbo->proposedPlacement ^ slabPool->proposedPlacement;
-
- ret = 0;
- if (new_mask) {
- union ttm_pl_setstatus_arg arg;
- struct ttm_pl_setstatus_req *req = &arg.req;
- struct ttm_pl_rep *rep = &arg.rep;
-
- req->handle = kbo->kBuf.handle;
- req->set_placement = slabPool->proposedPlacement & new_mask;
- req->clr_placement = ~slabPool->proposedPlacement & new_mask;
- DRMRESTARTCOMMANDWRITEREAD(slabPool->pool.fd,
- slabPool->devOffset + TTM_PL_SETSTATUS,
- arg, ret);
- if (ret == 0) {
- kbo->kBuf.gpuOffset = rep->gpu_offset;
- kbo->kBuf.placement = rep->placement;
- }
- kbo->proposedPlacement = slabPool->proposedPlacement;
- }
-
- if (ret == 0)
- return kbo;
-
- wsbmFreeKernelBO(kbo);
- kbo = NULL;
- goto retry;
- }
-
- fprintf(stderr, "New kbo 0x%08x size %d\n",
- slabPool->proposedPlacement, size);
- kbo = calloc(1, sizeof(*kbo));
- if (!kbo)
- return NULL;
-
- {
- union ttm_pl_create_arg arg;
-
- kbo->slabPool = slabPool;
- WSBMINITLISTHEAD(&kbo->head);
- WSBMINITLISTHEAD(&kbo->timeoutHead);
-
- arg.req.size = size;
- arg.req.placement = slabPool->proposedPlacement;
- arg.req.page_alignment = slabPool->pageAlignment;
-
- DRMRESTARTCOMMANDWRITEREAD(slabPool->pool.fd,
- slabPool->devOffset + TTM_PL_CREATE,
- arg, ret);
- if (ret)
- goto out_err0;
-
- kbo->kBuf.gpuOffset = arg.rep.gpu_offset;
- kbo->kBuf.placement = arg.rep.placement;
- kbo->kBuf.handle = arg.rep.handle;
-
- kbo->actualSize = arg.rep.bo_size;
- kbo->mapHandle = arg.rep.map_handle;
- kbo->proposedPlacement = slabPool->proposedPlacement;
- }
-
- kbo->virtual = mmap(0, kbo->actualSize,
- PROT_READ | PROT_WRITE, MAP_SHARED,
- slabPool->pool.fd, kbo->mapHandle);
-
- if (kbo->virtual == MAP_FAILED) {
- ret = -errno;
- goto out_err1;
- }
-
- return kbo;
-
- out_err1:
- {
- struct ttm_pl_reference_req arg =
- {.handle = kbo->kBuf.handle};
-
- (void) drmCommandWrite(slabPool->pool.fd,
- slabPool->devOffset + TTM_PL_UNREF,
- &arg, sizeof(arg));
- }
- out_err0:
- free(kbo);
- return NULL;
-}
-
-
-static int
-wsbmAllocSlab(struct _WsbmSlabSizeHeader *header)
-{
- struct _WsbmSlab *slab;
- struct _WsbmSlabBuffer *sBuf;
- uint32_t numBuffers;
- int ret;
- int i;
-
- slab = calloc(1, sizeof(*slab));
- if (!slab)
- return -ENOMEM;
-
- slab->kbo = wsbmAllocKernelBO(header);
- if (!slab->kbo) {
- ret = -ENOMEM;
- goto out_err0;
- }
-
- numBuffers = slab->kbo->actualSize / header->bufSize;
-
- slab->buffers = calloc(numBuffers, sizeof(*slab->buffers));
- if (!slab->buffers) {
- ret = -ENOMEM;
- goto out_err1;
- }
-
- WSBMINITLISTHEAD(&slab->head);
- WSBMINITLISTHEAD(&slab->freeBuffers);
- slab->numBuffers = numBuffers;
- slab->numFree = 0;
- slab->header = header;
-
- sBuf = slab->buffers;
- for (i=0; i < numBuffers; ++i) {
- ret = wsbmBufStorageInit(&sBuf->storage, &header->slabPool->pool);
- if (ret)
- goto out_err2;
- sBuf->parent = slab;
- sBuf->start = i* header->bufSize;
- sBuf->virtual = (void *) ((uint8_t *) slab->kbo->virtual +
- sBuf->start);
- wsbmAtomicSet(&sBuf->writers, 0);
- sBuf->isSlabBuffer = 1;
- WSBM_COND_INIT(&sBuf->event);
- WSBMLISTADDTAIL(&sBuf->head, &slab->freeBuffers);
- slab->numFree++;
- sBuf++;
- }
-
- WSBMLISTADDTAIL(&slab->head, &header->slabs);
-
- return 0;
-
- out_err2:
- sBuf = slab->buffers;
- for (i=0; i < numBuffers; ++i) {
- if (sBuf->parent == slab) {
- WSBM_COND_FREE(&sBuf->event);
- wsbmBufStorageTakedown(&sBuf->storage);
- }
- sBuf++;
- }
- out_err1:
- wsbmSetKernelBOFree(header->slabPool->cache, slab->kbo);
- free(slab->buffers);
- out_err0:
- free(slab);
- return ret;
-}
-
-/*
- * Delete a buffer from the slab header delayed list and put
- * it on the slab free list.
- */
-
-static void
-wsbmSlabFreeBufferLocked(struct _WsbmSlabBuffer *buf)
-{
- struct _WsbmSlab *slab = buf->parent;
- struct _WsbmSlabSizeHeader *header = slab->header;
- struct _WsbmListHead *list = &buf->head;
-
- WSBMLISTDEL(list);
- WSBMLISTADDTAIL(list, &slab->freeBuffers);
- slab->numFree++;
-
- if (slab->head.next == &slab->head)
- WSBMLISTADDTAIL(&slab->head, &header->slabs);
-
- if (slab->numFree == slab->numBuffers) {
- list = &slab->head;
- WSBMLISTDEL(list);
- WSBMLISTADDTAIL(list, &header->freeSlabs);
- }
-
- if (header->slabs.next == &header->slabs ||
- slab->numFree != slab->numBuffers) {
-
- struct _WsbmListHead *next;
- struct _WsbmSlabCache *cache = header->slabPool->cache;
-
- WSBMLISTFOREACHSAFE(list, next, &header->freeSlabs) {
- int i;
- struct _WsbmSlabBuffer *sBuf;
-
- slab = WSBMLISTENTRY(list, struct _WsbmSlab, head);
- WSBMLISTDELINIT(list);
-
- sBuf = slab->buffers;
- for (i=0; i < slab->numBuffers; ++i) {
- if (sBuf->parent == slab) {
- WSBM_COND_FREE(&sBuf->event);
- wsbmBufStorageTakedown(&sBuf->storage);
- }
- sBuf++;
- }
- wsbmSetKernelBOFree(cache, slab->kbo);
- free(slab->buffers);
- free(slab);
- }
- }
-}
-
-static void
-wsbmSlabCheckFreeLocked(struct _WsbmSlabSizeHeader *header, int wait)
-{
- struct _WsbmListHead *list, *prev, *first;
- struct _WsbmSlabBuffer *sBuf;
- struct _WsbmSlab *slab;
- int firstWasSignaled = 1;
- int signaled;
- int i;
- int ret;
-
- /*
- * Rerun the freeing test if the youngest tested buffer
- * was signaled, since there might be more idle buffers
- * in the delay list.
- */
-
- while (firstWasSignaled) {
- firstWasSignaled = 0;
- signaled = 0;
- first = header->delayedBuffers.next;
-
- /* Only examine the oldest 1/3 of delayed buffers:
- */
- if (header->numDelayed > 3) {
- for (i = 0; i < header->numDelayed; i += 3) {
- first = first->next;
- }
- }
-
- /*
- * No need to take the buffer mutex for each buffer we loop
- * through since we're currently the only user.
- */
-
-
- WSBMLISTFOREACHPREVSAFE(list, prev, first->next) {
-
- if (list == &header->delayedBuffers)
- break;
-
- sBuf = WSBMLISTENTRY(list, struct _WsbmSlabBuffer, head);
- slab = sBuf->parent;
-
- if (!signaled) {
- if (wait) {
- ret = wsbmFenceFinish(sBuf->fence, sBuf->fenceType, 0);
- if (ret)
- break;
- signaled = 1;
- wait = 0;
- } else {
- signaled = wsbmFenceSignaled(sBuf->fence, sBuf->fenceType);
-#ifdef DEBUG_FENCESIGNALED
- fencesignaled++;
-#endif
- }
- if (signaled) {
- if (list == first)
- firstWasSignaled = 1;
- wsbmFenceUnReference(&sBuf->fence);
- header->numDelayed--;
- wsbmSlabFreeBufferLocked(sBuf);
- } else
- break;
- } else if (wsbmFenceSignaledCached(sBuf->fence, sBuf->fenceType)) {
- wsbmFenceUnReference(&sBuf->fence);
- header->numDelayed--;
- wsbmSlabFreeBufferLocked(sBuf);
- }
- }
- }
-}
-
-
-static struct _WsbmSlabBuffer *
-wsbmSlabAllocBuffer(struct _WsbmSlabSizeHeader *header)
-{
- static struct _WsbmSlabBuffer *buf;
- struct _WsbmSlab *slab;
- struct _WsbmListHead *list;
- int count = WSBM_SLABPOOL_ALLOC_RETRIES;
-
- WSBM_MUTEX_LOCK(&header->mutex);
- while(header->slabs.next == &header->slabs && count > 0) {
- wsbmSlabCheckFreeLocked(header, 0);
- if (header->slabs.next != &header->slabs)
- break;
-
- WSBM_MUTEX_UNLOCK(&header->mutex);
- if (count != WSBM_SLABPOOL_ALLOC_RETRIES)
- usleep(1000);
- WSBM_MUTEX_LOCK(&header->mutex);
- (void) wsbmAllocSlab(header);
- count--;
- }
-
- list = header->slabs.next;
- if (list == &header->slabs) {
- WSBM_MUTEX_UNLOCK(&header->mutex);
- return NULL;
- }
- slab = WSBMLISTENTRY(list, struct _WsbmSlab, head);
- if (--slab->numFree == 0)
- WSBMLISTDELINIT(list);
-
- list = slab->freeBuffers.next;
- WSBMLISTDELINIT(list);
-
- WSBM_MUTEX_UNLOCK(&header->mutex);
- buf = WSBMLISTENTRY(list, struct _WsbmSlabBuffer, head);
-
-#ifdef DEBUG_FENCESIGNALED
- createbuffer++;
- if ((createbuffer % 1000) == 0)
- _mesa_printf("Createbuffer %d fencesignaled %d\n",
- createbuffer, fencesignaled);
-#endif
- return buf;
-}
-
-static struct _WsbmBufStorage *
-pool_create(struct _WsbmBufferPool *pool, unsigned long size,
- uint32_t placement, unsigned alignment)
-{
- struct _WsbmSlabPool *slabPool = slabPoolFromPool(pool);
- struct _WsbmSlabSizeHeader *header;
- struct _WsbmSlabBuffer *sBuf;
- int i;
- int ret;
-
- /*
- * FIXME: Check for compatibility.
- */
-
- header = slabPool->headers;
- for (i=0; i<slabPool->numBuckets; ++i) {
- if (header->bufSize >= size)
- break;
- header++;
- }
-
- if (i < slabPool->numBuckets) {
- sBuf = wsbmSlabAllocBuffer(header);
- return ((sBuf) ? &sBuf->storage : NULL);
- }
-
-
- /*
- * Fall back to allocate a buffer object directly from DRM.
- * and wrap it in a wsbmBO structure.
- */
-
- sBuf = calloc(1, sizeof(*sBuf));
-
- if (!sBuf)
- return NULL;
-
- if (alignment) {
- if ((alignment < slabPool->pageSize) && (slabPool->pageSize % alignment))
- goto out_err0;
- if ((alignment > slabPool->pageSize) && (alignment % slabPool->pageSize))
- goto out_err0;
- }
-
- ret = wsbmBufStorageInit(&sBuf->storage, &header->slabPool->pool);
- if (ret)
- goto out_err0;
-
- ret = WSBM_COND_INIT(&sBuf->event);
- if (ret)
- goto out_err1;
-
- {
- union ttm_pl_create_arg arg;
-
- arg.req.size = size;
- arg.req.placement = placement;
- arg.req.page_alignment = alignment / slabPool->pageSize;
-
- DRMRESTARTCOMMANDWRITEREAD(pool->fd,
- slabPool->devOffset + TTM_PL_CREATE,
- arg, ret);
-
- if (ret)
- goto out_err2;
-
- sBuf->kBuf.gpuOffset = arg.rep.gpu_offset;
- sBuf->kBuf.placement = arg.rep.placement;
- sBuf->kBuf.handle = arg.rep.handle;
- sBuf->mapHandle = arg.rep.map_handle;
- sBuf->requestedSize = size;
-
- sBuf->virtual = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED,
- pool->fd, sBuf->mapHandle);
-
- if (sBuf->virtual == MAP_FAILED)
- goto out_err3;
-
- }
-
- wsbmAtomicSet(&sBuf->writers, 0);
- return &sBuf->storage;
- out_err3:
- {
- struct ttm_pl_reference_req arg;
-
- arg.handle = sBuf->kBuf.handle;
- (void) drmCommandWriteRead(pool->fd,
- slabPool->devOffset + TTM_PL_UNREF,
- &arg, sizeof(arg));
- }
- out_err2:
- WSBM_COND_FREE(&sBuf->event);
- out_err1:
- wsbmBufStorageTakedown(&sBuf->storage);
- out_err0:
- free(sBuf);
- return NULL;
-}
-
-static void
-pool_destroy(struct _WsbmBufStorage **p_buf)
-{
- struct _WsbmBufStorage *buf = *p_buf;
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
- struct _WsbmSlab *slab;
- struct _WsbmSlabSizeHeader *header;
-
- *p_buf = NULL;
-
- if (!sBuf->isSlabBuffer) {
- struct _WsbmSlabPool *slabPool = slabPoolFromBuf(sBuf);
- struct ttm_pl_reference_req arg;
-
- if (sBuf->virtual != NULL) {
- (void) munmap(sBuf->virtual, sBuf->requestedSize);
- sBuf->virtual = NULL;
- }
-
- arg.handle = sBuf->kBuf.handle;
- (void) drmCommandWrite(slabPool->pool.fd,
- slabPool->devOffset + TTM_PL_UNREF,
- &arg, sizeof(arg));
-
- WSBM_COND_FREE(&sBuf->event);
- wsbmBufStorageTakedown(&sBuf->storage);
- free(sBuf);
- return;
- }
-
- slab = sBuf->parent;
- header = slab->header;
-
- /*
- * No need to take the buffer mutex below since we're the only user.
- */
-
- WSBM_MUTEX_LOCK(&header->mutex);
- sBuf->unFenced = 0;
- wsbmAtomicSet(&sBuf->writers, 0);
- wsbmAtomicSet(&sBuf->storage.refCount, 1);
-
- if (sBuf->fence && !wsbmFenceSignaledCached(sBuf->fence, sBuf->fenceType)) {
- WSBMLISTADDTAIL(&sBuf->head, &header->delayedBuffers);
- header->numDelayed++;
- } else {
- if (sBuf->fence)
- wsbmFenceUnReference(&sBuf->fence);
- wsbmSlabFreeBufferLocked(sBuf);
- }
-
- WSBM_MUTEX_UNLOCK(&header->mutex);
-}
-
-
-static void
-waitIdleLocked(struct _WsbmSlabBuffer *sBuf, int lazy)
-{
- struct _WsbmBufStorage *storage = &sBuf->storage;
-
- while(sBuf->unFenced || sBuf->fence != NULL) {
-
- if (sBuf->unFenced)
- WSBM_COND_WAIT(&sBuf->event, &storage->mutex);
-
- if (sBuf->fence != NULL) {
- if (!wsbmFenceSignaled(sBuf->fence, sBuf->fenceType)) {
- struct _WsbmFenceObject *fence =
- wsbmFenceReference(sBuf->fence);
-
- WSBM_MUTEX_UNLOCK(&storage->mutex);
- (void) wsbmFenceFinish(fence, sBuf->fenceType, lazy);
- WSBM_MUTEX_LOCK(&storage->mutex);
- if (sBuf->fence == fence)
- wsbmFenceUnReference(&sBuf->fence);
-
- wsbmFenceUnReference(&fence);
- } else {
- wsbmFenceUnReference(&sBuf->fence);
- }
- }
- }
-}
-
-static int
-pool_waitIdle(struct _WsbmBufStorage *buf, int lazy)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- WSBM_MUTEX_LOCK(&buf->mutex);
- waitIdleLocked(sBuf, lazy);
- WSBM_MUTEX_UNLOCK(&buf->mutex);
-
- return 0;
-}
-
-static int
-pool_map(struct _WsbmBufStorage *buf, unsigned mode, void **virtual)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- *virtual = sBuf->virtual;
-
- return 0;
-}
-
-static void
-pool_releaseFromCpu(struct _WsbmBufStorage *buf, unsigned mode)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- if (wsbmAtomicDecZero(&sBuf->writers))
- WSBM_COND_BROADCAST(&sBuf->event);
-}
-
-static int
-pool_syncForCpu(struct _WsbmBufStorage *buf, unsigned mode)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
- int ret = 0;
-
- WSBM_MUTEX_LOCK(&buf->mutex);
- if ((mode & WSBM_SYNCCPU_DONT_BLOCK)) {
- int signaled;
-
- if (sBuf->unFenced) {
- ret = -EBUSY;
- goto out_unlock;
- }
-
- if (sBuf->isSlabBuffer)
- signaled = (sBuf->fence == NULL) ||
- wsbmFenceSignaledCached(sBuf->fence, sBuf->fenceType);
- else
- signaled = (sBuf->fence == NULL) ||
- wsbmFenceSignaled(sBuf->fence, sBuf->fenceType);
-
- ret = 0;
- if (signaled) {
- wsbmFenceUnReference(&sBuf->fence);
- wsbmAtomicInc(&sBuf->writers);
- } else
- ret = -EBUSY;
- goto out_unlock;
- }
- waitIdleLocked(sBuf, 0);
- wsbmAtomicInc(&sBuf->writers);
- out_unlock:
- WSBM_MUTEX_UNLOCK(&buf->mutex);
- return ret;
-}
-
-static void
-pool_unmap(struct _WsbmBufStorage *buf)
-{
- ;
-}
-
-static unsigned long
-pool_poolOffset(struct _WsbmBufStorage *buf)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- return sBuf->start;
-}
-
-static unsigned long
-pool_size(struct _WsbmBufStorage *buf)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
- if (!sBuf->isSlabBuffer)
- return sBuf->requestedSize;
-
- return sBuf->parent->header->bufSize;
-}
-
-static struct _WsbmKernelBuf *
-pool_kernel(struct _WsbmBufStorage *buf)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- return (sBuf->isSlabBuffer) ? &sBuf->parent->kbo->kBuf : &sBuf->kBuf;
-}
-
-
-static unsigned long
-pool_offset(struct _WsbmBufStorage *buf)
-{
- return pool_kernel(buf)->gpuOffset + pool_poolOffset(buf);
-}
-
-
-static void
-pool_fence(struct _WsbmBufStorage *buf, struct _WsbmFenceObject *fence)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
- struct _WsbmKernelBuf *kBuf;
-
- WSBM_MUTEX_LOCK(&buf->mutex);
- if (sBuf->fence)
- wsbmFenceUnReference(&sBuf->fence);
-
- sBuf->fence = wsbmFenceReference(fence);
- kBuf = pool_kernel(buf);
- sBuf->fenceType = kBuf->fence_type_mask;
- sBuf->unFenced = 0;
- WSBM_COND_BROADCAST(&sBuf->event);
- WSBM_MUTEX_UNLOCK(&buf->mutex);
-}
-
-static int
-pool_validate(struct _WsbmBufStorage *buf,
- uint64_t set_flags,
- uint64_t clr_flags)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- WSBM_MUTEX_LOCK(&buf->mutex);
- while(wsbmAtomicRead(&sBuf->writers) != 0) {
- WSBM_COND_WAIT(&sBuf->event, &buf->mutex);
- }
-
- sBuf->unFenced = 1;
- WSBM_MUTEX_UNLOCK(&buf->mutex);
- return 0;
-}
-
-static void
-pool_unvalidate(struct _WsbmBufStorage *buf)
-{
- struct _WsbmSlabBuffer *sBuf = slabBuffer(buf);
-
- WSBM_MUTEX_LOCK(&buf->mutex);
- if (sBuf->unFenced) {
- sBuf->unFenced = 0;
- WSBM_COND_BROADCAST(&sBuf->event);
- }
- WSBM_MUTEX_UNLOCK(&buf->mutex);
-}
-
-struct _WsbmSlabCache *
-wsbmSlabCacheInit(uint32_t checkIntervalMsec, uint32_t slabTimeoutMsec)
-{
- struct _WsbmSlabCache *tmp;
-
- tmp = calloc(1, sizeof(*tmp));
- if (!tmp)
- return NULL;
-
- WSBM_MUTEX_INIT(&tmp->mutex);
- WSBM_MUTEX_LOCK(&tmp->mutex);
- tmp->slabTimeout.tv_usec = slabTimeoutMsec*1000;
- tmp->slabTimeout.tv_sec = tmp->slabTimeout.tv_usec / 1000000;
- tmp->slabTimeout.tv_usec -= tmp->slabTimeout.tv_sec*1000000;
-
- tmp->checkInterval.tv_usec = checkIntervalMsec*1000;
- tmp->checkInterval.tv_sec = tmp->checkInterval.tv_usec / 1000000;
- tmp->checkInterval.tv_usec -= tmp->checkInterval.tv_sec*1000000;
-
- gettimeofday(&tmp->nextCheck, NULL);
- wsbmTimeAdd(&tmp->nextCheck, &tmp->checkInterval);
- WSBMINITLISTHEAD(&tmp->timeoutList);
- WSBMINITLISTHEAD(&tmp->unCached);
- WSBMINITLISTHEAD(&tmp->cached);
- WSBM_MUTEX_UNLOCK(&tmp->mutex);
-
- return tmp;
-}
-
-void
-wsbmSlabCacheFinish(struct _WsbmSlabCache *cache)
-{
- struct timeval time;
-
- time = cache->nextCheck;
- WSBM_MUTEX_LOCK(&cache->mutex);
- wsbmTimeAdd(&time, &cache->checkInterval);
- wsbmFreeTimeoutKBOsLocked(cache, &time);
- WSBM_MUTEX_UNLOCK(&cache->mutex);
-
- assert(cache->timeoutList.next == &cache->timeoutList);
- assert(cache->unCached.next == &cache->unCached);
- assert(cache->cached.next == &cache->cached);
-
- WSBM_MUTEX_FREE(&cache->mutex);
- free(cache);
-}
-
-static void
-wsbmInitSizeHeader(struct _WsbmSlabPool *slabPool, uint32_t size,
- struct _WsbmSlabSizeHeader *header)
-{
- WSBM_MUTEX_INIT(&header->mutex);
- WSBM_MUTEX_LOCK(&header->mutex);
-
- WSBMINITLISTHEAD(&header->slabs);
- WSBMINITLISTHEAD(&header->freeSlabs);
- WSBMINITLISTHEAD(&header->delayedBuffers);
-
- header->numDelayed = 0;
- header->slabPool = slabPool;
- header->bufSize = size;
-
- WSBM_MUTEX_UNLOCK(&header->mutex);
-}
-
-static void
-wsbmFinishSizeHeader(struct _WsbmSlabSizeHeader *header)
-{
- struct _WsbmListHead *list, *next;
- struct _WsbmSlabBuffer *sBuf;
-
- WSBM_MUTEX_LOCK(&header->mutex);
- WSBMLISTFOREACHSAFE(list, next, &header->delayedBuffers) {
- sBuf = WSBMLISTENTRY(list, struct _WsbmSlabBuffer, head);
- if (sBuf->fence) {
- (void) wsbmFenceFinish(sBuf->fence, sBuf->fenceType, 0);
- wsbmFenceUnReference(&sBuf->fence);
- }
- header->numDelayed--;
- wsbmSlabFreeBufferLocked(sBuf);
- }
- WSBM_MUTEX_UNLOCK(&header->mutex);
- WSBM_MUTEX_FREE(&header->mutex);
-}
-
-
-static void
-pool_takedown(struct _WsbmBufferPool *pool)
-{
- struct _WsbmSlabPool *slabPool = slabPoolFromPool(pool);
- int i;
-
- for (i=0; i<slabPool->numBuckets; ++i) {
- wsbmFinishSizeHeader(&slabPool->headers[i]);
- }
-
- free(slabPool->headers);
- free(slabPool->bucketSizes);
- free(slabPool);
-}
-
-struct _WsbmBufferPool *
-wsbmSlabPoolInit(int fd,
- uint32_t devOffset,
- uint32_t placement,
- uint32_t validMask,
- uint32_t smallestSize,
- uint32_t numSizes,
- uint32_t desiredNumBuffers,
- uint32_t maxSlabSize,
- uint32_t pageAlignment,
- struct _WsbmSlabCache *cache)
-{
- struct _WsbmBufferPool *pool;
- struct _WsbmSlabPool *slabPool;
- uint32_t i;
-
- slabPool = calloc(1, sizeof(*slabPool));
- if (!slabPool)
- return NULL;
-
- pool = &slabPool->pool;
-
- slabPool->bucketSizes = calloc(numSizes, sizeof(*slabPool->bucketSizes));
- if (!slabPool->bucketSizes)
- goto out_err0;
-
- slabPool->headers = calloc(numSizes, sizeof(*slabPool->headers));
- if (!slabPool->headers)
- goto out_err1;
-
- slabPool->devOffset = devOffset;
- slabPool->cache = cache;
- slabPool->proposedPlacement = placement;
- slabPool->validMask = validMask;
- slabPool->numBuckets = numSizes;
- slabPool->pageSize = getpagesize();
- slabPool->pageAlignment = pageAlignment;
- slabPool->maxSlabSize = maxSlabSize;
- slabPool->desiredNumBuffers = desiredNumBuffers;
-
- for (i=0; i<slabPool->numBuckets; ++i) {
- slabPool->bucketSizes[i] = (smallestSize << i);
- wsbmInitSizeHeader(slabPool, slabPool->bucketSizes[i],
- &slabPool->headers[i]);
- }
-
- pool->fd = fd;
- pool->map = &pool_map;
- pool->unmap = &pool_unmap;
- pool->destroy = &pool_destroy;
- pool->offset = &pool_offset;
- pool->poolOffset = &pool_poolOffset;
- pool->size = &pool_size;
- pool->create = &pool_create;
- pool->fence = &pool_fence;
- pool->kernel = &pool_kernel;
- pool->validate = &pool_validate;
- pool->unvalidate = &pool_unvalidate;
- pool->waitIdle = &pool_waitIdle;
- pool->takeDown = &pool_takedown;
- pool->releasefromcpu = &pool_releaseFromCpu;
- pool->syncforcpu = &pool_syncForCpu;
-
- return pool;
-
- out_err1:
- free(slabPool->bucketSizes);
- out_err0:
- free(slabPool);
-
- return NULL;
-}
diff --git a/src/wsbm_ttmpool.c b/src/wsbm_ttmpool.c
index c8dd482..ff132e0 100644
--- a/src/wsbm_ttmpool.c
+++ b/src/wsbm_ttmpool.c
@@ -2,6 +2,8 @@
*
* Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, Tx., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_userpool.c b/src/wsbm_userpool.c
index e859662..e91ba98 100644
--- a/src/wsbm_userpool.c
+++ b/src/wsbm_userpool.c
@@ -2,6 +2,8 @@
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
* All Rights Reserved.
+ * Copyright 2009 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -11,6 +13,10 @@
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
@@ -19,11 +25,6 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
**************************************************************************/
/*
* Authors: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
diff --git a/src/wsbm_util.h b/src/wsbm_util.h
index 55361e8..13212c1 100644
--- a/src/wsbm_util.h
+++ b/src/wsbm_util.h
@@ -1,5 +1,5 @@
/*
- * This file is not copyrighted for obvious reasons.
+ * This file is not copyrighted.
*/
#ifndef _WSBM_UTIL_H_