Adding patch for getting O_DIRECT to work on linux; also enabling in build of BDB
This commit is contained in:
parent
fb9230ffb9
commit
ce393ba7b2
2 changed files with 135 additions and 1 deletions
133
c_src/bdb-align.patch
Normal file
133
c_src/bdb-align.patch
Normal file
|
@ -0,0 +1,133 @@
|
|||
--- dbinc/mp.h.orig 2006-09-07 14:31:58.000000000 -0700
|
||||
+++ dbinc/mp.h 2007-01-06 19:14:56.000000000 -0800
|
||||
@@ -378,6 +378,23 @@
|
||||
#define BH_FREE_REUSE 0x02
|
||||
#define BH_FREE_UNLOCKED 0x04
|
||||
|
||||
+#ifdef DIAG_MVCC
|
||||
+#define BH_ALIGNED
|
||||
+#define VM_PAGESIZE 4096
|
||||
+#endif
|
||||
+
|
||||
+/* Linux O_DIRECT needs aligned buffers. 2.6 kernel allows 512 byte
|
||||
+ * alignment, otherwise need page sized (4096).
|
||||
+ */
|
||||
+#if defined(linux) && !defined(BH_ALIGNED)
|
||||
+#define BH_ALIGNED
|
||||
+#ifdef LINUX_NEEDS_PAGE_ALIGNMENT
|
||||
+#define VM_PAGESIZE 4096
|
||||
+#else /* Linux 2.6+ */
|
||||
+#define VM_PAGESIZE 512
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* BH --
|
||||
* Buffer header.
|
||||
@@ -404,7 +421,7 @@
|
||||
|
||||
roff_t td_off; /* MVCC: creating TXN_DETAIL offset. */
|
||||
SH_CHAIN_ENTRY vc; /* MVCC: version chain. */
|
||||
-#ifdef DIAG_MVCC
|
||||
+#ifdef BH_ALIGNED
|
||||
u_int16_t align_off; /* Alignment offset for diagnostics.*/
|
||||
#endif
|
||||
|
||||
@@ -465,15 +482,14 @@
|
||||
(dbc->txn != NULL && F_ISSET(dbc->txn, TXN_SNAPSHOT) && \
|
||||
dbc->txn->td != NULL && __memp_skip_curadj(dbc, pgno))
|
||||
|
||||
-#if defined(DIAG_MVCC) && defined(HAVE_MPROTECT)
|
||||
-#define VM_PAGESIZE 4096
|
||||
-#define MVCC_BHSIZE(mfp, sz) do { \
|
||||
+#ifdef BH_ALIGNED
|
||||
+#define BHSIZE(mfp, sz) do { \
|
||||
sz += VM_PAGESIZE + sizeof(BH); \
|
||||
if (mfp->stat.st_pagesize < VM_PAGESIZE) \
|
||||
sz += VM_PAGESIZE - mfp->stat.st_pagesize; \
|
||||
} while (0)
|
||||
|
||||
-#define MVCC_BHALIGN(mfp, p) do { \
|
||||
+#define BHALIGN(mfp, p) do { \
|
||||
if (mfp != NULL) { \
|
||||
BH *__bhp; \
|
||||
void *__orig = (p); \
|
||||
@@ -493,13 +509,19 @@
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
-#define MVCC_BHUNALIGN(mfp, p) do { \
|
||||
+#define BHUNALIGN(mfp, p) do { \
|
||||
if ((mfp) != NULL) { \
|
||||
BH *bhp = (BH *)(p); \
|
||||
(p) = ((u_int8_t *)bhp - bhp->align_off); \
|
||||
} \
|
||||
} while (0)
|
||||
+#else
|
||||
+#define BHSIZE(mfp, sz) do {} while (0)
|
||||
+#define BHALIGN(mfp, p) do {} while (0)
|
||||
+#define BHUNALIGN(mfp, p) do {} while (0)
|
||||
+#endif
|
||||
|
||||
+#if defined(DIAG_MVCC) && defined(HAVE_MPROTECT)
|
||||
#ifdef linux
|
||||
#define MVCC_MPROTECT(buf, sz, mode) do { \
|
||||
int __ret = mprotect((buf), (sz), (mode)); \
|
||||
@@ -513,11 +535,7 @@
|
||||
} \
|
||||
} while (0)
|
||||
#endif /* linux */
|
||||
-
|
||||
-#else /* defined(DIAG_MVCC) && defined(HAVE_MPROTECT) */
|
||||
-#define MVCC_BHSIZE(mfp, sz) do {} while (0)
|
||||
-#define MVCC_BHALIGN(mfp, p) do {} while (0)
|
||||
-#define MVCC_BHUNALIGN(mfp, p) do {} while (0)
|
||||
+#else
|
||||
#define MVCC_MPROTECT(buf, size, mode) do {} while (0)
|
||||
#endif
|
||||
|
||||
--- mp/mp_alloc.c.orig 2006-09-07 14:32:03.000000000 -0700
|
||||
+++ mp/mp_alloc.c 2007-01-06 19:14:56.000000000 -0800
|
||||
@@ -66,7 +66,7 @@
|
||||
if (mfp != NULL) {
|
||||
len = SSZA(BH, buf) + mfp->stat.st_pagesize;
|
||||
/* Add space for alignment padding for MVCC diagnostics. */
|
||||
- MVCC_BHSIZE(mfp, len);
|
||||
+ BHSIZE(mfp, len);
|
||||
}
|
||||
|
||||
MPOOL_REGION_LOCK(dbenv, infop);
|
||||
@@ -91,10 +91,10 @@
|
||||
c_mp->stat.st_pages++;
|
||||
MPOOL_REGION_UNLOCK(dbenv, infop);
|
||||
/*
|
||||
- * For MVCC diagnostics, align the pointer so that the buffer
|
||||
+ * If necessary, align the pointer so that the buffer
|
||||
* starts on a page boundary.
|
||||
*/
|
||||
- MVCC_BHALIGN(mfp, p);
|
||||
+ BHALIGN(mfp, p);
|
||||
|
||||
found: if (offsetp != NULL)
|
||||
*offsetp = R_OFFSET(infop, p);
|
||||
@@ -447,7 +447,7 @@
|
||||
MPOOLFILE *mfp;
|
||||
void *buf;
|
||||
{
|
||||
- MVCC_BHUNALIGN(mfp, buf);
|
||||
+ BHUNALIGN(mfp, buf);
|
||||
COMPQUIET(mfp, NULL);
|
||||
__db_shalloc_free(infop, buf);
|
||||
}
|
||||
--- mp/mp_fget.c.orig 2006-09-13 09:22:42.000000000 -0700
|
||||
+++ mp/mp_fget.c 2007-01-06 19:14:56.000000000 -0800
|
||||
@@ -708,7 +708,7 @@
|
||||
* the hash bucket's priority.
|
||||
*/
|
||||
/*lint --e{668} (flexelint: bhp cannot be NULL). */
|
||||
-#ifdef DIAG_MVCC
|
||||
+#ifdef BH_ALIGNED
|
||||
memset(bhp, 0, SSZ(BH, align_off));
|
||||
#else
|
||||
memset(bhp, 0, sizeof(BH));
|
||||
|
|
@ -19,8 +19,9 @@ rm -rf system db-${DB_VER}
|
|||
|
||||
## Untar and build everything
|
||||
tar -xzf db-${DB_VER}.tar.gz && \
|
||||
(cd db-${DB_VER} && patch -p0 < ../bdb-align.patch ) && \
|
||||
(cd db-${DB_VER}/build_unix && \
|
||||
../dist/configure --prefix=$WORKDIR --disable-shared --with-pic && make && ranlib libdb-*.a && make install) && \
|
||||
../dist/configure --prefix=$WORKDIR --disable-shared --enable-o_direct --with-pic && make && ranlib libdb-*.a && make install) && \
|
||||
mkdir -p $TARGETDIR/utils && \
|
||||
rm -rf db-${DB_VER}
|
||||
|
||||
|
|
Loading…
Reference in a new issue