From dc572ad3789226e8a738a80f26877e765c1e0828 Mon Sep 17 00:00:00 2001 From: Radek Matejka Date: Tue, 11 Sep 2012 14:53:25 +0200 Subject: [PATCH] kernel/canethgw mutex_unlock bug fix 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 | 32 +++++++++++++++++++++++++------- bench/plotres.m | 3 +++ bench/result/result3.dat | 12 ++++++++++++ bench/result/result3.raw | 4 ++++ bench/task | 2 +- distro/customroot/etc/retip | 1 - kernel/canethgw.c | 19 ++++++++++++------- test/test | 5 +++-- utils/cegwbench/cegwbench.c | 5 +++-- 9 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 bench/result/result3.dat create mode 100644 bench/result/result3.raw delete mode 100644 distro/customroot/etc/retip diff --git a/bench/bench b/bench/bench index 0fad886..15a003f 100755 --- a/bench/bench +++ b/bench/bench @@ -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 diff --git a/bench/plotres.m b/bench/plotres.m index c9400ca..40310f0 100644 --- a/bench/plotres.m +++ b/bench/plotres.m @@ -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 index 0000000..76b34fc --- /dev/null +++ b/bench/result/result3.dat @@ -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 index 0000000..f887c1f --- /dev/null +++ b/bench/result/result3.raw @@ -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 diff --git a/bench/task b/bench/task index 691d12d..dc3c7a5 100755 --- a/bench/task +++ b/bench/task @@ -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 index cd5c96e..0000000 --- a/distro/customroot/etc/retip +++ /dev/null @@ -1 +0,0 @@ -147.32.86.205 diff --git a/kernel/canethgw.c b/kernel/canethgw.c index 1d1e95e..25190f7 100644 --- a/kernel/canethgw.c +++ b/kernel/canethgw.c @@ -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; } /** diff --git a/test/test b/test/test index 419b1e5..1e18187 100755 --- 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 $? diff --git a/utils/cegwbench/cegwbench.c b/utils/cegwbench/cegwbench.c index c1438c4..550566c 100644 --- a/utils/cegwbench/cegwbench.c +++ b/utils/cegwbench/cegwbench.c @@ -77,6 +77,7 @@ void* thr_recv( void* arg ) for( i=0; i