Adding patch for getting O_DIRECT to work on linux; also enabling in build of BDB

This commit is contained in:
Dave Smith 2009-04-22 14:42:58 -06:00
parent fb9230ffb9
commit ce393ba7b2
2 changed files with 135 additions and 1 deletions

133
c_src/bdb-align.patch Normal file
View 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));

View file

@ -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}