Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754599AbbBOI1c (ORCPT ); Sun, 15 Feb 2015 03:27:32 -0500 Received: from cnbjrel02.sonyericsson.com ([219.141.167.166]:12716 "EHLO cnbjrel02.sonyericsson.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750809AbbBOI1b convert rfc822-to-8bit (ORCPT ); Sun, 15 Feb 2015 03:27:31 -0500 From: "Wang, Yalin" To: "'viro@zeniv.linux.org.uk'" , "'linux-fsdevel@vger.kernel.org'" , "'linux-kernel@vger.kernel.org'" , "Gao, Neil" , "'Andrew Morton'" Date: Sun, 15 Feb 2015 16:27:27 +0800 Subject: [RFC V3] test bit before clear files_struct bits Thread-Topic: [RFC V3] test bit before clear files_struct bits Thread-Index: AdBFACgEc97JUPvYTWSBybSTiDc3HgAAIyYwAP4P8xA= Message-ID: <35FD53F367049845BC99AC72306C23D10458D6173BCC@CNBJMBX05.corpusers.net> References: <35FD53F367049845BC99AC72306C23D1044A02027E18@CNBJMBX05.corpusers.net> <35FD53F367049845BC99AC72306C23D1044A02027E19@CNBJMBX05.corpusers.net> In-Reply-To: <35FD53F367049845BC99AC72306C23D1044A02027E19@CNBJMBX05.corpusers.net> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3042 Lines: 97 Test bit before clear close_on_exec and open_fds, by trace __clear_bit(), these 2 place are false in most times, we test it so that we don't need clear_bit, and we can win in most time. Add *_if_need bitop non-atomic version. Signed-off-by: Yalin Wang --- fs/file.c | 9 +++++++-- include/asm-generic/bitops/non-atomic.h | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/fs/file.c b/fs/file.c index ee738ea..2e08e6f 100644 --- a/fs/file.c +++ b/fs/file.c @@ -209,7 +209,7 @@ static inline void __set_close_on_exec(int fd, struct fdtable *fdt) static inline void __clear_close_on_exec(int fd, struct fdtable *fdt) { - __clear_bit(fd, fdt->close_on_exec); + __clear_bit_if_need(fd, fdt->close_on_exec); } static inline void __set_open_fd(int fd, struct fdtable *fdt) @@ -222,6 +222,11 @@ static inline void __clear_open_fd(int fd, struct fdtable *fdt) __clear_bit(fd, fdt->open_fds); } +static inline void __clear_open_fd_if_need(int fd, struct fdtable *fdt) +{ + __clear_bit_if_need(fd, fdt->open_fds); +} + static int count_open_files(struct fdtable *fdt) { int size = fdt->max_fds; @@ -316,7 +321,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) * is partway through open(). So make sure that this * fd is available to the new process. */ - __clear_open_fd(open_files - i, new_fdt); + __clear_open_fd_if_need(open_files - i, new_fdt); } rcu_assign_pointer(*new_fds++, f); } diff --git a/include/asm-generic/bitops/non-atomic.h b/include/asm-generic/bitops/non-atomic.h index 697cc2b..0713e3b 100644 --- a/include/asm-generic/bitops/non-atomic.h +++ b/include/asm-generic/bitops/non-atomic.h @@ -105,4 +105,39 @@ static inline int test_bit(int nr, const volatile unsigned long *addr) return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); } +/* + * __*_if_need version is used in cases that you don't want write a bit which + * have been set / clear, to avoid dirty cacheline. + */ +static inline void __set_bit_if_need(int nr, volatile unsigned long *addr) +{ + if (!test_bit(nr, addr)) + __set_bit(nr, addr); +} + +static inline void __clear_bit_if_need(int nr, volatile unsigned long *addr) +{ + if (test_bit(nr, addr)) + __clear_bit(nr, addr); +} + +static inline int __test_and_set_bit_if_need(int nr, volatile unsigned long *addr) +{ + if (!test_bit(nr, addr)) { + __set_bit(nr, addr); + return false; + } else { + return true; + } +} + +static inline int __test_and_clear_bit_if_need(int nr, volatile unsigned long *addr) +{ + if (test_bit(nr, addr)) { + __clear_bit(nr, addr); + return true; + } else { + return false; + } +} #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */ -- 2.2.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/