Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Dec 2003 18:09:06 +0100 (CET)
From:      Hanspeter Roth <hampi@rootshell.be>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/60233: [patch] cdrtools: priority conflicts with cdda2wav/cdrecord
Message-ID:  <200312141709.hBEH96b9005241@9.233.3.213.dial.bluewin.ch>
Resent-Message-ID: <200312141710.hBEHAHiD024288@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         60233
>Category:       ports
>Synopsis:       [patch] cdrtools: priority conflicts with cdda2wav/cdrecord
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Dec 14 09:10:10 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Hanspeter Roth
>Release:        FreeBSD 4.9-RELEASE i386
>Organization:
>Environment:
	System: FreeBSD snoopy.here 4.9-RELEASE FreeBSD 4.9-RELEASE #0: Sat Nov 29 20:42:43 CET 2003 hampi@snoopy.here:/usr/src/sys/compile/D2 i386

	cdrtools-2.0.3
	
>Description:
	
	Cdda2wav and cdrecord use the highest realtime priority and thus
	may conflict with other realtime processes such as isdnd.
	I have a system which occasionally hangs if cdrecord is running
	while a PPP over ISDN connection is up.

	Cdda2wav may also cause the system to spend the CPU in an excessive
	amount of time (>80%) in 'interrupt mode' and thus freezing the
	display if cdda2wav is run without appropriate -S and an ATAPI drive
	uses UDMA33.
	
>How-To-Repeat:
	
>Fix:

	Use rtprio and renice after cdda2wav or cdrecord has been launched.
	Cdda2wav may be run with speed limitation -S to reduce CPU time 
	spent in 'interrupt mode'.

	The patches allow to make use of environment variables to control
	the realtime priority and in case of cdda2wav a preset nice priority
	will be honored.

--- cdrecord-2.00.3.diff begins here ---
diff -ru cdrtools-2.00.3.orig/cdrecord/cdrecord.1 cdrtools-2.00.3/cdrecord/cdrecord.1
--- cdrtools-2.00.3.orig/cdrecord/cdrecord.1	Tue Dec 24 16:28:40 2002
+++ cdrtools-2.00.3/cdrecord/cdrecord.1	Fri Dec 12 22:26:42 2003
@@ -1379,6 +1379,15 @@
 will allow you to write at the full RAW encoding speed a single CPU supports.
 This will create high potential of buffer underruns. Use with care.
 .TP
+.B CDR_RTPRIORITY
+If this environment variable is set on a system supporting realtime scheduling,
+.B cdrecord
+will try to set it's realtime priority according to
+.BR CDR_RTPRIORITY .
+If set to -1,
+.B cdrecord
+will run with nice priority only.
+.TP
 .B RSH
 If the 
 .B RSH
diff -ru cdrtools-2.00.3.orig/cdrecord/cdrecord.c cdrtools-2.00.3/cdrecord/cdrecord.c
--- cdrtools-2.00.3.orig/cdrecord/cdrecord.c	Wed May 28 14:06:37 2003
+++ cdrtools-2.00.3/cdrecord/cdrecord.c	Fri Dec 12 21:48:50 2003
@@ -3699,6 +3699,8 @@
 	int pri;
 {
 	struct sched_param scp;
+	char	*envvar;
+	int	cdrec_priority;
 
 	/*
 	 * Verify that scheduling is available
@@ -3711,6 +3713,13 @@
 #endif
 	fillbytes(&scp, sizeof(scp), '\0');
 	scp.sched_priority = sched_get_priority_max(SCHED_RR) - pri;
+	if ((envvar = getenv("CDR_RTPRIORITY")) != NULL) {
+		cdrec_priority = atoi(envvar);
+	    	if (cdrec_priority >= sched_get_priority_min(SCHED_RR))
+			scp.sched_priority = cdrec_priority - pri;
+		else
+		    	return (-1);
+	}
 	if (sched_setscheduler(0, SCHED_RR, &scp) < 0) {
 		errmsg("WARNING: Cannot set RR-scheduler\n");
 		return (-1);
--- cdrecord-2.00.3.diff ends here ---

--- cdda2wav-2.00.3.diff begins here ---
diff -ru cdrtools-2.00.3.orig/cdda2wav/cdda2wav.1 cdrtools-2.00.3/cdda2wav/cdda2wav.1
--- cdrtools-2.00.3.orig/cdda2wav/cdda2wav.1	Tue Nov 26 22:36:56 2002
+++ cdrtools-2.00.3/cdda2wav/cdda2wav.1	Sat Dec 13 15:23:42 2003
@@ -299,6 +299,11 @@
 is used to set the device name. The device naming is compatible with Jörg
 Schilling's cdrecord package.
 .TP
+.B CDDA_RTPRIORITY
+is used to set an alternate realtime priority. If set to -1
+.B cdda2wav
+runs at nice priority only.
+.TP
 .B CDDBP_SERVER
 is used for cddbp title lookups when supplied.
 .TP
diff -ru cdrtools-2.00.3.orig/cdda2wav/cdda2wav.c cdrtools-2.00.3/cdda2wav/cdda2wav.c
--- cdrtools-2.00.3.orig/cdda2wav/cdda2wav.c	Thu Nov 21 17:34:33 2002
+++ cdrtools-2.00.3/cdda2wav/cdda2wav.c	Sat Dec 13 15:06:13 2003
@@ -966,6 +966,8 @@
 static void
 switch_to_realtime_priority()
 {
+    	char		*envvar;
+	int		priority;
 #ifdef  _SC_PRIORITY_SCHEDULING
 	if (sysconf(_SC_PRIORITY_SCHEDULING) == -1) {
 		errmsg("WARNING: RR-scheduler not available, disabling.\n");
@@ -978,6 +980,13 @@
 	sched_fifo_min = sched_get_priority_min(SCHED_FIFO);
 	sched_fifo_max = sched_get_priority_max(SCHED_FIFO);
 	sched_parms.sched_priority = sched_fifo_max - 1;
+	if ((envvar = getenv("CDDA_RTPRIORITY")) != NULL) {
+		priority = atoi(envvar);
+	    	if (priority >= sched_fifo_min)
+			sched_parms.sched_priority = priority;
+		else
+		    	return;
+	}
 	needroot(0);
 	if (-1 == sched_setscheduler(getpid(), SCHED_FIFO, &sched_parms)
 		&& global.quiet != 1)
@@ -2451,7 +2460,9 @@
   /* try to get some extra kicks */
   needroot(0);
 #if defined HAVE_SETPRIORITY
-  setpriority(PRIO_PROCESS, 0, -20);
+  if (getpriority(PRIO_PROCESS, 0) == 0) { /* if not preset */
+    setpriority(PRIO_PROCESS, 0, -20);
+  }
 #else
 # if defined(HAVE_NICE) && (HAVE_NICE == 1)
   nice(-20);
--- cdda2wav-2.00.3.diff ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312141709.hBEH96b9005241>