forked from luck/tmp_suning_uos_patched
kernel: move use_mm/unuse_mm to kthread.c
Patch series "improve use_mm / unuse_mm", v2. This series improves the use_mm / unuse_mm interface by better documenting the assumptions, and my taking the set_fs manipulations spread over the callers into the core API. This patch (of 3): Use the proper API instead. Link: http://lkml.kernel.org/r/20200404094101.672954-1-hch@lst.de These helpers are only for use with kernel threads, and I will tie them more into the kthread infrastructure going forward. Also move the prototypes to kthread.h - mmu_context.h was a little weird to start with as it otherwise contains very low-level MM bits. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Tested-by: Jens Axboe <axboe@kernel.dk> Reviewed-by: Jens Axboe <axboe@kernel.dk> Acked-by: Felix Kuehling <Felix.Kuehling@amd.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Felipe Balbi <balbi@kernel.org> Cc: Jason Wang <jasowang@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Zhenyu Wang <zhenyuw@linux.intel.com> Cc: Zhi Wang <zhi.a.wang@intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: http://lkml.kernel.org/r/20200404094101.672954-1-hch@lst.de Link: http://lkml.kernel.org/r/20200416053158.586887-1-hch@lst.de Link: http://lkml.kernel.org/r/20200404094101.672954-5-hch@lst.de Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2c34f6f738
commit
9bf5b9eb23
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/kthread.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <kgd_kfd_interface.h>
|
#include <kgd_kfd_interface.h>
|
||||||
#include <drm/ttm/ttm_execbuf_util.h>
|
#include <drm/ttm/ttm_execbuf_util.h>
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/fdtable.h>
|
#include <linux/fdtable.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_amdkfd.h"
|
#include "amdgpu_amdkfd.h"
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_amdkfd.h"
|
#include "amdgpu_amdkfd.h"
|
||||||
#include "gc/gc_10_1_0_offset.h"
|
#include "gc/gc_10_1_0_offset.h"
|
||||||
|
|
|
@ -20,8 +20,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
|
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_amdkfd.h"
|
#include "amdgpu_amdkfd.h"
|
||||||
#include "cikd.h"
|
#include "cikd.h"
|
||||||
|
|
|
@ -20,8 +20,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
|
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_amdkfd.h"
|
#include "amdgpu_amdkfd.h"
|
||||||
#include "gfx_v8_0.h"
|
#include "gfx_v8_0.h"
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
|
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_amdkfd.h"
|
#include "amdgpu_amdkfd.h"
|
||||||
#include "gc/gc_9_0_offset.h"
|
#include "gc/gc_9_0_offset.h"
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/mmu_context.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/sched/mm.h>
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include <linux/usb/functionfs.h>
|
#include <linux/usb/functionfs.h>
|
||||||
|
|
||||||
#include <linux/aio.h>
|
#include <linux/aio.h>
|
||||||
#include <linux/mmu_context.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/eventfd.h>
|
#include <linux/eventfd.h>
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/mmu_context.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/aio.h>
|
#include <linux/aio.h>
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/refcount.h>
|
#include <linux/refcount.h>
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <linux/vhost.h>
|
#include <linux/vhost.h>
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
|
|
1
fs/aio.c
1
fs/aio.c
|
@ -27,7 +27,6 @@
|
||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/sched/signal.h>
|
#include <linux/sched/signal.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/sched/mm.h>
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
|
@ -55,7 +55,6 @@
|
||||||
#include <linux/fdtable.h>
|
#include <linux/fdtable.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
struct mm_struct;
|
||||||
|
|
||||||
__printf(4, 5)
|
__printf(4, 5)
|
||||||
struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
|
struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
|
||||||
void *data,
|
void *data,
|
||||||
|
@ -198,6 +200,9 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work);
|
||||||
|
|
||||||
void kthread_destroy_worker(struct kthread_worker *worker);
|
void kthread_destroy_worker(struct kthread_worker *worker);
|
||||||
|
|
||||||
|
void use_mm(struct mm_struct *mm);
|
||||||
|
void unuse_mm(struct mm_struct *mm);
|
||||||
|
|
||||||
struct cgroup_subsys_state;
|
struct cgroup_subsys_state;
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_CGROUP
|
#ifdef CONFIG_BLK_CGROUP
|
||||||
|
|
|
@ -4,11 +4,6 @@
|
||||||
|
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
|
||||||
struct mm_struct;
|
|
||||||
|
|
||||||
void use_mm(struct mm_struct *mm);
|
|
||||||
void unuse_mm(struct mm_struct *mm);
|
|
||||||
|
|
||||||
/* Architectures that care about IRQ state in switch_mm can override this. */
|
/* Architectures that care about IRQ state in switch_mm can override this. */
|
||||||
#ifndef switch_mm_irqs_off
|
#ifndef switch_mm_irqs_off
|
||||||
# define switch_mm_irqs_off switch_mm
|
# define switch_mm_irqs_off switch_mm
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/* Kernel thread helper functions.
|
/* Kernel thread helper functions.
|
||||||
* Copyright (C) 2004 IBM Corporation, Rusty Russell.
|
* Copyright (C) 2004 IBM Corporation, Rusty Russell.
|
||||||
|
* Copyright (C) 2009 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* Creation is done via kthreadd, so that we get a clean environment
|
* Creation is done via kthreadd, so that we get a clean environment
|
||||||
* even if we're invoked from userspace (think modprobe, hotplug cpu,
|
* even if we're invoked from userspace (think modprobe, hotplug cpu,
|
||||||
* etc.).
|
* etc.).
|
||||||
*/
|
*/
|
||||||
#include <uapi/linux/sched/types.h>
|
#include <uapi/linux/sched/types.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/mmu_context.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/sched/task.h>
|
#include <linux/sched/task.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
|
@ -25,6 +29,7 @@
|
||||||
#include <linux/numa.h>
|
#include <linux/numa.h>
|
||||||
#include <trace/events/sched.h>
|
#include <trace/events/sched.h>
|
||||||
|
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(kthread_create_lock);
|
static DEFINE_SPINLOCK(kthread_create_lock);
|
||||||
static LIST_HEAD(kthread_create_list);
|
static LIST_HEAD(kthread_create_list);
|
||||||
struct task_struct *kthreadd_task;
|
struct task_struct *kthreadd_task;
|
||||||
|
@ -1203,6 +1208,57 @@ void kthread_destroy_worker(struct kthread_worker *worker)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kthread_destroy_worker);
|
EXPORT_SYMBOL(kthread_destroy_worker);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* use_mm
|
||||||
|
* Makes the calling kernel thread take on the specified
|
||||||
|
* mm context.
|
||||||
|
* (Note: this routine is intended to be called only
|
||||||
|
* from a kernel thread context)
|
||||||
|
*/
|
||||||
|
void use_mm(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
struct mm_struct *active_mm;
|
||||||
|
struct task_struct *tsk = current;
|
||||||
|
|
||||||
|
task_lock(tsk);
|
||||||
|
active_mm = tsk->active_mm;
|
||||||
|
if (active_mm != mm) {
|
||||||
|
mmgrab(mm);
|
||||||
|
tsk->active_mm = mm;
|
||||||
|
}
|
||||||
|
tsk->mm = mm;
|
||||||
|
switch_mm(active_mm, mm, tsk);
|
||||||
|
task_unlock(tsk);
|
||||||
|
#ifdef finish_arch_post_lock_switch
|
||||||
|
finish_arch_post_lock_switch();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (active_mm != mm)
|
||||||
|
mmdrop(active_mm);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(use_mm);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* unuse_mm
|
||||||
|
* Reverses the effect of use_mm, i.e. releases the
|
||||||
|
* specified mm context which was earlier taken on
|
||||||
|
* by the calling kernel thread
|
||||||
|
* (Note: this routine is intended to be called only
|
||||||
|
* from a kernel thread context)
|
||||||
|
*/
|
||||||
|
void unuse_mm(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
struct task_struct *tsk = current;
|
||||||
|
|
||||||
|
task_lock(tsk);
|
||||||
|
sync_mm_rss(mm);
|
||||||
|
tsk->mm = NULL;
|
||||||
|
/* active_mm is still 'mm' */
|
||||||
|
enter_lazy_tlb(mm, tsk);
|
||||||
|
task_unlock(tsk);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(unuse_mm);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_CGROUP
|
#ifdef CONFIG_BLK_CGROUP
|
||||||
/**
|
/**
|
||||||
* kthread_associate_blkcg - associate blkcg to current kthread
|
* kthread_associate_blkcg - associate blkcg to current kthread
|
||||||
|
|
|
@ -41,7 +41,7 @@ obj-y := filemap.o mempool.o oom_kill.o fadvise.o \
|
||||||
maccess.o page-writeback.o \
|
maccess.o page-writeback.o \
|
||||||
readahead.o swap.o truncate.o vmscan.o shmem.o \
|
readahead.o swap.o truncate.o vmscan.o shmem.o \
|
||||||
util.o mmzone.o vmstat.o backing-dev.o \
|
util.o mmzone.o vmstat.o backing-dev.o \
|
||||||
mm_init.o mmu_context.o percpu.o slab_common.o \
|
mm_init.o percpu.o slab_common.o \
|
||||||
compaction.o vmacache.o \
|
compaction.o vmacache.o \
|
||||||
interval_tree.o list_lru.o workingset.o \
|
interval_tree.o list_lru.o workingset.o \
|
||||||
debug.o gup.o $(mmu-y)
|
debug.o gup.o $(mmu-y)
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
/* Copyright (C) 2009 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* See ../COPYING for licensing terms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/sched/mm.h>
|
|
||||||
#include <linux/sched/task.h>
|
|
||||||
#include <linux/mmu_context.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
|
|
||||||
#include <asm/mmu_context.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* use_mm
|
|
||||||
* Makes the calling kernel thread take on the specified
|
|
||||||
* mm context.
|
|
||||||
* (Note: this routine is intended to be called only
|
|
||||||
* from a kernel thread context)
|
|
||||||
*/
|
|
||||||
void use_mm(struct mm_struct *mm)
|
|
||||||
{
|
|
||||||
struct mm_struct *active_mm;
|
|
||||||
struct task_struct *tsk = current;
|
|
||||||
|
|
||||||
task_lock(tsk);
|
|
||||||
active_mm = tsk->active_mm;
|
|
||||||
if (active_mm != mm) {
|
|
||||||
mmgrab(mm);
|
|
||||||
tsk->active_mm = mm;
|
|
||||||
}
|
|
||||||
tsk->mm = mm;
|
|
||||||
switch_mm(active_mm, mm, tsk);
|
|
||||||
task_unlock(tsk);
|
|
||||||
#ifdef finish_arch_post_lock_switch
|
|
||||||
finish_arch_post_lock_switch();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (active_mm != mm)
|
|
||||||
mmdrop(active_mm);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(use_mm);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* unuse_mm
|
|
||||||
* Reverses the effect of use_mm, i.e. releases the
|
|
||||||
* specified mm context which was earlier taken on
|
|
||||||
* by the calling kernel thread
|
|
||||||
* (Note: this routine is intended to be called only
|
|
||||||
* from a kernel thread context)
|
|
||||||
*/
|
|
||||||
void unuse_mm(struct mm_struct *mm)
|
|
||||||
{
|
|
||||||
struct task_struct *tsk = current;
|
|
||||||
|
|
||||||
task_lock(tsk);
|
|
||||||
sync_mm_rss(mm);
|
|
||||||
tsk->mm = NULL;
|
|
||||||
/* active_mm is still 'mm' */
|
|
||||||
enter_lazy_tlb(mm, tsk);
|
|
||||||
task_unlock(tsk);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(unuse_mm);
|
|
Loading…
Reference in New Issue
Block a user