Commit 4cfb4152 authored by Linus Torvalds's avatar Linus Torvalds

Linux 2.2.5 - and a vacation

I made Linux-2.2.5 yesterday (as some people already have noticed: due to
popular demand I try to delay the announcement for some time in order to
let the thing percolate to mirror sites, in case anybody wondered).
The 2.2.5 release is meant to be a final cleanup release before I leave
for a two-week vacation. So please take these release notes to also mean
that it is probably a good idea to hold off emailing me stuff directly,
unless it is a major bug that you really think I should look at
immediately. I would suggest people discuss problems on the mailing list
and on the newsgroups, where other competent people are, rather than
expecting me to do much about it.

Also, note that there have been various indications that egcs potentially
miscompiles the kernel, or at least makes some problems worse. We don't
know whether that is due to one or more kernel bugs, compiler problems, or
just combinations of "features" in both. I would suggest that if you have
problems you at least verify whether the problems still exist with
gcc-2.7.2.

That said, I bet that both the kernel people and the egcs people would be
really happy the more people look into this - if somebody feels motivated
enough and sees problems with egcs, it would be extremely powerful to try
to pinpoint the particular file that seems to bring on the problems. I'm
afraid it needs a known failure mode and lots of legwork to find out what
triggers it, though.

 - compiles with accounting.
 - add support for Microgate SyncLink and Synchronous HDLC
 - stallion driver update
 - alpha EV6 and SMP fix for bootup with newer compilers
 - ptrace fix for sparc/i386
 - small sparc updates
 - floppy driver could oops at bootup under certain setups
 - random driver updates (bw-qcam, sound driver error codes, etc oneliners)
 - FIOASYNC ioctl fix
 - network locking fixes
 - SMP "struct user" and signal sending fixes

Have fun, because I will,

                        Linus
parent d3c37b33
This diff is collapsed.
......@@ -499,6 +499,7 @@ secondary_cpu_start(int cpuid, struct task_struct *idle)
return;
}
mdelay(1);
barrier();
}
DBGS(("secondary_cpu_start: SUCCESS for CPU %d!!!\n", cpuid));
}
......@@ -541,6 +542,7 @@ send_cpu_msg(char *str, int cpuid)
if (!(hwrpb->txrdy & cpumask))
goto ready1;
udelay(100);
barrier();
}
goto timeout;
......@@ -549,6 +551,7 @@ send_cpu_msg(char *str, int cpuid)
if (!(hwrpb->txrdy & cpumask))
goto ready2;
udelay(100);
barrier();
}
goto timeout;
......
......@@ -347,6 +347,17 @@ extern unsigned long xcall_flush_tlb_all;
extern unsigned long xcall_tlbcachesync;
extern unsigned long xcall_flush_cache_all;
extern unsigned long xcall_report_regs;
extern unsigned long xcall_receive_signal;
void smp_receive_signal(int cpu)
{
if(smp_processors_ready &&
(cpu_present_map & (1UL<<cpu)) != 0) {
u64 pstate, data0 = (((u64)&xcall_receive_signal) & 0xffffffff);
__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
xcall_deliver(data0, 0, 0, pstate, cpu);
}
}
void smp_report_regs(void)
{
......
/* $Id: init.c,v 1.124 1999/02/08 07:01:42 ecd Exp $
/* $Id: init.c,v 1.125 1999/03/28 08:39:33 davem Exp $
* arch/sparc64/mm/init.c
*
* Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
......@@ -142,9 +142,9 @@ void show_mem(void)
printk("%d reserved pages\n",reserved);
printk("%d pages shared\n",shared);
printk("%d pages swap cached\n",cached);
printk("%ld pages in page table cache\n",pgtable_cache_size);
printk("%d pages in page table cache\n",pgtable_cache_size);
#ifndef __SMP__
printk("%ld entries in page dir cache\n",pgd_cache_size);
printk("%d entries in page dir cache\n",pgd_cache_size);
#endif
show_buffers();
#ifdef CONFIG_NET
......
/* $Id: ultra.S,v 1.31 1998/11/07 06:39:21 davem Exp $
/* $Id: ultra.S,v 1.32 1999/03/28 08:39:34 davem Exp $
* ultra.S: Don't expand these all over the place...
*
* Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
......@@ -261,6 +261,21 @@ xcall_capture:
b,pt %xcc, rtrap
clr %l6
.globl xcall_receive_signal
xcall_receive_signal:
rdpr %pstate, %g2
wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate
rdpr %tstate, %g1
andcc %g1, TSTATE_PRIV, %g0
/* If we did not trap from user space, just ignore. */
bne,pn %xcc, 99f
sethi %hi(109f), %g7
b,pt %xcc, etrap
109: or %g7, %lo(109b), %g7
b,pt %xcc, rtrap
clr %l6
99: retry
/* These two are not performance critical... */
.globl xcall_flush_tlb_all
xcall_flush_tlb_all:
......
This diff is collapsed.
This diff is collapsed.
......@@ -3626,7 +3626,7 @@ static inline int line_info(char *buf, struct mgsl_struct *info)
}
spin_unlock_irqrestore(&info->irq_spinlock,flags);
#if LINUX_VERSION_CODE >= VERSION(2,1,0)
#if 0 && LINUX_VERSION_CODE >= VERSION(2,1,0)
ret += sprintf(buf+ret, "irq_spinlock=%08X\n",
info->irq_spinlock.lock );
#endif
......
......@@ -73,6 +73,7 @@ static void socal_memcpy(void *d, void *s, int size)
}
}
#ifdef HAVE_SOCAL_UCODE
static void socal_bzero(void *d, int size)
{
u32 *dp = (u32 *)d;
......@@ -81,6 +82,7 @@ static void socal_bzero(void *d, int size)
size -= sizeof(u32);
}
}
#endif
static inline void socal_disable(struct socal *s)
{
......
......@@ -1587,7 +1587,7 @@ static int fbcon_do_set_font(int unit, struct console_font_op *op, u8 *data, int
if (CON_IS_VISIBLE(conp) && softback_buf) {
int l = fbcon_softback_size / conp->vc_size_row;
if (l > 5)
softback_end += l * conp->vc_size_row;
softback_end = softback_buf + l * conp->vc_size_row;
else {
/* Smaller scrollback makes no sense, and 0 would screw
the operation totally */
......
......@@ -39,7 +39,7 @@ static inline cycles_t get_cycles (void)
#else
unsigned long eax, edx;
__asm__("rdtsc":"=a" (eax), "=d" (edx));
__asm__ __volatile__("rdtsc":"=a" (eax), "=d" (edx));
return eax;
#endif
}
......
/* $Id: pgtable.h,v 1.102 1999/01/22 16:19:29 jj Exp $
/* $Id: pgtable.h,v 1.103 1999/03/28 08:40:04 davem Exp $
* pgtable.h: SpitFire page table operations.
*
* Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
......@@ -333,8 +333,8 @@ static __inline__ pte_t pte_mkdirty(pte_t _pte)
extern struct pgtable_cache_struct {
unsigned long *pgd_cache;
unsigned long *pte_cache;
unsigned long pgcache_size;
unsigned long pgdcache_size;
unsigned int pgcache_size;
unsigned int pgdcache_size;
} pgt_quicklists;
#endif
#define pgd_quicklist (pgt_quicklists.pgd_cache)
......
......@@ -98,8 +98,17 @@ extern __inline__ int hard_smp_processor_id(void)
/* This needn't do anything as we do not sleep the cpu
* inside of the idler task, so an interrupt is not needed
* to get a clean fast response.
*
* Addendum: We do want it to do something for the signal
* delivery case, we detect that by just seeing
* if we are trying to send this to an idler or not.
*/
extern __inline__ void smp_send_reschedule(int cpu) { }
extern __inline__ void smp_send_reschedule(int cpu)
{
extern void smp_receive_signal(int);
if(cpu_data[cpu].idle_volume == 0)
smp_receive_signal(cpu);
}
/* This is a nop as well because we capture all other cpus
* anyways when making the PROM active.
......
......@@ -70,7 +70,7 @@
#define ARPHRD_FCPP 784 /* Point to point fibrechanel */
#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */
#define ARPHRD_FCPL 786 /* Fibrechannel public loop */
#define ARPHRD_FCFABRIC 786 /* Fibrechannel fabric */
#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */
/* 787->799 reserved for fibrechannel media types */
......
......@@ -113,6 +113,7 @@ struct sched_param {
*/
extern rwlock_t tasklist_lock;
extern spinlock_t scheduler_lock;
extern spinlock_t runqueue_lock;
extern void sched_init(void);
extern void show_state(void);
......
......@@ -845,6 +845,9 @@ extern __inline__ void skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
{
#ifdef CONFIG_FILTER
struct sk_filter *filter;
#endif
/* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
number of warnings when compiling with -W --ANK
*/
......@@ -852,7 +855,7 @@ extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
return -ENOMEM;
#ifdef CONFIG_FILTER
if (sk->filter && sk_filter(skb, sk->filter))
if ((filter = sk->filter) != NULL && sk_filter(skb, filter))
return -EPERM; /* Toss packet */
#endif /* CONFIG_FILTER */
......
......@@ -7,7 +7,7 @@
* handler for protocols to use and generic option handler.
*
*
* Version: $Id: sock.c,v 1.78 1999/03/25 10:03:55 davem Exp $
* Version: $Id: sock.c,v 1.79 1999/03/28 10:18:25 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
......@@ -150,6 +150,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
char *optval, int optlen)
{
struct sock *sk=sock->sk;
#ifdef CONFIG_FILTER
struct sk_filter *filter;
#endif
int val;
int valbool;
int err;
......@@ -341,16 +344,11 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
break;
case SO_DETACH_FILTER:
if(sk->filter) {
struct sk_filter *filter;
filter = sk->filter;
filter = sk->filter;
if(filter) {
sk->filter = NULL;
synchronize_bh();
if (filter)
sk_filter_release(sk, filter);
sk_filter_release(sk, filter);
return 0;
}
return -ENOENT;
......@@ -500,22 +498,16 @@ struct sock *sk_alloc(int family, int priority, int zero_it)
void sk_free(struct sock *sk)
{
if (sk->destruct)
sk->destruct(sk);
#ifdef CONFIG_FILTER
if (sk->filter) {
sk_filter_release(sk, sk->filter);
sk->filter = NULL;
}
struct sk_filter *filter;
#endif
if (atomic_read(&sk->omem_alloc))
printk(KERN_DEBUG "sk_free: optmem leakage (%d bytes) detected.\n", atomic_read(&sk->omem_alloc));
if (sk->destruct)
sk->destruct(sk);
#ifdef CONFIG_FILTER
if (sk->filter) {
sk_filter_release(sk, sk->filter);
filter = sk->filter;
if (filter) {
sk_filter_release(sk, filter);
sk->filter = NULL;
}
#endif
......
/*
* $Id: ipconfig.c,v 1.19 1999/01/15 06:54:00 davem Exp $
* $Id: ipconfig.c,v 1.20 1999/03/28 10:18:28 davem Exp $
*
* Automatic Configuration of IP -- use BOOTP or RARP or user-supplied
* information to configure own IP address and routes.
......@@ -825,9 +825,9 @@ int __init ip_auto_config(void)
*/
if (ic_myaddr == INADDR_NONE ||
#ifdef CONFIG_ROOT_NFS
root_server_addr == INADDR_NONE ||
(root_server_addr == INADDR_NONE && ic_servaddr == INADDR_NONE) ||
#endif
(ic_first_dev && ic_first_dev->next)) {
ic_first_dev->next) {
#ifdef CONFIG_IP_PNP_DYNAMIC
if (ic_dynamic() < 0) {
printk(KERN_ERR "IP-Config: Auto-configuration of network failed.\n");
......
......@@ -5,7 +5,7 @@
*
* Implementation of the Transmission Control Protocol(TCP).
*
* Version: $Id: tcp_ipv4.c,v 1.170 1999/03/21 05:22:47 davem Exp $
* Version: $Id: tcp_ipv4.c,v 1.171 1999/03/28 10:18:26 davem Exp $
*
* IPv4 specific functions
*
......@@ -1305,6 +1305,9 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
if(newsk != NULL) {
struct tcp_opt *newtp;
#ifdef CONFIG_FILTER
struct sk_filter *filter;
#endif
memcpy(newsk, sk, sizeof(*newsk));
newsk->sklist_next = NULL;
......@@ -1326,8 +1329,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
skb_queue_head_init(&newsk->back_log);
skb_queue_head_init(&newsk->error_queue);
#ifdef CONFIG_FILTER
if (newsk->filter)
sk_filter_charge(newsk, newsk->filter);
if ((filter = newsk->filter) != NULL)
sk_filter_charge(newsk, filter);
#endif
/* Now setup tcp_opt */
......@@ -1559,9 +1562,9 @@ static inline struct sock *tcp_v4_hnd_req(struct sock *sk,struct sk_buff *skb)
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
{
#ifdef CONFIG_FILTER
if (sk->filter && sk_filter(skb, sk->filter))
struct sk_filter *filter = sk->filter;
if (filter && sk_filter(skb, filter))
goto discard;
#endif /* CONFIG_FILTER */
......
......@@ -5,7 +5,7 @@
* Authors:
* Pedro Roque <roque@di.fc.ul.pt>
*
* $Id: tcp_ipv6.c,v 1.100 1999/03/21 05:22:59 davem Exp $
* $Id: tcp_ipv6.c,v 1.101 1999/03/28 10:18:30 davem Exp $
*
* Based on:
* linux/net/ipv4/tcp.c
......@@ -1181,6 +1181,9 @@ static inline struct sock *tcp_v6_hnd_req(struct sock *sk, struct sk_buff *skb)
static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
{
#ifdef CONFIG_FILTER
struct sk_filter *filter;
#endif
int users = 0;
/* Imagine: socket is IPv6. IPv4 packet arrives,
......@@ -1195,7 +1198,8 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
return tcp_v4_do_rcv(sk, skb);
#ifdef CONFIG_FILTER
if (sk->filter && sk_filter(skb, sk->filter))
filter = sk->filter;
if (filter && sk_filter(skb, filter))
goto discard;
#endif /* CONFIG_FILTER */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment