Skip to contentSkip to conversation

A series patches about sched priority.

PATCH Superseded Dongsheng Yang 2 participants 21 messages Mar 11, 2014

Subsystems (22)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

v2 cover A series patches about sched priority.

Hi all,
This patchset is all about priority.

1. Add two inline functions in prio.h named nice_to_rlimit and rlimit_to_nice. They are converting the value between nice value [-20, 19] and rlimit style value [1, 40].
2. Add a macro in ioprio.h named NICE_TO_IOPRIO.
It convert nice value [-20, 19] to io priority [0, 7].
3. Others are all about replace hardcoding value about nice to MIN_NICE or MAX_NICE.

Changelog:
-v1:
*Implement nice_to_rlimit and rlimit_to_nice with inline functions
rather than macro.
*Add a patch[16/16] to replace opened code implement with nice_to_rlimit().

Dongsheng Yang (15):
sched/prio: Add a inline function named nice_to_rlimit() in prio.h.
workqueue: Replace hardcoding of -20 with MIN_NICE.
locktorture: Replace hardcoding of 19 with MAX_NICE. tools/mq_perf_tests: Replace hardcoding of -20 with MIN_NICE.
mm: Replace hardcoding of 19 with MAX_NICE.
ioprio: Add a macro named NICE_TO_IOPRIO.
fs/hearbeat: Replace hardcoding of -20 with MIN_NICE. driver/block: Replace hardcoding of -20 with MIN_NICE. driver/char: Replace hardcoding of 19 with MAX_NICE. drivers/s390: Replace hardcoding of 19 with MAX_NICE. sched/prio: Add an inline function named rlimit_to_nice in prio.h. driver/staging/android: Use rlimit_to_nice to replace opened code
implementation.
driver/staging/lustre: Replace hardcoding of -20 with MIN_NICE. driver/scsi: Replace hardcoding of -20 with MIN_NICE.
sched: Get rid of opened code implementation of funtion

    nice_to_rlimit().

Joe Perches (1):
kernel/sys: Replace opened code implementation with nice_to_rlimit().

 drivers/block/loop.c                           |   2 +-
 drivers/block/nbd.c                            |   2 +-
 drivers/block/pktcdvd.c                        |   2 +-
 drivers/char/ipmi/ipmi_si_intf.c               |   2 +-
 drivers/s390/crypto/ap_bus.c                   |   2 +-
 drivers/scsi/bnx2fc/bnx2fc_fcoe.c              |   4 +-
 drivers/scsi/bnx2i/bnx2i_hwi.c                 |   2 +-
 drivers/scsi/fcoe/fcoe.c                       |   2 +-
 drivers/scsi/ibmvscsi/ibmvfc.c                 |   2 +-
 drivers/scsi/ibmvscsi/ibmvscsi.c               |   2 +-
 drivers/scsi/lpfc/lpfc_hbadisc.c               |   2 +-
 drivers/scsi/qla2xxx/qla_os.c                  |   2 +-
 drivers/staging/android/binder.c               |   4 +-
 drivers/staging/lustre/lustre/llite/lloop.c    |   2 +-
 fs/ocfs2/cluster/heartbeat.c                   |   2 +-
 include/linux/ioprio.h                         |   7 +-
 include/linux/sched/prio.h                     |  16 ++
 kernel/locking/locktorture.c                   |   2 +-
 kernel/sched/core.c                            |   2 +-
 kernel/sys.c                                   | 206 ++++++++++++-------------
 kernel/workqueue.c                             |   6 +-
 mm/huge_memory.c                               |   2 +-
 tools/testing/selftests/mqueue/mq_perf_tests.c |   4 +-
 23 files changed, 150 insertions(+), 129 deletions(-)
Signature · 1 line
1.8.2.1
#1 lore raw

PATCH v2 1/16 sched/prio: Add a inline function named nice_to_rlimit() in prio.h.

This patch add an inline function named nice_to_rlimit() in prio.h to convert nice value [19,-20] to rlimit style value [1,40].

---
 include/linux/sched/prio.h | 8 ++++++++
 1 file changed, 8 insertions(+)
include/linux/sched/prio.h +8 -0
index ac32258..c15cbda 100644
@@ -41,4 +41,12 @@
 #define TASK_USER_PRIO(p)	USER_PRIO((p)->static_prio)
 #define MAX_USER_PRIO		(USER_PRIO(MAX_PRIO))
 
+/*
+ * Convert nice value [19,-20] to rlimit style value [1,40].
+ */
+static inline nice_to_rlimit(long nice)
+{
+	return (MAX_NICE - nice + 1);
+}
+
 #endif /* _SCHED_PRIO_H */
Signature · 1 line
1.8.2.1
#2 lore raw

PATCH v2 2/16 kernel/sys: Replace opened code implementation with nice_to_rlimit().

In reply to Dongsheng Yang

From: Joe Perches <[email protected]>

Convert 20 - task_nice(p) to nice_to_rlimit(task_nice(p)).

Reduce the indent the switch case labels while there.

git diff -w shows 3 lines changed and a /* fall-through */ comment added

  $ git diff -w -U0 kernel/sys.c
  @@ -253 +253 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                               niceval = 20 - task_nice(p);
  +                       niceval = nice_to_rlimit(task_nice(p));
  @@ -264 +264 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                               niceval = 20 - task_nice(p);
  +                       niceval = nice_to_rlimit(task_nice(p));
  @@ -280 +280 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                                       niceval = 20 - task_nice(p);
  +                               niceval = nice_to_rlimit(task_nice(p));
  @@ -1558 +1558 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
  -
  +               /* fall-through */
cc "Eric W. Biederman" <[email protected]>
cc Robin Holt <[email protected]>
cc Oleg Nesterov <[email protected]>
cc Andrew Morton <[email protected]>
---
 kernel/sys.c | 206 +++++++++++++++++++++++++++++------------------------------
 1 file changed, 103 insertions(+), 103 deletions(-)
kernel/sys.c +103 -103
index adaeab6..1bfe79a 100644
@@ -182,39 +182,39 @@ SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)
 	rcu_read_lock();
 	read_lock(&tasklist_lock);
 	switch (which) {
-		case PRIO_PROCESS:
-			if (who)
-				p = find_task_by_vpid(who);
-			else
-				p = current;
-			if (p)
-				error = set_one_prio(p, niceval, error);
-			break;
-		case PRIO_PGRP:
-			if (who)
-				pgrp = find_vpid(who);
-			else
-				pgrp = task_pgrp(current);
-			do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
+	case PRIO_PROCESS:
+		if (who)
+			p = find_task_by_vpid(who);
+		else
+			p = current;
+		if (p)
+			error = set_one_prio(p, niceval, error);
+		break;
+	case PRIO_PGRP:
+		if (who)
+			pgrp = find_vpid(who);
+		else
+			pgrp = task_pgrp(current);
+		do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
+			error = set_one_prio(p, niceval, error);
+		} while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
+		break;
+	case PRIO_USER:
+		uid = make_kuid(cred->user_ns, who);
+		user = cred->user;
+		if (!who)
+			uid = cred->uid;
+		else if (!uid_eq(uid, cred->uid) &&
+			 !(user = find_user(uid)))
+			goto out_unlock;	/* No processes for this user */
+
+		do_each_thread(g, p) {
+			if (uid_eq(task_uid(p), uid))
 				error = set_one_prio(p, niceval, error);
-			} while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
-			break;
-		case PRIO_USER:
-			uid = make_kuid(cred->user_ns, who);
-			user = cred->user;
-			if (!who)
-				uid = cred->uid;
-			else if (!uid_eq(uid, cred->uid) &&
-				 !(user = find_user(uid)))
-				goto out_unlock;	/* No processes for this user */
-
-			do_each_thread(g, p) {
-				if (uid_eq(task_uid(p), uid))
-					error = set_one_prio(p, niceval, error);
-			} while_each_thread(g, p);
-			if (!uid_eq(uid, cred->uid))
-				free_uid(user);		/* For find_user() */
-			break;
+		} while_each_thread(g, p);
+		if (!uid_eq(uid, cred->uid))
+			free_uid(user);		/* For find_user() */
+		break;
 	}
 out_unlock:
 	read_unlock(&tasklist_lock);
@@ -244,47 +244,47 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
 	rcu_read_lock();
 	read_lock(&tasklist_lock);
 	switch (which) {
-		case PRIO_PROCESS:
-			if (who)
-				p = find_task_by_vpid(who);
-			else
-				p = current;
-			if (p) {
-				niceval = 20 - task_nice(p);
+	case PRIO_PROCESS:
+		if (who)
+			p = find_task_by_vpid(who);
+		else
+			p = current;
+		if (p) {
+			niceval = nice_to_rlimit(task_nice(p));
+			if (niceval > retval)
+				retval = niceval;
+		}
+		break;
+	case PRIO_PGRP:
+		if (who)
+			pgrp = find_vpid(who);
+		else
+			pgrp = task_pgrp(current);
+		do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
+			niceval = nice_to_rlimit(task_nice(p));
+			if (niceval > retval)
+				retval = niceval;
+		} while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
+		break;
+	case PRIO_USER:
+		uid = make_kuid(cred->user_ns, who);
+		user = cred->user;
+		if (!who)
+			uid = cred->uid;
+		else if (!uid_eq(uid, cred->uid) &&
+			 !(user = find_user(uid)))
+			goto out_unlock;	/* No processes for this user */
+
+		do_each_thread(g, p) {
+			if (uid_eq(task_uid(p), uid)) {
+				niceval = nice_to_rlimit(task_nice(p));
 				if (niceval > retval)
 					retval = niceval;
 			}
-			break;
-		case PRIO_PGRP:
-			if (who)
-				pgrp = find_vpid(who);
-			else
-				pgrp = task_pgrp(current);
-			do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
-				niceval = 20 - task_nice(p);
-				if (niceval > retval)
-					retval = niceval;
-			} while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
-			break;
-		case PRIO_USER:
-			uid = make_kuid(cred->user_ns, who);
-			user = cred->user;
-			if (!who)
-				uid = cred->uid;
-			else if (!uid_eq(uid, cred->uid) &&
-				 !(user = find_user(uid)))
-				goto out_unlock;	/* No processes for this user */
-
-			do_each_thread(g, p) {
-				if (uid_eq(task_uid(p), uid)) {
-					niceval = 20 - task_nice(p);
-					if (niceval > retval)
-						retval = niceval;
-				}
-			} while_each_thread(g, p);
-			if (!uid_eq(uid, cred->uid))
-				free_uid(user);		/* for find_user() */
-			break;
+		} while_each_thread(g, p);
+		if (!uid_eq(uid, cred->uid))
+			free_uid(user);		/* for find_user() */
+		break;
 	}
 out_unlock:
 	read_unlock(&tasklist_lock);
@@ -1541,41 +1541,41 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
 		return;
 
 	switch (who) {
-		case RUSAGE_BOTH:
-		case RUSAGE_CHILDREN:
-			utime = p->signal->cutime;
-			stime = p->signal->cstime;
-			r->ru_nvcsw = p->signal->cnvcsw;
-			r->ru_nivcsw = p->signal->cnivcsw;
-			r->ru_minflt = p->signal->cmin_flt;
-			r->ru_majflt = p->signal->cmaj_flt;
-			r->ru_inblock = p->signal->cinblock;
-			r->ru_oublock = p->signal->coublock;
-			maxrss = p->signal->cmaxrss;
-
-			if (who == RUSAGE_CHILDREN)
-				break;
-
-		case RUSAGE_SELF:
-			thread_group_cputime_adjusted(p, &tgutime, &tgstime);
-			utime += tgutime;
-			stime += tgstime;
-			r->ru_nvcsw += p->signal->nvcsw;
-			r->ru_nivcsw += p->signal->nivcsw;
-			r->ru_minflt += p->signal->min_flt;
-			r->ru_majflt += p->signal->maj_flt;
-			r->ru_inblock += p->signal->inblock;
-			r->ru_oublock += p->signal->oublock;
-			if (maxrss < p->signal->maxrss)
-				maxrss = p->signal->maxrss;
-			t = p;
-			do {
-				accumulate_thread_rusage(t, r);
-			} while_each_thread(p, t);
+	case RUSAGE_BOTH:
+	case RUSAGE_CHILDREN:
+		utime = p->signal->cutime;
+		stime = p->signal->cstime;
+		r->ru_nvcsw = p->signal->cnvcsw;
+		r->ru_nivcsw = p->signal->cnivcsw;
+		r->ru_minflt = p->signal->cmin_flt;
+		r->ru_majflt = p->signal->cmaj_flt;
+		r->ru_inblock = p->signal->cinblock;
+		r->ru_oublock = p->signal->coublock;
+		maxrss = p->signal->cmaxrss;
+
+		if (who == RUSAGE_CHILDREN)
 			break;
+		/* fall-through */
+	case RUSAGE_SELF:
+		thread_group_cputime_adjusted(p, &tgutime, &tgstime);
+		utime += tgutime;
+		stime += tgstime;
+		r->ru_nvcsw += p->signal->nvcsw;
+		r->ru_nivcsw += p->signal->nivcsw;
+		r->ru_minflt += p->signal->min_flt;
+		r->ru_majflt += p->signal->maj_flt;
+		r->ru_inblock += p->signal->inblock;
+		r->ru_oublock += p->signal->oublock;
+		if (maxrss < p->signal->maxrss)
+			maxrss = p->signal->maxrss;
+		t = p;
+		do {
+			accumulate_thread_rusage(t, r);
+		} while_each_thread(p, t);
+		break;
 
-		default:
-			BUG();
+	default:
+		BUG();
 	}
 	unlock_task_sighand(p, &flags);
 
Signature · 1 line
1.8.2.1
maintainer
#3 lore raw

Re: [PATCH 02/16] kernel/sys: Replace opened code implementation with nice_to_rlimit().

Quoted 8 lines · Dongsheng Yang

From: Joe Perches <[email protected]>

Convert 20 - task_nice(p) to nice_to_rlimit(task_nice(p)).

Reduce the indent the switch case labels while there.

git diff -w shows 3 lines changed and a /* fall-through */ comment added

Quoted 14 lines
  $ git diff -w -U0 kernel/sys.c
  @@ -253 +253 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                               niceval = 20 - task_nice(p);
  +                       niceval = nice_to_rlimit(task_nice(p));
  @@ -264 +264 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                               niceval = 20 - task_nice(p);
  +                       niceval = nice_to_rlimit(task_nice(p));
  @@ -280 +280 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
  -                                       niceval = 20 - task_nice(p);
  +                               niceval = nice_to_rlimit(task_nice(p));
  @@ -1558 +1558 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
  -
  +               /* fall-through */

I would really like to see the whitespace changes separated. I can push a scheduler related change into other subsystems, but massive surgery like this should not come through the scheduler tree.

#4 lore raw

Re: [PATCH 02/16] kernel/sys: Replace opened code implementation with nice_to_rlimit().

Quoted 23 lines · Peter Zijlstra
Quoted 8 lines · Dongsheng Yang

From: Joe Perches <[email protected]>

Convert 20 - task_nice(p) to nice_to_rlimit(task_nice(p)).

Reduce the indent the switch case labels while there.

git diff -w shows 3 lines changed and a /* fall-through */ comment added

Quoted 14 lines
   $ git diff -w -U0 kernel/sys.c
   @@ -253 +253 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
   -                               niceval = 20 - task_nice(p);
   +                       niceval = nice_to_rlimit(task_nice(p));
   @@ -264 +264 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
   -                               niceval = 20 - task_nice(p);
   +                       niceval = nice_to_rlimit(task_nice(p));
   @@ -280 +280 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
   -                                       niceval = 20 - task_nice(p);
   +                               niceval = nice_to_rlimit(task_nice(p));
   @@ -1558 +1558 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
   -
   +               /* fall-through */
Quoted 3 lines

I would really like to see the whitespace changes separated. I can push a scheduler related change into other subsystems, but massive surgery like this should not come through the scheduler tree.

Okey, Peter, I will send a single patch about the whitespace changes and update this patch in this thread soon.

Thanx

Quoted 2 lines
#5 lore raw

PATCH v2 3/16 workqueue: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
---
 kernel/workqueue.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/workqueue.c +3 -3
index 3fa5b8f..7528bec 100644
@@ -100,10 +100,10 @@ enum {
 
 	/*
 	 * Rescue workers are used only on emergencies and shared by
-	 * all cpus.  Give -20.
+	 * all cpus.  Give MIN_NICE.
 	 */
-	RESCUER_NICE_LEVEL	= -20,
-	HIGHPRI_NICE_LEVEL	= -20,
+	RESCUER_NICE_LEVEL	= MIN_NICE,
+	HIGHPRI_NICE_LEVEL	= MIN_NICE,
 
 	WQ_NAME_LEN		= 24,
 };
Signature · 1 line
1.8.2.1
#6 lore raw

PATCH v2 4/16 locktorture: Replace hardcoding of 19 with MAX_NICE.

In reply to Dongsheng Yang
---
 kernel/locking/locktorture.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/locking/locktorture.c +1 -1
index f26b1a1..23343be 100644
@@ -216,7 +216,7 @@ static int lock_torture_writer(void *arg)
 	static DEFINE_TORTURE_RANDOM(rand);
 
 	VERBOSE_TOROUT_STRING("lock_torture_writer task started");
-	set_user_nice(current, 19);
+	set_user_nice(current, MAX_NICE);
 
 	do {
 		schedule_timeout_uninterruptible(1);
Signature · 1 line
1.8.2.1
#7 lore raw

PATCH v2 5/16 tools/mq_perf_tests: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
---
 tools/testing/selftests/mqueue/mq_perf_tests.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
tools/testing/selftests/mqueue/mq_perf_tests.c +2 -2
index 2fadd4b..09dce51 100644
@@ -527,9 +527,9 @@ void increase_limits(void)
 	while (try_set(max_msgsize, cur_max_msgsize += 1024))
 		;
 	cur_max_msgsize = get(max_msgsize);
-	if (setpriority(PRIO_PROCESS, 0, -20) != 0)
+	if (setpriority(PRIO_PROCESS, 0, MIN_NICE) != 0)
 		shutdown(2, "setpriority()", __LINE__);
-	cur_nice = -20;
+	cur_nice = MIN_NICE;
 }
 
 int main(int argc, char *argv[])
Signature · 1 line
1.8.2.1
#8 lore raw

PATCH v2 6/16 mm: Replace hardcoding of 19 with MAX_NICE.

In reply to Dongsheng Yang
cc Bob Liu <[email protected]>
cc "Aneesh Kumar K.V" <[email protected]>
cc "Kirill A. Shutemov" <[email protected]>
cc Mel Gorman <[email protected]>
cc Rik van Riel <[email protected]>
cc Andrew Morton <[email protected]>
---
 mm/huge_memory.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
mm/huge_memory.c +1 -1
index 1546655..dcdb6f9 100644
@@ -2803,7 +2803,7 @@ static int khugepaged(void *none)
 	struct mm_slot *mm_slot;
 
 	set_freezable();
-	set_user_nice(current, 19);
+	set_user_nice(current, MAX_NICE);
 
 	while (!kthread_should_stop()) {
 		khugepaged_do_scan();
Signature · 7 lines
1.8.2.1

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#9 lore raw

PATCH v2 7/16 ioprio: Add a macro named NICE_TO_IOPRIO.

In reply to Dongsheng Yang

As the task nice value is in [-20, 19] and the io priority is in [0, 7], and the convert method from niceval to ioprio is implemented with an opened code in task_nice_ioprio().

This patch move the implementation to a macro NICE_TO_IOPRIO, making it more readable and modular.

---
 include/linux/ioprio.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
include/linux/ioprio.h +6 -1
index beb9ce1..c0faa0b 100644
@@ -18,6 +18,11 @@
 #define ioprio_valid(mask)	(IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE)
 
 /*
+ * Convert the nice value [19,-20] to io priority value [0,7].
+ */
+#define NICE_TO_IOPRIO(nice)	(nice_to_rlimit(nice) / 5)
+
+/*
  * These are the io priority groups as implemented by CFQ. RT is the realtime
  * class, it always gets premium service. BE is the best-effort scheduling
  * class, the default for any process. IDLE is the idle scheduling class, it
@@ -52,7 +57,7 @@ enum {
  */
 static inline int task_nice_ioprio(struct task_struct *task)
 {
-	return (task_nice(task) + 20) / 5;
+	return NICE_TO_IOPRIO(task_nice(task));
 }
 
 /*
Signature · 1 line
1.8.2.1
maintainer
#10 lore raw

Re: [PATCH 07/16] ioprio: Add a macro named NICE_TO_IOPRIO.

Quoted 29 lines · Dongsheng Yang

As the task nice value is in [-20, 19] and the io priority is in [0, 7], and the convert method from niceval to ioprio is implemented with an opened code in task_nice_ioprio().

This patch move the implementation to a macro NICE_TO_IOPRIO, making it more readable and modular.

---
 include/linux/ioprio.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
include/linux/ioprio.h +5 -0
index beb9ce1..c0faa0b 100644
@@ -18,6 +18,11 @@
 #define ioprio_valid(mask)	(IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE)
 
 /*
+ * Convert the nice value [19,-20] to io priority value [0,7].
+ */
+#define NICE_TO_IOPRIO(nice)	(nice_to_rlimit(nice) / 5)
+
+/*
  * These are the io priority groups as implemented by CFQ. RT is the realtime
  * class, it always gets premium service. BE is the best-effort scheduling
  * class, the default for any process. IDLE is the idle scheduling class, it

include/linux/ioprio.h enum { · line 61

Quoted 6 lines
include/linux/ioprio.h +1 -1
@@ -52,7 +57,7 @@ enum {
  */
 static inline int task_nice_ioprio(struct task_struct *task)
 {
-	return (task_nice(task) + 20) / 5;
+	return NICE_TO_IOPRIO(task_nice(task));
 }

How exactly is adding a macro and code complexity making this code better?

#11 lore raw

Re: [PATCH 07/16] ioprio: Add a macro named NICE_TO_IOPRIO.

Quoted 30 lines · Peter Zijlstra
Quoted 29 lines · Dongsheng Yang

As the task nice value is in [-20, 19] and the io priority is in [0, 7], and the convert method from niceval to ioprio is implemented with an opened code in task_nice_ioprio().

This patch move the implementation to a macro NICE_TO_IOPRIO, making it more readable and modular.

---
  include/linux/ioprio.h | 7 ++++++-
  1 file changed, 6 insertions(+), 1 deletion(-)
include/linux/ioprio.h +5 -0
index beb9ce1..c0faa0b 100644
@@ -18,6 +18,11 @@
  #define ioprio_valid(mask)	(IOPRIO_PRIO_CLASS((mask)) != IOPRIO_CLASS_NONE)
 
  /*
+ * Convert the nice value [19,-20] to io priority value [0,7].
+ */
+#define NICE_TO_IOPRIO(nice)	(nice_to_rlimit(nice) / 5)
+
+/*
   * These are the io priority groups as implemented by CFQ. RT is the realtime
   * class, it always gets premium service. BE is the best-effort scheduling
   * class, the default for any process. IDLE is the idle scheduling class, it
@@ -52,7 +57,7 @@ enum {
Quoted 8 lines

include/linux/ioprio.h enum { · line 61

Quoted 6 lines
include/linux/ioprio.h +1 -1
   */
  static inline int task_nice_ioprio(struct task_struct *task)
  {
-	return (task_nice(task) + 20) / 5;
+	return NICE_TO_IOPRIO(task_nice(task));
  }

How exactly is adding a macro and code complexity making this code better?

About this patch, I think convert a nice value in [-20, 19] to ioprio in [0, 7] is a common requirement. So I add a macro NICE_TO_IOPRIO to achieve it.

Quoted 6 lines

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#12 lore raw

PATCH v2 8/16 fs/hearbeat: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
cc ocfs2-devel at oss.oracle.com
cc Dong Fang <[email protected]>
---
 fs/ocfs2/cluster/heartbeat.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ocfs2/cluster/heartbeat.c +1 -1
index bf482df..7303929 100644
@@ -1107,7 +1107,7 @@ static int o2hb_thread(void *data)
 
 	mlog(ML_HEARTBEAT|ML_KTHREAD, "hb thread running\n");
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	/* Pin node */
 	o2nm_depend_this_node();
Signature · 1 line
1.8.2.1
#13 lore raw

PATCH v2 9/16 driver/block: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
---
 drivers/block/loop.c    | 2 +-
 drivers/block/nbd.c     | 2 +-
 drivers/block/pktcdvd.c | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/block/loop.c +1 -1
index 66e8c3b..c8bf270 100644
@@ -548,7 +548,7 @@ static int loop_thread(void *data)
 	struct loop_device *lo = data;
 	struct bio *bio;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	while (!kthread_should_stop() || !bio_list_empty(&lo->lo_bio_list)) {
 
drivers/block/nbd.c +1 -1
index 55298db..2a1f26b 100644
@@ -533,7 +533,7 @@ static int nbd_thread(void *data)
 	struct nbd_device *nbd = data;
 	struct request *req;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 	while (!kthread_should_stop() || !list_empty(&nbd->waiting_queue)) {
 		/* wait for something to do */
 		wait_event_interruptible(nbd->waiting_wq,
drivers/block/pktcdvd.c +1 -1
index a2af73d..ef166ad 100644
@@ -1463,7 +1463,7 @@ static int kcdrwd(void *foobar)
 	struct packet_data *pkt;
 	long min_sleep_time, residue;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 	set_freezable();
 
 	for (;;) {
Signature · 1 line
1.8.2.1
#14 lore raw

PATCH v2 10/16 driver/char: Replace hardcoding of 19 with MAX_NICE.

In reply to Dongsheng Yang
---
 drivers/char/ipmi/ipmi_si_intf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/ipmi/ipmi_si_intf.c +1 -1
index 03f4189..03c0eed 100644
@@ -999,7 +999,7 @@ static int ipmi_thread(void *data)
 	struct timespec busy_until;
 
 	ipmi_si_set_not_busy(&busy_until);
-	set_user_nice(current, 19);
+	set_user_nice(current, MAX_NICE);
 	while (!kthread_should_stop()) {
 		int busy_wait;
 
Signature · 1 line
1.8.2.1
#15 lore raw

PATCH v2 11/16 drivers/s390: Replace hardcoding of 19 with MAX_NICE.

In reply to Dongsheng Yang
cc Heiko Carstens <[email protected]>
cc Martin Schwidefsky <[email protected]>
cc Ingo Tuchscherer <[email protected]>
---
 drivers/s390/crypto/ap_bus.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/crypto/ap_bus.c +1 -1
index ab3baa7..8eec165 100644
@@ -1803,7 +1803,7 @@ static int ap_poll_thread(void *data)
 	int requests;
 	struct ap_device *ap_dev;
 
-	set_user_nice(current, 19);
+	set_user_nice(current, MAX_NICE);
 	while (1) {
 		if (ap_suspend_flag)
 			return 0;
Signature · 1 line
1.8.2.1
#16 lore raw

PATCH v2 12/16 sched/prio: Add an inline function named rlimit_to_nice in prio.h.

In reply to Dongsheng Yang

This patch add an inline function named rlimit_to_nice to convert rlimit style value in [1, 40] to nice value in [-20, 19].

---
 include/linux/sched/prio.h | 8 ++++++++
 1 file changed, 8 insertions(+)
include/linux/sched/prio.h +8 -0
index c15cbda..b8d729e 100644
@@ -49,4 +49,12 @@ static inline nice_to_rlimit(long nice)
 	return (MAX_NICE - nice + 1);
 }
 
+/*
+ * Convert rlimit style value [1,40] to nice value [-20, 19].
+ */
+static inline rlimit_to_nice(long prio)
+{
+	return (MAX_NICE - prio + 1);
+}
+
 #endif /* _SCHED_PRIO_H */
Signature · 1 line
1.8.2.1
#17 lore raw

PATCH v2 13/16 driver/staging/android: Use rlimit_to_nice to replace opened code implementation.

In reply to Dongsheng Yang

There is a macro rlimit_to_nice in linux/sched/prio.h to convert priority in rlimit to nice value.

This patch replace the opened implementation with rlimit_to_nice.

cc Masanari Iida <[email protected]>
cc Bojan Prtvar <[email protected]>
cc Serban Constantinescu <[email protected]>
---
 drivers/staging/android/binder.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/android/binder.c +2 -2
index 1432d95..19e844b 100644
@@ -436,12 +436,12 @@ static void binder_set_nice(long nice)
 		set_user_nice(current, nice);
 		return;
 	}
-	min_nice = 20 - current->signal->rlim[RLIMIT_NICE].rlim_cur;
+	min_nice = rlimit_to_nice(current->signal->rlim[RLIMIT_NICE].rlim_cur);
 	binder_debug(BINDER_DEBUG_PRIORITY_CAP,
 		     "%d: nice value %ld not allowed use %ld instead\n",
 		      current->pid, nice, min_nice);
 	set_user_nice(current, min_nice);
-	if (min_nice < 20)
+	if (min_nice <= MAX_NICE)
 		return;
 	binder_user_error("%d RLIMIT_NICE not set\n", current->pid);
 }
Signature · 1 line
1.8.2.1
#18 lore raw

PATCH v2 14/16 driver/staging/lustre: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
cc Xiong Zhou <[email protected]>
cc Andreas Dilger <[email protected]>
cc Cyril Roelandt <[email protected]>
cc Kent Overstreet <[email protected]>
cc Peng Tao <[email protected]>
---
 drivers/staging/lustre/lustre/llite/lloop.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/lustre/lustre/llite/lloop.c +1 -1
index 0718905..e40fc84 100644
@@ -407,7 +407,7 @@ static int loop_thread(void *data)
 	int refcheck;
 	int ret = 0;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	lo->lo_state = LLOOP_BOUND;
 
Signature · 1 line
1.8.2.1
#19 lore raw

PATCH v2 15/16 driver/scsi: Replace hardcoding of -20 with MIN_NICE.

In reply to Dongsheng Yang
cc James Smart <[email protected]>
cc Robert Jennings <[email protected]>
cc Robert Love <[email protected]>
---
 drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 4 ++--
 drivers/scsi/bnx2i/bnx2i_hwi.c    | 2 +-
 drivers/scsi/fcoe/fcoe.c          | 2 +-
 drivers/scsi/ibmvscsi/ibmvfc.c    | 2 +-
 drivers/scsi/ibmvscsi/ibmvscsi.c  | 2 +-
 drivers/scsi/lpfc/lpfc_hbadisc.c  | 2 +-
 drivers/scsi/qla2xxx/qla_os.c     | 2 +-
 7 files changed, 8 insertions(+), 8 deletions(-)
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +2 -2
index 9b94850..d24067a 100644
@@ -464,7 +464,7 @@ static int bnx2fc_l2_rcv_thread(void *arg)
 	struct fcoe_percpu_s *bg = arg;
 	struct sk_buff *skb;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 	set_current_state(TASK_INTERRUPTIBLE);
 	while (!kthread_should_stop()) {
 		schedule();
@@ -602,7 +602,7 @@ int bnx2fc_percpu_io_thread(void *arg)
 	struct bnx2fc_work *work, *tmp;
 	LIST_HEAD(work_list);
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 	set_current_state(TASK_INTERRUPTIBLE);
 	while (!kthread_should_stop()) {
 		schedule();
drivers/scsi/bnx2i/bnx2i_hwi.c +1 -1
index e4cf23d..9aaa325 100644
@@ -1870,7 +1870,7 @@ int bnx2i_percpu_io_thread(void *arg)
 	struct bnx2i_work *work, *tmp;
 	LIST_HEAD(work_list);
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	while (!kthread_should_stop()) {
 		spin_lock_bh(&p->p_work_lock);
drivers/scsi/fcoe/fcoe.c +1 -1
index f317000..843a679 100644
@@ -1872,7 +1872,7 @@ static int fcoe_percpu_receive_thread(void *arg)
 
 	skb_queue_head_init(&tmp);
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 retry:
 	while (!kthread_should_stop()) {
drivers/scsi/ibmvscsi/ibmvfc.c +1 -1
index 23f5ba5..8dd4768 100644
@@ -4515,7 +4515,7 @@ static int ibmvfc_work(void *data)
 	struct ibmvfc_host *vhost = data;
 	int rc;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	while (1) {
 		rc = wait_event_interruptible(vhost->work_wait_q,
drivers/scsi/ibmvscsi/ibmvscsi.c +1 -1
index fa76440..2ebfb2b 100644
@@ -2213,7 +2213,7 @@ static int ibmvscsi_work(void *data)
 	struct ibmvscsi_host_data *hostdata = data;
 	int rc;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	while (1) {
 		rc = wait_event_interruptible(hostdata->work_wait_q,
drivers/scsi/lpfc/lpfc_hbadisc.c +1 -1
index 883ea2d..1f8f4a7 100644
@@ -733,7 +733,7 @@ lpfc_do_work(void *p)
 	struct lpfc_hba *phba = p;
 	int rc;
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 	current->flags |= PF_NOFREEZE;
 	phba->data_flags = 0;
 
drivers/scsi/qla2xxx/qla_os.c +1 -1
index 89a5300..0e45568 100644
@@ -4756,7 +4756,7 @@ qla2x00_do_dpc(void *data)
 	ha = (struct qla_hw_data *)data;
 	base_vha = pci_get_drvdata(ha->pdev);
 
-	set_user_nice(current, -20);
+	set_user_nice(current, MIN_NICE);
 
 	set_current_state(TASK_INTERRUPTIBLE);
 	while (!kthread_should_stop()) {
Signature · 1 line
1.8.2.1
#20 lore raw

PATCH v2 16/16 sched: Get rid of opened code implementation of funtion nice_to_rlimit().

In reply to Dongsheng Yang
---
 kernel/sched/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
index ee8004c..d2735eb 100644
@@ -3046,7 +3046,7 @@ EXPORT_SYMBOL(set_user_nice);
 int can_nice(const struct task_struct *p, const int nice)
 {
 	/* convert nice value [19,-20] to rlimit style value [1,40] */
-	int nice_rlim = 20 - nice;
+	int nice_rlim = nice_to_rlimit(nice);
 
 	return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) ||
 		capable(CAP_SYS_NICE));
Signature · 1 line
1.8.2.1