[RFC PATCH 1/3] um/x86: remove ldt mutex and use mmap lock instead
Johannes Berg
johannes at sipsolutions.net
Fri Sep 22 15:37:39 PDT 2023
From: Johannes Berg <johannes.berg at intel.com>
There's really not much value in having this as a
separate lock, and having it makes it harder to
clean up the init_new_context() semantics to not
rely on 'current', even if dup_mm() is really only
called with 'current->mm' as the source today.
Replace the locking accordingly with mmap read and
write lock, and remove it from init_new_ldt()
entirely since it already holds the source lock.
Signed-off-by: Johannes Berg <johannes.berg at intel.com>
---
arch/x86/um/asm/mm_context.h | 1 -
arch/x86/um/ldt.c | 14 ++++----------
2 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/arch/x86/um/asm/mm_context.h b/arch/x86/um/asm/mm_context.h
index dc32dc023c2f..2b1a76a87e14 100644
--- a/arch/x86/um/asm/mm_context.h
+++ b/arch/x86/um/asm/mm_context.h
@@ -25,7 +25,6 @@ struct ldt_entry {
typedef struct uml_ldt {
int entry_count;
- struct mutex lock;
union {
struct ldt_entry * pages[LDT_PAGES_MAX];
struct ldt_entry entries[LDT_DIRECT_ENTRIES];
diff --git a/arch/x86/um/ldt.c b/arch/x86/um/ldt.c
index 255a44dd415a..6b8e368f779c 100644
--- a/arch/x86/um/ldt.c
+++ b/arch/x86/um/ldt.c
@@ -65,7 +65,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount)
bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
err = bytecount;
- mutex_lock(&ldt->lock);
+ mmap_read_lock(current->mm);
if (ldt->entry_count <= LDT_DIRECT_ENTRIES) {
size = LDT_ENTRY_SIZE*LDT_DIRECT_ENTRIES;
if (size > bytecount)
@@ -89,7 +89,7 @@ static int read_ldt(void __user * ptr, unsigned long bytecount)
ptr += size;
}
}
- mutex_unlock(&ldt->lock);
+ mmap_read_unlock(current->mm);
if (bytecount == 0 || err == -EFAULT)
goto out;
@@ -146,7 +146,7 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func)
goto out;
}
- mutex_lock(&ldt->lock);
+ mmap_write_lock(current->mm);
err = write_ldt_entry(mm_idp, func, &ldt_info, &addr, 1);
if (err)
@@ -201,7 +201,7 @@ static int write_ldt(void __user * ptr, unsigned long bytecount, int func)
err = 0;
out_unlock:
- mutex_unlock(&ldt->lock);
+ mmap_write_unlock(current->mm);
out:
return err;
}
@@ -305,9 +305,6 @@ long init_new_ldt(struct mm_context *new_mm, struct mm_context *from_mm)
long page, err=0;
void *addr = NULL;
-
- mutex_init(&new_mm->arch.ldt.lock);
-
if (!from_mm) {
memset(&desc, 0, sizeof(desc));
/*
@@ -334,7 +331,6 @@ long init_new_ldt(struct mm_context *new_mm, struct mm_context *from_mm)
* i.e., we have to use the stub for modify_ldt, which
* can't handle the big read buffer of up to 64kB.
*/
- mutex_lock(&from_mm->arch.ldt.lock);
if (from_mm->arch.ldt.entry_count <= LDT_DIRECT_ENTRIES)
memcpy(new_mm->arch.ldt.u.entries, from_mm->arch.ldt.u.entries,
sizeof(new_mm->arch.ldt.u.entries));
@@ -353,8 +349,6 @@ long init_new_ldt(struct mm_context *new_mm, struct mm_context *from_mm)
}
}
new_mm->arch.ldt.entry_count = from_mm->arch.ldt.entry_count;
- mutex_unlock(&from_mm->arch.ldt.lock);
-
out:
return err;
}
--
2.41.0
More information about the linux-um
mailing list