]> rtime.felk.cvut.cz Git - can-eth-gw.git/commitdiff
kernel/canethgw mutex_unlock bug fix
authorRadek Matejka <radek.matejka@gmail.com>
Tue, 11 Sep 2012 12:53:25 +0000 (14:53 +0200)
committerRadek Matejka <radek.matejka@gmail.com>
Tue, 11 Sep 2012 12:58:05 +0000 (14:58 +0200)
The canethgw didn't unlock the cegw_mutex in case of failure.

changelog:
 - kernel/canethgw mutex_unlock bug fix
 - bench(script) module unload bug fix;
 - cegwbench can frame indexi overflow bug fix

bench/bench
bench/plotres.m
bench/result/result3.dat [new file with mode: 0644]
bench/result/result3.raw [new file with mode: 0644]
bench/task
distro/customroot/etc/retip [deleted file]
kernel/canethgw.c
test/test
utils/cegwbench/cegwbench.c

index 0fad8860f422d906e7b356ecfcbee3f7a74026c8..15a003faa3d3c19d8fe558c9d0ac2dbc7cc42f8e 100755 (executable)
@@ -3,7 +3,17 @@ N=100
 MODE=oneattime
 SLEEP=1
 LOGANDPRINT="tee -a result | cut -c 2-"
+RESULTFILE=/dev/null
+SENDRES=0
 
+if test $# -eq 1; then
+       RESULTFILE=$1
+       SENDRES=1
+fi
+
+#-----------------
+# bench kernel
+#-----------------
 modprobe canethgw
 
 cegw --listen udp@127.0.0.1:10501
@@ -12,25 +22,33 @@ cegw --add -s udp@127.0.0.1:10502 -d can@vcan0
 
 sleep $SLEEP
 echo "#kernel udp->can: " | tee -a result | cut -c 2-
-cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -m $MODE -t 1 >> result
+cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -m $MODE -t 1 >> $RESULTFILE
 
 sleep $SLEEP
 echo "#kernel can->udp: " | tee -a result | cut -c 2-
-cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -m $MODE -t 1 >> result
+cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -m $MODE -t 1 >> $RESULTFILE
 
 sleep $SLEEP
-modprobe -r canudpgw
-sleep 3
+modprobe -r canethgw
+
+#-----------------
+# bench user
+#-----------------
 canethgw -s can@vcan0 -d udp@127.0.0.1:10502 -l udp@127.0.0.1:10501 &
+PID=$!
 sleep $SLEEP
 
 echo "#user udp->can: " | tee -a result | cut -c 2-
-cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -m $MODE -t 1 >> result
+cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -m $MODE -t 1 >> $RESULTFILE
 
 sleep $SLEEP
 echo "#user can->udp: " | tee -a result | cut -c 2-
-cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -m $MODE -t 1 >> result
+cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -m $MODE -t 1 >> $RESULTFILE
 
+sleep $SLEEP
+kill -2 $PID
 # send result
-cat result | nc `cat /etc/retip` 10600
+if test $SENDRES -eq 1; then
+       cat $RESULTFILE | nc `cat /etc/retip` 10600
+fi
 
index c9400cac3886f2d61864f46adfeacf4f09af03da..40310f0c0dd43e8426ea75c4e24d9f914d856b22 100644 (file)
@@ -8,6 +8,9 @@ semilogy( data(1,:), "r" );
 semilogy( data(2,:), "g" );
 semilogy( data(3,:), "b" );
 semilogy( data(4,:), "m" );
+axis tight;
+
+title( 'can-eth-gw performance' );
 legend( "kernel udp->can", "kernel can->udp", "user udp->can",\
         "user can->udp");
 xlabel( "can frame [id]" );
diff --git a/bench/result/result3.dat b/bench/result/result3.dat
new file mode 100644 (file)
index 0000000..76b34fc
--- /dev/null
@@ -0,0 +1,12 @@
+#kernel udp->can: 
+#cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n 100 -m oneattime -t 1 
+81721.000000   74028.000000    72531.000000    72229.000000    59805.000000    74259.000000    13821.000000    13345.000000    13447.000000    18877.000000    6459.000000     6560.000000     6527.000000     6288.000000     6290.000000     6298.000000     6387.000000     6284.000000     6312.000000     6315.000000     6511.000000     6211.000000     6198.000000     6200.000000     6467.000000     9240.000000     6473.000000     6248.000000     6302.000000     24041.000000    6350.000000     6157.000000     6314.000000     6223.000000     6221.000000     6149.000000     6374.000000     6233.000000     6192.000000     6133.000000     6388.000000     6111.000000     6285.000000     6156.000000     6335.000000     6112.000000     6267.000000     6166.000000     6244.000000     6144.000000     6294.000000     6200.000000     6316.000000     6111.000000     6149.000000     6179.000000     6311.000000     6174.000000     6202.000000     6110.000000     6517.000000     6227.000000     6256.000000     6254.000000     6249.000000     6237.000000     6218.000000     6176.000000     6357.000000     6208.000000     6325.000000     6178.000000     6342.000000     6175.000000     6204.000000     6201.000000     6444.000000     6144.000000     6271.000000     6189.000000     6424.000000     6199.000000     6240.000000     6164.000000     6340.000000     6121.000000     6171.000000     6295.000000     6296.000000     6311.000000     6171.000000     6160.000000     6397.000000     6175.000000     6233.000000     6110.000000     6328.000000     6189.000000     6205.000000     6193.000000     
+#kernel can->udp: 
+#cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n 100 -m oneattime -t 1 
+53652.000000   65252.000000    56006.000000    54246.000000    53905.000000    62939.000000    33463.000000    24903.000000    8014.000000     7500.000000     6749.000000     6476.000000     6645.000000     6364.000000     6257.000000     6305.000000     6440.000000     6387.000000     6467.000000     6445.000000     6305.000000     6279.000000     6255.000000     6267.000000     6558.000000     6244.000000     6237.000000     6232.000000     6382.000000     6264.000000     6498.000000     6235.000000     6337.000000     6238.000000     6279.000000     6389.000000     6546.000000     6297.000000     6252.000000     6269.000000     6390.000000     6381.000000     6399.000000     6397.000000     6359.000000     25157.000000    6589.000000     6392.000000     6551.000000     6244.000000     6237.000000     6339.000000     6540.000000     6356.000000     6457.000000     6286.000000     6404.000000     6312.000000     6332.000000     6381.000000     6470.000000     6392.000000     6273.000000     6357.000000     6388.000000     6269.000000     6418.000000     6365.000000     6327.000000     6359.000000     6324.000000     6364.000000     6458.000000     6239.000000     6354.000000     6298.000000     6406.000000     6290.000000     6336.000000     6282.000000     6342.000000     6306.000000     6220.000000     6382.000000     6439.000000     6356.000000     6181.000000     6220.000000     6335.000000     6262.000000     6334.000000     6356.000000     6298.000000     6289.000000     6164.000000     6273.000000     6510.000000     6226.000000     6235.000000     6284.000000     
+#user udp->can: 
+#cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n 100 -m oneattime -t 1 
+75440.000000   77299.000000    98353.000000    74941.000000    59292.000000    32930.000000    8147.000000     7757.000000     7834.000000     7737.000000     7840.000000     7315.000000     7410.000000     7273.000000     7303.000000     7106.000000     7156.000000     7058.000000     7289.000000     6986.000000     7125.000000     6992.000000     7152.000000     7019.000000     7221.000000     7097.000000     7088.000000     7082.000000     7070.000000     6959.000000     10313.000000    7216.000000     7069.000000     7231.000000     7143.000000     7048.000000     7202.000000     19649.000000    7068.000000     7054.000000     7067.000000     7082.000000     7298.000000     6973.000000     7015.000000     7036.000000     6944.000000     7003.000000     7162.000000     6995.000000     7005.000000     7149.000000     6892.000000     7038.000000     7124.000000     7018.000000     6838.000000     7075.000000     6951.000000     7010.000000     7223.000000     7041.000000     6946.000000     7120.000000     7083.000000     6995.000000     7192.000000     6913.000000     6945.000000     7161.000000     7031.000000     6945.000000     7189.000000     6890.000000     6921.000000     7062.000000     6892.000000     6986.000000     7179.000000     6922.000000     7030.000000     7069.000000     6977.000000     7035.000000     7148.000000     6950.000000     6939.000000     7045.000000     6942.000000     6935.000000     7163.000000     6918.000000     6931.000000     7095.000000     7003.000000     6949.000000     7126.000000     7069.000000     6919.000000     7059.000000     
+#user can->udp: 
+#cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n 100 -m oneattime -t 1 
+64726.000000   55130.000000    59223.000000    66457.000000    78039.000000    76009.000000    35672.000000    9076.000000     9146.000000     8905.000000     8988.000000     8403.000000     7248.000000     7159.000000     7300.000000     7132.000000     7293.000000     7267.000000     7346.000000     7347.000000     7177.000000     7232.000000     7234.000000     7178.000000     7120.000000     7174.000000     7177.000000     7168.000000     7256.000000     7229.000000     7245.000000     7128.000000     7197.000000     7130.000000     7266.000000     7164.000000     7131.000000     7089.000000     10521.000000    7537.000000     20254.000000    7242.000000     7166.000000     6949.000000     6989.000000     6895.000000     7180.000000     7120.000000     7072.000000     6981.000000     7193.000000     6901.000000     6873.000000     6938.000000     7050.000000     6915.000000     7154.000000     7054.000000     7109.000000     6978.000000     7009.000000     7068.000000     7091.000000     6933.000000     7044.000000     6948.000000     7135.000000     6985.000000     7065.000000     7057.000000     7130.000000     7047.000000     7140.000000     7130.000000     7135.000000     6989.000000     7172.000000     7024.000000     7016.000000     6942.000000     7035.000000     6925.000000     7218.000000     7020.000000     7053.000000     6944.000000     7071.000000     7015.000000     7090.000000     6940.000000     7210.000000     7012.000000     7160.000000     6947.000000     7193.000000     7030.000000     7049.000000     6933.000000     7131.000000     6916.000000     
diff --git a/bench/result/result3.raw b/bench/result/result3.raw
new file mode 100644 (file)
index 0000000..f887c1f
--- /dev/null
@@ -0,0 +1,4 @@
+81721.000000   74028.000000    72531.000000    72229.000000    59805.000000    74259.000000    13821.000000    13345.000000    13447.000000    18877.000000    6459.000000     6560.000000     6527.000000     6288.000000     6290.000000     6298.000000     6387.000000     6284.000000     6312.000000     6315.000000     6511.000000     6211.000000     6198.000000     6200.000000     6467.000000     9240.000000     6473.000000     6248.000000     6302.000000     24041.000000    6350.000000     6157.000000     6314.000000     6223.000000     6221.000000     6149.000000     6374.000000     6233.000000     6192.000000     6133.000000     6388.000000     6111.000000     6285.000000     6156.000000     6335.000000     6112.000000     6267.000000     6166.000000     6244.000000     6144.000000     6294.000000     6200.000000     6316.000000     6111.000000     6149.000000     6179.000000     6311.000000     6174.000000     6202.000000     6110.000000     6517.000000     6227.000000     6256.000000     6254.000000     6249.000000     6237.000000     6218.000000     6176.000000     6357.000000     6208.000000     6325.000000     6178.000000     6342.000000     6175.000000     6204.000000     6201.000000     6444.000000     6144.000000     6271.000000     6189.000000     6424.000000     6199.000000     6240.000000     6164.000000     6340.000000     6121.000000     6171.000000     6295.000000     6296.000000     6311.000000     6171.000000     6160.000000     6397.000000     6175.000000     6233.000000     6110.000000     6328.000000     6189.000000     6205.000000     6193.000000     
+53652.000000   65252.000000    56006.000000    54246.000000    53905.000000    62939.000000    33463.000000    24903.000000    8014.000000     7500.000000     6749.000000     6476.000000     6645.000000     6364.000000     6257.000000     6305.000000     6440.000000     6387.000000     6467.000000     6445.000000     6305.000000     6279.000000     6255.000000     6267.000000     6558.000000     6244.000000     6237.000000     6232.000000     6382.000000     6264.000000     6498.000000     6235.000000     6337.000000     6238.000000     6279.000000     6389.000000     6546.000000     6297.000000     6252.000000     6269.000000     6390.000000     6381.000000     6399.000000     6397.000000     6359.000000     25157.000000    6589.000000     6392.000000     6551.000000     6244.000000     6237.000000     6339.000000     6540.000000     6356.000000     6457.000000     6286.000000     6404.000000     6312.000000     6332.000000     6381.000000     6470.000000     6392.000000     6273.000000     6357.000000     6388.000000     6269.000000     6418.000000     6365.000000     6327.000000     6359.000000     6324.000000     6364.000000     6458.000000     6239.000000     6354.000000     6298.000000     6406.000000     6290.000000     6336.000000     6282.000000     6342.000000     6306.000000     6220.000000     6382.000000     6439.000000     6356.000000     6181.000000     6220.000000     6335.000000     6262.000000     6334.000000     6356.000000     6298.000000     6289.000000     6164.000000     6273.000000     6510.000000     6226.000000     6235.000000     6284.000000     
+75440.000000   77299.000000    98353.000000    74941.000000    59292.000000    32930.000000    8147.000000     7757.000000     7834.000000     7737.000000     7840.000000     7315.000000     7410.000000     7273.000000     7303.000000     7106.000000     7156.000000     7058.000000     7289.000000     6986.000000     7125.000000     6992.000000     7152.000000     7019.000000     7221.000000     7097.000000     7088.000000     7082.000000     7070.000000     6959.000000     10313.000000    7216.000000     7069.000000     7231.000000     7143.000000     7048.000000     7202.000000     19649.000000    7068.000000     7054.000000     7067.000000     7082.000000     7298.000000     6973.000000     7015.000000     7036.000000     6944.000000     7003.000000     7162.000000     6995.000000     7005.000000     7149.000000     6892.000000     7038.000000     7124.000000     7018.000000     6838.000000     7075.000000     6951.000000     7010.000000     7223.000000     7041.000000     6946.000000     7120.000000     7083.000000     6995.000000     7192.000000     6913.000000     6945.000000     7161.000000     7031.000000     6945.000000     7189.000000     6890.000000     6921.000000     7062.000000     6892.000000     6986.000000     7179.000000     6922.000000     7030.000000     7069.000000     6977.000000     7035.000000     7148.000000     6950.000000     6939.000000     7045.000000     6942.000000     6935.000000     7163.000000     6918.000000     6931.000000     7095.000000     7003.000000     6949.000000     7126.000000     7069.000000     6919.000000     7059.000000     
+64726.000000   55130.000000    59223.000000    66457.000000    78039.000000    76009.000000    35672.000000    9076.000000     9146.000000     8905.000000     8988.000000     8403.000000     7248.000000     7159.000000     7300.000000     7132.000000     7293.000000     7267.000000     7346.000000     7347.000000     7177.000000     7232.000000     7234.000000     7178.000000     7120.000000     7174.000000     7177.000000     7168.000000     7256.000000     7229.000000     7245.000000     7128.000000     7197.000000     7130.000000     7266.000000     7164.000000     7131.000000     7089.000000     10521.000000    7537.000000     20254.000000    7242.000000     7166.000000     6949.000000     6989.000000     6895.000000     7180.000000     7120.000000     7072.000000     6981.000000     7193.000000     6901.000000     6873.000000     6938.000000     7050.000000     6915.000000     7154.000000     7054.000000     7109.000000     6978.000000     7009.000000     7068.000000     7091.000000     6933.000000     7044.000000     6948.000000     7135.000000     6985.000000     7065.000000     7057.000000     7130.000000     7047.000000     7140.000000     7130.000000     7135.000000     6989.000000     7172.000000     7024.000000     7016.000000     6942.000000     7035.000000     6925.000000     7218.000000     7020.000000     7053.000000     6944.000000     7071.000000     7015.000000     7090.000000     6940.000000     7210.000000     7012.000000     7160.000000     6947.000000     7193.000000     7030.000000     7049.000000     6933.000000     7131.000000     6916.000000     
index 691d12d4a2e6560d704e249107ac7b1a3f814057..dc3c7a557fbc1dc5dfb967d766f41ac82979e7f8 100755 (executable)
@@ -1,4 +1,4 @@
 #!/bin/sh
 sleep 3
-bench
+bench result
 
diff --git a/distro/customroot/etc/retip b/distro/customroot/etc/retip
deleted file mode 100644 (file)
index cd5c96e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-147.32.86.205
index 1d1e95ec6f7e38b67f78a6a01158bfea4fa2ad17..25190f7e85ac193d0afb0f81efd62fec12a9d26f 100644 (file)
@@ -498,7 +498,8 @@ static int cegw_thread_start(void *data)
        kfree(data);
        mutex_lock(&cegw_mutex);
        if (cegw_state == CEGW_EXIT)
-               return -1;
+               goto out_err;
+
        /* stops threads if exist */
        cegw_thread_stop();
 
@@ -506,12 +507,13 @@ static int cegw_thread_start(void *data)
        if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &udp_sock)
            != 0) {
                printk(KERN_ERR "canethgw: udp socket creation failed\n");
-               return -1;
+               goto out_err;
        }
 
        if (sock_create_kern(PF_CAN, SOCK_RAW, CAN_RAW, &can_sock) != 0) {
                printk(KERN_ERR "canethgw: can socket creation failed\n");
-               return -1;
+               sock_release(udp_sock);
+               goto out_err;
        }
 
        if (kernel_bind(udp_sock, (struct sockaddr*)&udp_addr,
@@ -519,7 +521,7 @@ static int cegw_thread_start(void *data)
                printk(KERN_ERR "canethgw: udp socket binding failed\n");
                sock_release(udp_sock);
                sock_release(can_sock);
-               return -1;
+               goto out_err;
        }
 
        if (kernel_bind(can_sock, (struct sockaddr*) &can_addr,
@@ -528,7 +530,7 @@ static int cegw_thread_start(void *data)
                kernel_sock_shutdown(udp_sock, SHUT_RDWR);
                sock_release(udp_sock);
                sock_release(can_sock);
-               return -1;
+               goto out_err;
        }
 
        /* start threads */
@@ -539,7 +541,7 @@ static int cegw_thread_start(void *data)
                cegw_state = CEGW_STOP;
                sock_release(udp_sock);
                sock_release(can_sock);
-               return -1;
+               goto out_err;
        }
        get_task_struct(eth_to_can);
        wake_up_process(eth_to_can);
@@ -551,7 +553,7 @@ static int cegw_thread_start(void *data)
                kthread_stop(eth_to_can);
                sock_release(udp_sock);
                sock_release(can_sock);
-               return -1;
+               goto out_err;
        }
        get_task_struct(can_to_eth);
        wake_up_process(can_to_eth);
@@ -559,6 +561,9 @@ static int cegw_thread_start(void *data)
        mutex_unlock(&cegw_mutex);
        pr_devel("threads are running\n");
        return 0;
+out_err:
+       mutex_unlock(&cegw_mutex);
+       return -1;
 }
 
 /**
index 419b1e502085e3c3322f62b1f78468f6a40a2a16..1e1818785cc0edd83419e64531e17d3fbe02c3a9 100755 (executable)
--- a/test/test
+++ b/test/test
@@ -1,5 +1,6 @@
 #!/bin/sh
 N=10
+MODE=oneattime
 
 evalmsg()
 {
@@ -16,10 +17,10 @@ if test $# -ne 0; then
 fi
 
 echo -n "Testing eth->can: "
-cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -t 1 &> /dev/zero
+cegwbench -s udp@127.0.0.1:10501 -d can@vcan0 -n $N -m $MODE -t 1 &> /dev/zero
 evalmsg $?
 
 echo -n "Testing can->eth: "
-cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -t 1 &> /dev/zero
+cegwbench -s can@vcan0 -d udp@127.0.0.1:10502 -n $N -m $MODE -t 1 &> /dev/zero
 evalmsg $?
 
index c1438c40ab858a7e25c89e24fb1666982d92ea51..550566cb1144266b7b9afd13d6fc2e210568a5d2 100644 (file)
@@ -77,6 +77,7 @@ void* thr_recv( void* arg )
        for( i=0; i<d.n; i++ )
        {
                ret = recvfrom( sock, &cf, sizeof(cf), 0, NULL, 0 );
+               printdbg( "ret=%d\n", ret );
                /* ToDo: rework */
                if( ret == -1 )
                {
@@ -85,7 +86,7 @@ void* thr_recv( void* arg )
                }
                seq = *((int*)cf.data);
                clock_gettime( CLOCK_REALTIME, &rx_time[ seq ] );
-               printdbg( "recv: (id=%d)%d\n", cf.can_id, seq );
+               printdbg( "recv: cf.data=%d\n", seq );
                if( d.mode == BENCH_MODE_ONEATTIME )
                {
                        pthread_barrier_wait( &barrier );
@@ -342,7 +343,7 @@ int main( int argc, char* argv[] )
                cf.can_dlc = 8;
                memcpy( cf.data, &i, sizeof(i) );
 
-               clock_gettime( CLOCK_REALTIME, &tx_time[cf.data[0]] );
+               clock_gettime( CLOCK_REALTIME, &tx_time[i] );
                ret = sendto( sock, &cf, sizeof(cf), 0, addr, addr_size ); /* ToDo: check ret */
                printdbg( "sending(%d)\n", ret );
                if( d.mode == BENCH_MODE_ONEATTIME )