lkml.org 
[lkml]   [1997]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Date
From
Subjectpre2.0.31-2
The following problems are in pre-2.0.31-2:

1) The memory mapped by 'vremap' is marked cacheable. This
is (almost certainly) incorrect as it is memory that is
actually device memory. Note that the mmap call used by
X servers marks the memory as uncached.

This *may* be the cause of the unreliability of the NCR83xxx
SCSI drivers when in memory-mapped mode

See mm.pf below.

2) The auto_irq bug is still present. This can cause a
system hang during bootup when ethernet devices try and
detect their interrupt line. (Particularly noticeable with
the lance chip). [the auto_irq code fails to disable the
interrupt after detecting it.]

See auto_irq.pf below.

3) The protocol number filled into the arp skb is incorrect.

See arp.pf below

4) The ptrace problem with using exit_sig rather than SIGCHLD
is fixed by exit_sig.pf below. This will help strace.
However, I am not happy about the behaviour of wait4 and
the __WCLONE flag. I suspect that this behaviour needs to
be changed, but I am not sure how.

See exit_sig.pf below.

5) I am not happy about the new local port number allocation
code. It has extended the range of local "don't care"
port numbers to include such reserved port numbers as 6000.
I would much prefer that the Solaris range was used
(32768-65534) rather than the range now in use. Alternatively,
this range should be controllable via sysctl. [Some care
needs to be taken to prevent it from overlapping with
the PORT_MASQ range].

I suspect that this change will impact packet filtering
applications.

6) Now that good_socknum can return 0 (meaning no local sockets)
this return code ought to be checked in inet_bind -- rather
than just binding to port 0!

Philip
--
Philip Gladstone +1 617 487 7700
Raptor Systems, Waltham, MA http://www.raptor.com/

--- ./mm/vmalloc.c.30 Sat May 17 08:31:07 1997
+++ ./mm/vmalloc.c Thu May 22 10:01:16 1997
@@ -176,6 +176,20 @@
unsigned long offset)
{
unsigned long end;
+ pgprot_t pgprot;
+
+#if defined(__i386__)
+#if defined(__i486__)
+ pgprot = PAGE_KERNEL_HIGH;
+#else
+ if (x86 > 3)
+ pgprot = PAGE_KERNEL_HIGH;
+ else
+ pgprot = PAGE_KERNEL;
+#endif
+#else
+ pgprot = PAGE_KERNEL;
+#endif

address &= ~PMD_MASK;
end = address + size;
@@ -184,7 +198,7 @@
do {
if (!pte_none(*pte))
printk("remap_area_pte: page already exists\n");
- set_pte(pte, mk_pte(offset, PAGE_KERNEL));
+ set_pte(pte, mk_pte(offset, pgprot));
address += PAGE_SIZE;
offset += PAGE_SIZE;
pte++;
--- ./include/asm-i386/pgtable.h.30 Sat May 17 08:42:27 1997
+++ ./include/asm-i386/pgtable.h Sat May 17 08:44:34 1997
@@ -220,6 +220,7 @@
#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
+#define PAGE_KERNEL_HIGH __pgprot(_PAGE_PCD | _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)

/*
* The i386 can't do page protection for execute, and considers that the same are read.--- linux-pre2/drivers/net/auto_irq.c Fri Mar 1 00:50:43 1996
+++ linux-2.0.30/drivers/net/auto_irq.c Thu May 8 13:50:40 1997
@@ -54,17 +54,23 @@
{
irq_number = irq;
set_bit(irq, (void *)&irq_bitmap); /* irq_bitmap |= 1 << irq; */
- disable_irq(irq);
+ /* This code used to disable the irq. However, the interrupt stub
+ * would then re-enable the interrupt with (potentially) disastrous
+ * consequences
+ */
+ free_irq(irq, dev_id);
return;
}

int autoirq_setup(int waittime)
{
- int i, mask;
+ int i;
int timeout = jiffies + waittime;
int boguscount = (waittime*loops_per_sec) / 100;

irq_handled = 0;
+ irq_bitmap = 0;
+
for (i = 0; i < 16; i++) {
if (test_bit(i, &irqs_busy) == 0
&& request_irq(i, autoirq_probe, SA_INTERRUPT, "irq probe", NULL) == 0)
@@ -72,22 +78,15 @@
}
/* Update our USED lists. */
irqs_used |= ~irq_handled;
- irq_number = 0;
- irq_bitmap = 0;

/* Hang out at least <waittime> jiffies waiting for bogus IRQ hits. */
while (timeout > jiffies && --boguscount > 0)
;

- for (i = 0, mask = 0x01; i < 16; i++, mask <<= 1) {
- if (irq_bitmap & irq_handled & mask) {
- irq_handled &= ~mask;
-#ifdef notdef
- printk(" Spurious interrupt on IRQ %d\n", i);
-#endif
- free_irq(i, NULL);
- }
- }
+ irq_handled &= ~irq_bitmap;
+
+ irq_number = 0; /* We are interested in new interrupts from now on */
+
return irq_handled;
}

@@ -102,6 +101,8 @@
while (timeout > jiffies && --boguscount > 0)
if (irq_number)
break;
+
+ irq_handled &= ~irq_bitmap; /* This eliminates the already reset handlers */

/* Retract the irq handlers that we installed. */
for (i = 0; i < 16; i++) {--- linux-pre2/net/ipv4/arp.c.pre2 Wed Jun 4 11:01:28 1997
+++ linux-pre2/net/ipv4/arp.c Wed Jun 4 11:01:58 1997
@@ -1704,7 +1704,7 @@
skb->arp = 1;
skb->dev = dev;
skb->free = 1;
- skb->protocol = htons (ETH_P_IP);
+ skb->protocol = htons (ETH_P_ARP);

/*
* Fill the device header for the ARP frame--- linux-pre2/arch/i386/kernel/ptrace.c Wed Sep 11 10:57:13 1996
+++ linux-2.0.30/arch/i386/kernel/ptrace.c Tue Jun 3 17:28:24 1997
@@ -530,12 +530,19 @@

asmlinkage void syscall_trace(void)
{
+ int exit_signal;
+
if ((current->flags & (PF_PTRACED|PF_TRACESYS))
!= (PF_PTRACED|PF_TRACESYS))
return;
current->exit_code = SIGTRAP;
current->state = TASK_STOPPED;
+
+ exit_signal = current->exit_signal;
+ current->exit_signal = SIGCHLD;
notify_parent(current);
+ current->exit_signal = exit_signal;
+
schedule();
/*
* this isn't the same as continuing with a signal, but it will do
--- linux-pre2/arch/i386/kernel/signal.c Wed Dec 11 09:41:01 1996
+++ linux-2.0.30/arch/i386/kernel/signal.c Tue Jun 3 17:38:57 1997
@@ -284,9 +284,13 @@
sa = current->sig->action + signr;
signr++;
if ((current->flags & PF_PTRACED) && signr != SIGKILL) {
+ int exit_signal;
current->exit_code = signr;
current->state = TASK_STOPPED;
+ exit_signal = current->exit_signal;
+ current->exit_signal = SIGCHLD;
notify_parent(current);
+ current->exit_signal = exit_signal;
schedule();
if (!(signr = current->exit_code))
continue;
@@ -323,8 +327,14 @@
current->state = TASK_STOPPED;
current->exit_code = signr;
if (!(current->p_pptr->sig->action[SIGCHLD-1].sa_flags &
- SA_NOCLDSTOP))
+ SA_NOCLDSTOP)) {
+ int exit_signal;
+
+ exit_signal = current->exit_signal;
+ current->exit_signal = SIGCHLD;
notify_parent(current);
+ current->exit_signal = exit_signal;
+ }
schedule();
continue;
\
 
 \ /
  Last update: 2005-03-22 13:39    [from the cache]
©2003-2014 Jasper Spaans. hosted at Digital Ocean