Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'dlm-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm

Pull dlm update from David Teigland:
"This includes a single patch to avoid excessive and unnecessary
scanning of rsbs to free."

* tag 'dlm-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm:
dlm: avoid scanning unchanged toss lists

+18
+3
fs/dlm/dlm_internal.h
··· 96 96 } 97 97 98 98 99 + #define DLM_RTF_SHRINK 0x00000001 100 + 99 101 struct dlm_rsbtable { 100 102 struct rb_root keep; 101 103 struct rb_root toss; 102 104 spinlock_t lock; 105 + uint32_t flags; 103 106 }; 104 107 105 108
+15
fs/dlm/lock.c
··· 1132 1132 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); 1133 1133 rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); 1134 1134 r->res_toss_time = jiffies; 1135 + ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; 1135 1136 if (r->res_lvbptr) { 1136 1137 dlm_free_lvb(r->res_lvbptr); 1137 1138 r->res_lvbptr = NULL; ··· 1660 1659 char *name; 1661 1660 int our_nodeid = dlm_our_nodeid(); 1662 1661 int remote_count = 0; 1662 + int need_shrink = 0; 1663 1663 int i, len, rv; 1664 1664 1665 1665 memset(&ls->ls_remove_lens, 0, sizeof(int) * DLM_REMOVE_NAMES_MAX); 1666 1666 1667 1667 spin_lock(&ls->ls_rsbtbl[b].lock); 1668 + 1669 + if (!(ls->ls_rsbtbl[b].flags & DLM_RTF_SHRINK)) { 1670 + spin_unlock(&ls->ls_rsbtbl[b].lock); 1671 + return; 1672 + } 1673 + 1668 1674 for (n = rb_first(&ls->ls_rsbtbl[b].toss); n; n = next) { 1669 1675 next = rb_next(n); 1670 1676 r = rb_entry(n, struct dlm_rsb, res_hashnode); ··· 1686 1678 (dlm_dir_nodeid(r) == our_nodeid)) { 1687 1679 continue; 1688 1680 } 1681 + 1682 + need_shrink = 1; 1689 1683 1690 1684 if (!time_after_eq(jiffies, r->res_toss_time + 1691 1685 dlm_config.ci_toss_secs * HZ)) { ··· 1720 1710 rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[b].toss); 1721 1711 dlm_free_rsb(r); 1722 1712 } 1713 + 1714 + if (need_shrink) 1715 + ls->ls_rsbtbl[b].flags |= DLM_RTF_SHRINK; 1716 + else 1717 + ls->ls_rsbtbl[b].flags &= ~DLM_RTF_SHRINK; 1723 1718 spin_unlock(&ls->ls_rsbtbl[b].lock); 1724 1719 1725 1720 /*