proc: faster open/close of files without ->release hook
The whole point of code in fs/proc/inode.c is to make sure ->release hook is called either at close() or at rmmod time. All if it is unnecessary if there is no ->release hook. Save allocation+list manipulations under spinlock in that case. Link: http://lkml.kernel.org/r/20180214063033.GA15579@avx2 Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Kees Cook <keescook@chromium.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e74a0effff
commit
e7a6e291e3
|
@ -342,31 +342,36 @@ static int proc_reg_open(struct inode *inode, struct file *file)
|
||||||
*
|
*
|
||||||
* Save every "struct file" with custom ->release hook.
|
* Save every "struct file" with custom ->release hook.
|
||||||
*/
|
*/
|
||||||
pdeo = kmalloc(sizeof(struct pde_opener), GFP_KERNEL);
|
if (!use_pde(pde))
|
||||||
if (!pdeo)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
if (!use_pde(pde)) {
|
|
||||||
kfree(pdeo);
|
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
|
||||||
open = pde->proc_fops->open;
|
|
||||||
release = pde->proc_fops->release;
|
|
||||||
|
|
||||||
|
release = pde->proc_fops->release;
|
||||||
|
if (release) {
|
||||||
|
pdeo = kmalloc(sizeof(struct pde_opener), GFP_KERNEL);
|
||||||
|
if (!pdeo) {
|
||||||
|
rv = -ENOMEM;
|
||||||
|
goto out_unuse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open = pde->proc_fops->open;
|
||||||
if (open)
|
if (open)
|
||||||
rv = open(inode, file);
|
rv = open(inode, file);
|
||||||
|
|
||||||
if (rv == 0 && release) {
|
if (release) {
|
||||||
/* To know what to release. */
|
if (rv == 0) {
|
||||||
pdeo->file = file;
|
/* To know what to release. */
|
||||||
pdeo->closing = false;
|
pdeo->file = file;
|
||||||
pdeo->c = NULL;
|
pdeo->closing = false;
|
||||||
spin_lock(&pde->pde_unload_lock);
|
pdeo->c = NULL;
|
||||||
list_add(&pdeo->lh, &pde->pde_openers);
|
spin_lock(&pde->pde_unload_lock);
|
||||||
spin_unlock(&pde->pde_unload_lock);
|
list_add(&pdeo->lh, &pde->pde_openers);
|
||||||
} else
|
spin_unlock(&pde->pde_unload_lock);
|
||||||
kfree(pdeo);
|
} else
|
||||||
|
kfree(pdeo);
|
||||||
|
}
|
||||||
|
|
||||||
|
out_unuse:
|
||||||
unuse_pde(pde);
|
unuse_pde(pde);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue