diff options
| author | Dave Kleikamp <shaggy@austin.ibm.com> | 2005-05-02 14:24:46 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-03 01:23:52 -0400 |
| commit | 66f3131f547ef3cc864810974e0757617e60a837 (patch) | |
| tree | 98a1c36c63a350f04a650abfc4ec9ff12e7d717a | |
| parent | ac09f698f1cda91e890fb75f4cb38253d60ff017 (diff) | |
[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>
| -rw-r--r-- | fs/jfs/jfs_txnmgr.c | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index f40301d93f74..98e16d93e146 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
| @@ -1712,7 +1712,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1712 | struct maplock *maplock; | 1712 | struct maplock *maplock; |
| 1713 | struct xdlistlock *xadlock; | 1713 | struct xdlistlock *xadlock; |
| 1714 | struct pxd_lock *pxdlock; | 1714 | struct pxd_lock *pxdlock; |
| 1715 | pxd_t *pxd; | 1715 | pxd_t *page_pxd; |
| 1716 | int next, lwm, hwm; | 1716 | int next, lwm, hwm; |
| 1717 | 1717 | ||
| 1718 | ip = tlck->ip; | 1718 | ip = tlck->ip; |
| @@ -1722,7 +1722,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1722 | lrd->log.redopage.type = cpu_to_le16(LOG_XTREE); | 1722 | lrd->log.redopage.type = cpu_to_le16(LOG_XTREE); |
| 1723 | lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE); | 1723 | lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE); |
| 1724 | 1724 | ||
| 1725 | pxd = &lrd->log.redopage.pxd; | 1725 | page_pxd = &lrd->log.redopage.pxd; |
| 1726 | 1726 | ||
| 1727 | if (tlck->type & tlckBTROOT) { | 1727 | if (tlck->type & tlckBTROOT) { |
| 1728 | lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT); | 1728 | 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, | |||
| 1752 | * applying the after-image to the meta-data page. | 1752 | * applying the after-image to the meta-data page. |
| 1753 | */ | 1753 | */ |
| 1754 | lrd->type = cpu_to_le16(LOG_REDOPAGE); | 1754 | lrd->type = cpu_to_le16(LOG_REDOPAGE); |
| 1755 | // *pxd = mp->cm_pxd; | 1755 | // *page_pxd = mp->cm_pxd; |
| 1756 | PXDaddress(pxd, mp->index); | 1756 | PXDaddress(page_pxd, mp->index); |
| 1757 | PXDlength(pxd, | 1757 | PXDlength(page_pxd, |
| 1758 | mp->logical_size >> tblk->sb->s_blocksize_bits); | 1758 | mp->logical_size >> tblk->sb->s_blocksize_bits); |
| 1759 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); | 1759 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); |
| 1760 | 1760 | ||
| @@ -1776,25 +1776,31 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1776 | tlck->flag |= tlckUPDATEMAP; | 1776 | tlck->flag |= tlckUPDATEMAP; |
| 1777 | xadlock->flag = mlckALLOCXADLIST; | 1777 | xadlock->flag = mlckALLOCXADLIST; |
| 1778 | xadlock->count = next - lwm; | 1778 | xadlock->count = next - lwm; |
| 1779 | if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) { | 1779 | if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) { |
| 1780 | int i; | 1780 | int i; |
| 1781 | pxd_t *pxd; | ||
| 1781 | /* | 1782 | /* |
| 1782 | * Lazy commit may allow xtree to be modified before | 1783 | * Lazy commit may allow xtree to be modified before |
| 1783 | * txUpdateMap runs. Copy xad into linelock to | 1784 | * txUpdateMap runs. Copy xad into linelock to |
| 1784 | * preserve correct data. | 1785 | * preserve correct data. |
| 1786 | * | ||
| 1787 | * We can fit twice as may pxd's as xads in the lock | ||
| 1785 | */ | 1788 | */ |
| 1786 | xadlock->xdlist = &xtlck->pxdlock; | 1789 | xadlock->flag = mlckALLOCPXDLIST; |
| 1787 | memcpy(xadlock->xdlist, &p->xad[lwm], | 1790 | pxd = xadlock->xdlist = &xtlck->pxdlock; |
| 1788 | sizeof(xad_t) * xadlock->count); | 1791 | for (i = 0; i < xadlock->count; i++) { |
| 1789 | 1792 | PXDaddress(pxd, addressXAD(&p->xad[lwm + i])); | |
| 1790 | for (i = 0; i < xadlock->count; i++) | 1793 | PXDlength(pxd, lengthXAD(&p->xad[lwm + i])); |
| 1791 | p->xad[lwm + i].flag &= | 1794 | p->xad[lwm + i].flag &= |
| 1792 | ~(XAD_NEW | XAD_EXTENDED); | 1795 | ~(XAD_NEW | XAD_EXTENDED); |
| 1796 | pxd++; | ||
| 1797 | } | ||
| 1793 | } else { | 1798 | } else { |
| 1794 | /* | 1799 | /* |
| 1795 | * xdlist will point to into inode's xtree, ensure | 1800 | * xdlist will point to into inode's xtree, ensure |
| 1796 | * that transaction is not committed lazily. | 1801 | * that transaction is not committed lazily. |
| 1797 | */ | 1802 | */ |
| 1803 | xadlock->flag = mlckALLOCXADLIST; | ||
| 1798 | xadlock->xdlist = &p->xad[lwm]; | 1804 | xadlock->xdlist = &p->xad[lwm]; |
| 1799 | tblk->xflag &= ~COMMIT_LAZY; | 1805 | tblk->xflag &= ~COMMIT_LAZY; |
| 1800 | } | 1806 | } |
| @@ -1836,8 +1842,8 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1836 | if (tblk->xflag & COMMIT_TRUNCATE) { | 1842 | if (tblk->xflag & COMMIT_TRUNCATE) { |
| 1837 | /* write NOREDOPAGE for the page */ | 1843 | /* write NOREDOPAGE for the page */ |
| 1838 | lrd->type = cpu_to_le16(LOG_NOREDOPAGE); | 1844 | lrd->type = cpu_to_le16(LOG_NOREDOPAGE); |
| 1839 | PXDaddress(pxd, mp->index); | 1845 | PXDaddress(page_pxd, mp->index); |
| 1840 | PXDlength(pxd, | 1846 | PXDlength(page_pxd, |
| 1841 | mp->logical_size >> tblk->sb-> | 1847 | mp->logical_size >> tblk->sb-> |
| 1842 | s_blocksize_bits); | 1848 | s_blocksize_bits); |
| 1843 | lrd->backchain = | 1849 | lrd->backchain = |
| @@ -1872,22 +1878,32 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1872 | * deleted page itself; | 1878 | * deleted page itself; |
| 1873 | */ | 1879 | */ |
| 1874 | tlck->flag |= tlckUPDATEMAP; | 1880 | tlck->flag |= tlckUPDATEMAP; |
| 1875 | xadlock->flag = mlckFREEXADLIST; | ||
| 1876 | xadlock->count = hwm - XTENTRYSTART + 1; | 1881 | xadlock->count = hwm - XTENTRYSTART + 1; |
| 1877 | if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) { | 1882 | if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) { |
| 1883 | int i; | ||
| 1884 | pxd_t *pxd; | ||
| 1878 | /* | 1885 | /* |
| 1879 | * Lazy commit may allow xtree to be modified before | 1886 | * Lazy commit may allow xtree to be modified before |
| 1880 | * txUpdateMap runs. Copy xad into linelock to | 1887 | * txUpdateMap runs. Copy xad into linelock to |
| 1881 | * preserve correct data. | 1888 | * preserve correct data. |
| 1889 | * | ||
| 1890 | * We can fit twice as may pxd's as xads in the lock | ||
| 1882 | */ | 1891 | */ |
| 1883 | xadlock->xdlist = &xtlck->pxdlock; | 1892 | xadlock->flag = mlckFREEPXDLIST; |
| 1884 | memcpy(xadlock->xdlist, &p->xad[XTENTRYSTART], | 1893 | pxd = xadlock->xdlist = &xtlck->pxdlock; |
| 1885 | sizeof(xad_t) * xadlock->count); | 1894 | for (i = 0; i < xadlock->count; i++) { |
| 1895 | PXDaddress(pxd, | ||
| 1896 | addressXAD(&p->xad[XTENTRYSTART + i])); | ||
| 1897 | PXDlength(pxd, | ||
| 1898 | lengthXAD(&p->xad[XTENTRYSTART + i])); | ||
| 1899 | pxd++; | ||
| 1900 | } | ||
| 1886 | } else { | 1901 | } else { |
| 1887 | /* | 1902 | /* |
| 1888 | * xdlist will point to into inode's xtree, ensure | 1903 | * xdlist will point to into inode's xtree, ensure |
| 1889 | * that transaction is not committed lazily. | 1904 | * that transaction is not committed lazily. |
| 1890 | */ | 1905 | */ |
| 1906 | xadlock->flag = mlckFREEXADLIST; | ||
| 1891 | xadlock->xdlist = &p->xad[XTENTRYSTART]; | 1907 | xadlock->xdlist = &p->xad[XTENTRYSTART]; |
| 1892 | tblk->xflag &= ~COMMIT_LAZY; | 1908 | tblk->xflag &= ~COMMIT_LAZY; |
| 1893 | } | 1909 | } |
| @@ -1918,7 +1934,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1918 | * header ? | 1934 | * header ? |
| 1919 | */ | 1935 | */ |
| 1920 | if (tlck->type & tlckTRUNCATE) { | 1936 | if (tlck->type & tlckTRUNCATE) { |
| 1921 | pxd_t tpxd; /* truncated extent of xad */ | 1937 | pxd_t pxd; /* truncated extent of xad */ |
| 1922 | int twm; | 1938 | int twm; |
| 1923 | 1939 | ||
| 1924 | /* | 1940 | /* |
| @@ -1947,8 +1963,9 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1947 | * applying the after-image to the meta-data page. | 1963 | * applying the after-image to the meta-data page. |
| 1948 | */ | 1964 | */ |
| 1949 | lrd->type = cpu_to_le16(LOG_REDOPAGE); | 1965 | lrd->type = cpu_to_le16(LOG_REDOPAGE); |
| 1950 | PXDaddress(pxd, mp->index); | 1966 | PXDaddress(page_pxd, mp->index); |
| 1951 | PXDlength(pxd, mp->logical_size >> tblk->sb->s_blocksize_bits); | 1967 | PXDlength(page_pxd, |
| 1968 | mp->logical_size >> tblk->sb->s_blocksize_bits); | ||
| 1952 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); | 1969 | lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck)); |
| 1953 | 1970 | ||
| 1954 | /* | 1971 | /* |
| @@ -1966,7 +1983,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 1966 | lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD); | 1983 | lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD); |
| 1967 | lrd->log.updatemap.nxd = cpu_to_le16(1); | 1984 | lrd->log.updatemap.nxd = cpu_to_le16(1); |
| 1968 | lrd->log.updatemap.pxd = pxdlock->pxd; | 1985 | lrd->log.updatemap.pxd = pxdlock->pxd; |
| 1969 | tpxd = pxdlock->pxd; /* save to format maplock */ | 1986 | pxd = pxdlock->pxd; /* save to format maplock */ |
| 1970 | lrd->backchain = | 1987 | lrd->backchain = |
| 1971 | cpu_to_le32(lmLog(log, tblk, lrd, NULL)); | 1988 | cpu_to_le32(lmLog(log, tblk, lrd, NULL)); |
| 1972 | } | 1989 | } |
| @@ -2035,7 +2052,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, | |||
| 2035 | pxdlock = (struct pxd_lock *) xadlock; | 2052 | pxdlock = (struct pxd_lock *) xadlock; |
| 2036 | pxdlock->flag = mlckFREEPXD; | 2053 | pxdlock->flag = mlckFREEPXD; |
| 2037 | pxdlock->count = 1; | 2054 | pxdlock->count = 1; |
| 2038 | pxdlock->pxd = tpxd; | 2055 | pxdlock->pxd = pxd; |
| 2039 | 2056 | ||
| 2040 | jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d " | 2057 | jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d " |
| 2041 | "hwm:%d", ip, mp, pxdlock->count, hwm); | 2058 | "hwm:%d", ip, mp, pxdlock->count, hwm); |
