[PATCH] JFS: reduce number of synchronous transactions
Use an inline pxd list rather than an xad list in the xadlock. When the number of extents being modified can fit with the xadlock, a transaction can be committed asynchronously. Using a list of pxd's instead of xad's allows us to fit 4 extents, rather than 2. Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
ac09f698f1
Коммит
66f3131f54
|
@ -1712,7 +1712,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
struct maplock *maplock;
|
||||
struct xdlistlock *xadlock;
|
||||
struct pxd_lock *pxdlock;
|
||||
pxd_t *pxd;
|
||||
pxd_t *page_pxd;
|
||||
int next, lwm, hwm;
|
||||
|
||||
ip = tlck->ip;
|
||||
|
@ -1722,7 +1722,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
lrd->log.redopage.type = cpu_to_le16(LOG_XTREE);
|
||||
lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE);
|
||||
|
||||
pxd = &lrd->log.redopage.pxd;
|
||||
page_pxd = &lrd->log.redopage.pxd;
|
||||
|
||||
if (tlck->type & tlckBTROOT) {
|
||||
lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT);
|
||||
|
@ -1752,9 +1752,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
* applying the after-image to the meta-data page.
|
||||
*/
|
||||
lrd->type = cpu_to_le16(LOG_REDOPAGE);
|
||||
// *pxd = mp->cm_pxd;
|
||||
PXDaddress(pxd, mp->index);
|
||||
PXDlength(pxd,
|
||||
// *page_pxd = mp->cm_pxd;
|
||||
PXDaddress(page_pxd, mp->index);
|
||||
PXDlength(page_pxd,
|
||||
mp->logical_size >> tblk->sb->s_blocksize_bits);
|
||||
lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck));
|
||||
|
||||
|
@ -1776,25 +1776,31 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
tlck->flag |= tlckUPDATEMAP;
|
||||
xadlock->flag = mlckALLOCXADLIST;
|
||||
xadlock->count = next - lwm;
|
||||
if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) {
|
||||
if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) {
|
||||
int i;
|
||||
pxd_t *pxd;
|
||||
/*
|
||||
* Lazy commit may allow xtree to be modified before
|
||||
* txUpdateMap runs. Copy xad into linelock to
|
||||
* preserve correct data.
|
||||
*
|
||||
* We can fit twice as may pxd's as xads in the lock
|
||||
*/
|
||||
xadlock->xdlist = &xtlck->pxdlock;
|
||||
memcpy(xadlock->xdlist, &p->xad[lwm],
|
||||
sizeof(xad_t) * xadlock->count);
|
||||
|
||||
for (i = 0; i < xadlock->count; i++)
|
||||
xadlock->flag = mlckALLOCPXDLIST;
|
||||
pxd = xadlock->xdlist = &xtlck->pxdlock;
|
||||
for (i = 0; i < xadlock->count; i++) {
|
||||
PXDaddress(pxd, addressXAD(&p->xad[lwm + i]));
|
||||
PXDlength(pxd, lengthXAD(&p->xad[lwm + i]));
|
||||
p->xad[lwm + i].flag &=
|
||||
~(XAD_NEW | XAD_EXTENDED);
|
||||
pxd++;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* xdlist will point to into inode's xtree, ensure
|
||||
* that transaction is not committed lazily.
|
||||
*/
|
||||
xadlock->flag = mlckALLOCXADLIST;
|
||||
xadlock->xdlist = &p->xad[lwm];
|
||||
tblk->xflag &= ~COMMIT_LAZY;
|
||||
}
|
||||
|
@ -1836,8 +1842,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
if (tblk->xflag & COMMIT_TRUNCATE) {
|
||||
/* write NOREDOPAGE for the page */
|
||||
lrd->type = cpu_to_le16(LOG_NOREDOPAGE);
|
||||
PXDaddress(pxd, mp->index);
|
||||
PXDlength(pxd,
|
||||
PXDaddress(page_pxd, mp->index);
|
||||
PXDlength(page_pxd,
|
||||
mp->logical_size >> tblk->sb->
|
||||
s_blocksize_bits);
|
||||
lrd->backchain =
|
||||
|
@ -1872,22 +1878,32 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
* deleted page itself;
|
||||
*/
|
||||
tlck->flag |= tlckUPDATEMAP;
|
||||
xadlock->flag = mlckFREEXADLIST;
|
||||
xadlock->count = hwm - XTENTRYSTART + 1;
|
||||
if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) {
|
||||
if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) {
|
||||
int i;
|
||||
pxd_t *pxd;
|
||||
/*
|
||||
* Lazy commit may allow xtree to be modified before
|
||||
* txUpdateMap runs. Copy xad into linelock to
|
||||
* preserve correct data.
|
||||
*
|
||||
* We can fit twice as may pxd's as xads in the lock
|
||||
*/
|
||||
xadlock->xdlist = &xtlck->pxdlock;
|
||||
memcpy(xadlock->xdlist, &p->xad[XTENTRYSTART],
|
||||
sizeof(xad_t) * xadlock->count);
|
||||
xadlock->flag = mlckFREEPXDLIST;
|
||||
pxd = xadlock->xdlist = &xtlck->pxdlock;
|
||||
for (i = 0; i < xadlock->count; i++) {
|
||||
PXDaddress(pxd,
|
||||
addressXAD(&p->xad[XTENTRYSTART + i]));
|
||||
PXDlength(pxd,
|
||||
lengthXAD(&p->xad[XTENTRYSTART + i]));
|
||||
pxd++;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* xdlist will point to into inode's xtree, ensure
|
||||
* that transaction is not committed lazily.
|
||||
*/
|
||||
xadlock->flag = mlckFREEXADLIST;
|
||||
xadlock->xdlist = &p->xad[XTENTRYSTART];
|
||||
tblk->xflag &= ~COMMIT_LAZY;
|
||||
}
|
||||
|
@ -1918,7 +1934,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
* header ?
|
||||
*/
|
||||
if (tlck->type & tlckTRUNCATE) {
|
||||
pxd_t tpxd; /* truncated extent of xad */
|
||||
pxd_t pxd; /* truncated extent of xad */
|
||||
int twm;
|
||||
|
||||
/*
|
||||
|
@ -1947,8 +1963,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
* applying the after-image to the meta-data page.
|
||||
*/
|
||||
lrd->type = cpu_to_le16(LOG_REDOPAGE);
|
||||
PXDaddress(pxd, mp->index);
|
||||
PXDlength(pxd, mp->logical_size >> tblk->sb->s_blocksize_bits);
|
||||
PXDaddress(page_pxd, mp->index);
|
||||
PXDlength(page_pxd,
|
||||
mp->logical_size >> tblk->sb->s_blocksize_bits);
|
||||
lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck));
|
||||
|
||||
/*
|
||||
|
@ -1966,7 +1983,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD);
|
||||
lrd->log.updatemap.nxd = cpu_to_le16(1);
|
||||
lrd->log.updatemap.pxd = pxdlock->pxd;
|
||||
tpxd = pxdlock->pxd; /* save to format maplock */
|
||||
pxd = pxdlock->pxd; /* save to format maplock */
|
||||
lrd->backchain =
|
||||
cpu_to_le32(lmLog(log, tblk, lrd, NULL));
|
||||
}
|
||||
|
@ -2035,7 +2052,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
|
|||
pxdlock = (struct pxd_lock *) xadlock;
|
||||
pxdlock->flag = mlckFREEPXD;
|
||||
pxdlock->count = 1;
|
||||
pxdlock->pxd = tpxd;
|
||||
pxdlock->pxd = pxd;
|
||||
|
||||
jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d "
|
||||
"hwm:%d", ip, mp, pxdlock->count, hwm);
|
||||
|
|
Загрузка…
Ссылка в новой задаче