diff mbox series

[RFC,1/3] um/x86: remove ldt mutex and use mmap lock instead

Message ID 20230923003737.97896a6a5213.Ibb36a758aa737a028eea3a73ed8718bf18109b99@changeid
State Needs Review / ACK
Headers show
Series um: clean up mm creation - another attempt | expand

Commit Message

Johannes Berg Sept. 22, 2023, 10:37 p.m. UTC
From: Johannes Berg <johannes.berg@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@intel.com>
---
 arch/x86/um/asm/mm_context.h |  1 -
 arch/x86/um/ldt.c            | 14 ++++----------
 2 files changed, 4 insertions(+), 11 deletions(-)
diff mbox series

Patch

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;
 }