diff options
| -rw-r--r-- | arch/powerpc/kernel/smp.c | 1 | ||||
| -rw-r--r-- | arch/ppc/kernel/idle.c | 2 | ||||
| -rw-r--r-- | kernel/sched.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/clnt.c | 32 | 
4 files changed, 33 insertions, 5 deletions
| diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 5c330c3366e4..36d67a8d7cbb 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -510,6 +510,7 @@ int __devinit start_secondary(void *unused) | |||
| 510 | 510 | ||
| 511 | smp_store_cpu_info(cpu); | 511 | smp_store_cpu_info(cpu); | 
| 512 | set_dec(tb_ticks_per_jiffy); | 512 | set_dec(tb_ticks_per_jiffy); | 
| 513 | preempt_disable(); | ||
| 513 | cpu_callin_map[cpu] = 1; | 514 | cpu_callin_map[cpu] = 1; | 
| 514 | 515 | ||
| 515 | smp_ops->setup_cpu(cpu); | 516 | smp_ops->setup_cpu(cpu); | 
| diff --git a/arch/ppc/kernel/idle.c b/arch/ppc/kernel/idle.c index 3c4e4cb61074..821a75e45602 100644 --- a/arch/ppc/kernel/idle.c +++ b/arch/ppc/kernel/idle.c | |||
| @@ -63,7 +63,7 @@ void cpu_idle(void) | |||
| 63 | int cpu = smp_processor_id(); | 63 | int cpu = smp_processor_id(); | 
| 64 | 64 | ||
| 65 | for (;;) { | 65 | for (;;) { | 
| 66 | while (need_resched()) { | 66 | while (!need_resched()) { | 
| 67 | if (ppc_md.idle != NULL) | 67 | if (ppc_md.idle != NULL) | 
| 68 | ppc_md.idle(); | 68 | ppc_md.idle(); | 
| 69 | else | 69 | else | 
| diff --git a/kernel/sched.c b/kernel/sched.c index ac3f5cc3bb51..b6506671b2be 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -815,7 +815,8 @@ static void activate_task(task_t *p, runqueue_t *rq, int local) | |||
| 815 | } | 815 | } | 
| 816 | #endif | 816 | #endif | 
| 817 | 817 | ||
| 818 | p->prio = recalc_task_prio(p, now); | 818 | if (!rt_task(p)) | 
| 819 | p->prio = recalc_task_prio(p, now); | ||
| 819 | 820 | ||
| 820 | /* | 821 | /* | 
| 821 | * This checks to make sure it's not an uninterruptible task | 822 | * This checks to make sure it's not an uninterruptible task | 
| diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 702ede309b06..61c3abeaccae 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -55,6 +55,7 @@ static void call_bind(struct rpc_task *task); | |||
| 55 | static void call_bind_status(struct rpc_task *task); | 55 | static void call_bind_status(struct rpc_task *task); | 
| 56 | static void call_transmit(struct rpc_task *task); | 56 | static void call_transmit(struct rpc_task *task); | 
| 57 | static void call_status(struct rpc_task *task); | 57 | static void call_status(struct rpc_task *task); | 
| 58 | static void call_transmit_status(struct rpc_task *task); | ||
| 58 | static void call_refresh(struct rpc_task *task); | 59 | static void call_refresh(struct rpc_task *task); | 
| 59 | static void call_refreshresult(struct rpc_task *task); | 60 | static void call_refreshresult(struct rpc_task *task); | 
| 60 | static void call_timeout(struct rpc_task *task); | 61 | static void call_timeout(struct rpc_task *task); | 
| @@ -672,6 +673,18 @@ call_allocate(struct rpc_task *task) | |||
| 672 | rpc_exit(task, -ERESTARTSYS); | 673 | rpc_exit(task, -ERESTARTSYS); | 
| 673 | } | 674 | } | 
| 674 | 675 | ||
| 676 | static inline int | ||
| 677 | rpc_task_need_encode(struct rpc_task *task) | ||
| 678 | { | ||
| 679 | return task->tk_rqstp->rq_snd_buf.len == 0; | ||
| 680 | } | ||
| 681 | |||
| 682 | static inline void | ||
| 683 | rpc_task_force_reencode(struct rpc_task *task) | ||
| 684 | { | ||
| 685 | task->tk_rqstp->rq_snd_buf.len = 0; | ||
| 686 | } | ||
| 687 | |||
| 675 | /* | 688 | /* | 
| 676 | * 3. Encode arguments of an RPC call | 689 | * 3. Encode arguments of an RPC call | 
| 677 | */ | 690 | */ | 
| @@ -867,12 +880,14 @@ call_transmit(struct rpc_task *task) | |||
| 867 | if (task->tk_status != 0) | 880 | if (task->tk_status != 0) | 
| 868 | return; | 881 | return; | 
| 869 | /* Encode here so that rpcsec_gss can use correct sequence number. */ | 882 | /* Encode here so that rpcsec_gss can use correct sequence number. */ | 
| 870 | if (task->tk_rqstp->rq_bytes_sent == 0) { | 883 | if (rpc_task_need_encode(task)) { | 
| 884 | task->tk_rqstp->rq_bytes_sent = 0; | ||
| 871 | call_encode(task); | 885 | call_encode(task); | 
| 872 | /* Did the encode result in an error condition? */ | 886 | /* Did the encode result in an error condition? */ | 
| 873 | if (task->tk_status != 0) | 887 | if (task->tk_status != 0) | 
| 874 | goto out_nosend; | 888 | goto out_nosend; | 
| 875 | } | 889 | } | 
| 890 | task->tk_action = call_transmit_status; | ||
| 876 | xprt_transmit(task); | 891 | xprt_transmit(task); | 
| 877 | if (task->tk_status < 0) | 892 | if (task->tk_status < 0) | 
| 878 | return; | 893 | return; | 
| @@ -884,6 +899,7 @@ call_transmit(struct rpc_task *task) | |||
| 884 | out_nosend: | 899 | out_nosend: | 
| 885 | /* release socket write lock before attempting to handle error */ | 900 | /* release socket write lock before attempting to handle error */ | 
| 886 | xprt_abort_transmit(task); | 901 | xprt_abort_transmit(task); | 
| 902 | rpc_task_force_reencode(task); | ||
| 887 | } | 903 | } | 
| 888 | 904 | ||
| 889 | /* | 905 | /* | 
| @@ -915,7 +931,6 @@ call_status(struct rpc_task *task) | |||
| 915 | break; | 931 | break; | 
| 916 | case -ECONNREFUSED: | 932 | case -ECONNREFUSED: | 
| 917 | case -ENOTCONN: | 933 | case -ENOTCONN: | 
| 918 | req->rq_bytes_sent = 0; | ||
| 919 | if (clnt->cl_autobind) | 934 | if (clnt->cl_autobind) | 
| 920 | clnt->cl_port = 0; | 935 | clnt->cl_port = 0; | 
| 921 | task->tk_action = call_bind; | 936 | task->tk_action = call_bind; | 
| @@ -937,7 +952,18 @@ call_status(struct rpc_task *task) | |||
| 937 | } | 952 | } | 
| 938 | 953 | ||
| 939 | /* | 954 | /* | 
| 940 | * 6a. Handle RPC timeout | 955 | * 6a. Handle transmission errors. | 
| 956 | */ | ||
| 957 | static void | ||
| 958 | call_transmit_status(struct rpc_task *task) | ||
| 959 | { | ||
| 960 | if (task->tk_status != -EAGAIN) | ||
| 961 | rpc_task_force_reencode(task); | ||
| 962 | call_status(task); | ||
| 963 | } | ||
| 964 | |||
| 965 | /* | ||
| 966 | * 6b. Handle RPC timeout | ||
| 941 | * We do not release the request slot, so we keep using the | 967 | * We do not release the request slot, so we keep using the | 
| 942 | * same XID for all retransmits. | 968 | * same XID for all retransmits. | 
| 943 | */ | 969 | */ | 
