On 12/5/06, Gerrit Renker <[EMAIL PROTECTED]> wrote:
                        } else {
                                err = dccp_wait_for_ccid(sk, skb, &timeo);
                                timeo = DCCP_XMIT_TIMEO;          /* <==== I 
think you mean this one */
                        }


Yes I did mean that one


|  Anyway feel free to write a patch or I might when I get home from work
|  or tomorrow
I'd be happy to see a patch - maybe several cases can be folded into one.

Sending as attachment to message as mailer will mangle here I think -
reproduced below inline but I know gmail will mangle for sure. Compile
tested only as at work but I think I understand this code pretty well
and simplifying only. Removes the need for your patch altogether.

commit ab874add9a959d5b8a74ea654ad3c463da621bc0
Author: Ian McDonald <[EMAIL PROTECTED]>
Date:   Tue Dec 5 10:48:49 2006 +1300

This patch simplifies things a lot by removing timeo as not needed.

Other simplifications flow on from this such as removing constants.

As a result of this EAGAIN is not returned any more.

Inspired by Gerrit Renker

Signed-off-by: Ian McDonald <[EMAIL PROTECTED]>

diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 6888698..44829d6 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -80,8 +80,6 @@ extern void dccp_time_wait(struct sock *sk, int
state, int timeo);

#define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */

-#define DCCP_XMIT_TIMEO 30000 /* Time/msecs for blocking transmit per packet */
-
/* sysctl variables for DCCP */
extern int  sysctl_dccp_request_retries;
extern int  sysctl_dccp_retries1;
diff --git a/net/dccp/output.c b/net/dccp/output.c
index 400c30b..c4460f6 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -177,12 +177,11 @@ void dccp_write_space(struct sock *sk)
 * @sk: socket to wait for
 * @timeo: for how long
 */
-static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb,
-                             long *timeo)
+static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb)
{
        struct dccp_sock *dp = dccp_sk(sk);
        DEFINE_WAIT(wait);
-       long delay;
+       unsigned long delay;
        int rc;

        while (1) {
@@ -190,8 +189,6 @@ static int dccp_wait_for_ccid(struct sock *sk,
struct sk_buff *skb,

                if (sk->sk_err)
                        goto do_error;
-               if (!*timeo)
-                       goto do_nonblock;
                if (signal_pending(current))
                        goto do_interrupted;

@@ -199,12 +196,9 @@ static int dccp_wait_for_ccid(struct sock *sk,
struct sk_buff *skb,
                if (rc <= 0)
                        break;
                delay = msecs_to_jiffies(rc);
-               if (delay > *timeo || delay < 0)
-                       goto do_nonblock;
-
                sk->sk_write_pending++;
                release_sock(sk);
-               *timeo -= schedule_timeout(delay);
+               schedule_timeout(delay);
                lock_sock(sk);
                sk->sk_write_pending--;
        }
@@ -215,11 +209,8 @@ out:
do_error:
        rc = -EPIPE;
        goto out;
-do_nonblock:
-       rc = -EAGAIN;
-       goto out;
do_interrupted:
-       rc = sock_intr_errno(*timeo);
+       rc = -EINTR;
        goto out;
}

@@ -240,8 +231,6 @@ void dccp_write_xmit(struct sock *sk, int block)
{
        struct dccp_sock *dp = dccp_sk(sk);
        struct sk_buff *skb;
-       long timeo = DCCP_XMIT_TIMEO;   /* If a packet is taking longer than
-                                          this we have other issues */

        while ((skb = skb_peek(&sk->sk_write_queue))) {
                int err = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
@@ -251,10 +240,8 @@ void dccp_write_xmit(struct sock *sk, int block)
                                sk_reset_timer(sk, &dp->dccps_xmit_timer,
                                                msecs_to_jiffies(err)+jiffies);
                                break;
-                       } else {
-                               err = dccp_wait_for_ccid(sk, skb, &timeo);
-                               timeo = DCCP_XMIT_TIMEO;
-                       }
+                       } else
+                               err = dccp_wait_for_ccid(sk, skb);
                        if (err)
                                DCCP_BUG("err=%d after dccp_wait_for_ccid", 
err);
                }
commit ab874add9a959d5b8a74ea654ad3c463da621bc0
Author: Ian McDonald <[EMAIL PROTECTED]>
Date:   Tue Dec 5 10:48:49 2006 +1300

This patch simplifies things a lot by removing timeo as not needed.
    
Other simplifications flow on from this such as removing constants.
    
As a result of this EAGAIN is not returned any more.
    
Inspired by Gerrit Renker
    
Signed-off-by: Ian McDonald <[EMAIL PROTECTED]>

diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index 6888698..44829d6 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -80,8 +80,6 @@ extern void dccp_time_wait(struct sock *sk, int state, int 
timeo);
 
 #define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */
 
-#define DCCP_XMIT_TIMEO 30000 /* Time/msecs for blocking transmit per packet */
-
 /* sysctl variables for DCCP */
 extern int  sysctl_dccp_request_retries;
 extern int  sysctl_dccp_retries1;
diff --git a/net/dccp/output.c b/net/dccp/output.c
index 400c30b..c4460f6 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -177,12 +177,11 @@ void dccp_write_space(struct sock *sk)
  * @sk: socket to wait for
  * @timeo: for how long
  */
-static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb,
-                             long *timeo)
+static int dccp_wait_for_ccid(struct sock *sk, struct sk_buff *skb)
 {
        struct dccp_sock *dp = dccp_sk(sk);
        DEFINE_WAIT(wait);
-       long delay;
+       unsigned long delay;
        int rc;
 
        while (1) {
@@ -190,8 +189,6 @@ static int dccp_wait_for_ccid(struct sock *sk, struct 
sk_buff *skb,
 
                if (sk->sk_err)
                        goto do_error;
-               if (!*timeo)
-                       goto do_nonblock;
                if (signal_pending(current))
                        goto do_interrupted;
 
@@ -199,12 +196,9 @@ static int dccp_wait_for_ccid(struct sock *sk, struct 
sk_buff *skb,
                if (rc <= 0)
                        break;
                delay = msecs_to_jiffies(rc);
-               if (delay > *timeo || delay < 0)
-                       goto do_nonblock;
-
                sk->sk_write_pending++;
                release_sock(sk);
-               *timeo -= schedule_timeout(delay);
+               schedule_timeout(delay);
                lock_sock(sk);
                sk->sk_write_pending--;
        }
@@ -215,11 +209,8 @@ out:
 do_error:
        rc = -EPIPE;
        goto out;
-do_nonblock:
-       rc = -EAGAIN;
-       goto out;
 do_interrupted:
-       rc = sock_intr_errno(*timeo);
+       rc = -EINTR;
        goto out;
 }
 
@@ -240,8 +231,6 @@ void dccp_write_xmit(struct sock *sk, int block)
 {
        struct dccp_sock *dp = dccp_sk(sk);
        struct sk_buff *skb;
-       long timeo = DCCP_XMIT_TIMEO;   /* If a packet is taking longer than
-                                          this we have other issues */
 
        while ((skb = skb_peek(&sk->sk_write_queue))) {
                int err = ccid_hc_tx_send_packet(dp->dccps_hc_tx_ccid, sk, skb);
@@ -251,10 +240,8 @@ void dccp_write_xmit(struct sock *sk, int block)
                                sk_reset_timer(sk, &dp->dccps_xmit_timer,
                                                msecs_to_jiffies(err)+jiffies);
                                break;
-                       } else {
-                               err = dccp_wait_for_ccid(sk, skb, &timeo);
-                               timeo = DCCP_XMIT_TIMEO;
-                       }
+                       } else
+                               err = dccp_wait_for_ccid(sk, skb);
                        if (err)
                                DCCP_BUG("err=%d after dccp_wait_for_ccid", 
err);
                }

Reply via email to