提交 15b158b4 编写于 作者: A Alexey Dobriyan 提交者: Linus Torvalds

proc: spread likely/unlikely a bit

use_pde() is used at every open/read/write/...  of every random /proc
file.  Negative refcount happens only if PDE is being deleted by module
(read: never).  So it gets "likely".

unuse_pde() gets "unlikely" for the same reason.

close_pdeo() gets unlikely as the completion is filled only if there is a
race between PDE removal and close() (read: never ever).

It even saves code on x86_64 defconfig:

	add/remove: 0/0 grow/shrink: 1/2 up/down: 2/-20 (-18)
	Function                                     old     new   delta
	close_pdeo                                   183     185      +2
	proc_reg_get_unmapped_area                   119     111      -8
	proc_reg_poll                                 85      73     -12

Link: http://lkml.kernel.org/r/20180104175657.GA5204@avx2Signed-off-by: NAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 efb1a57d
...@@ -129,12 +129,12 @@ enum {BIAS = -1U<<31}; ...@@ -129,12 +129,12 @@ enum {BIAS = -1U<<31};
static inline int use_pde(struct proc_dir_entry *pde) static inline int use_pde(struct proc_dir_entry *pde)
{ {
return atomic_inc_unless_negative(&pde->in_use); return likely(atomic_inc_unless_negative(&pde->in_use));
} }
static void unuse_pde(struct proc_dir_entry *pde) static void unuse_pde(struct proc_dir_entry *pde)
{ {
if (atomic_dec_return(&pde->in_use) == BIAS) if (unlikely(atomic_dec_return(&pde->in_use) == BIAS))
complete(pde->pde_unload_completion); complete(pde->pde_unload_completion);
} }
...@@ -167,7 +167,7 @@ static void close_pdeo(struct proc_dir_entry *pde, struct pde_opener *pdeo) ...@@ -167,7 +167,7 @@ static void close_pdeo(struct proc_dir_entry *pde, struct pde_opener *pdeo)
spin_lock(&pde->pde_unload_lock); spin_lock(&pde->pde_unload_lock);
/* After ->release. */ /* After ->release. */
list_del(&pdeo->lh); list_del(&pdeo->lh);
if (pdeo->c) if (unlikely(pdeo->c))
complete(pdeo->c); complete(pdeo->c);
kfree(pdeo); kfree(pdeo);
} }
...@@ -421,7 +421,7 @@ static const char *proc_get_link(struct dentry *dentry, ...@@ -421,7 +421,7 @@ static const char *proc_get_link(struct dentry *dentry,
struct delayed_call *done) struct delayed_call *done)
{ {
struct proc_dir_entry *pde = PDE(inode); struct proc_dir_entry *pde = PDE(inode);
if (unlikely(!use_pde(pde))) if (!use_pde(pde))
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
set_delayed_call(done, proc_put_link, pde); set_delayed_call(done, proc_put_link, pde);
return pde->data; return pde->data;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册