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    [W:0.050 / U:177.436 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site