Armadilloフォーラム

カーネルバージョンによるCAN動作の差異について

jaksama

2019年4月25日 16時50分

井上と申します。

カーネルを「linux-v4.14-at4」から「linux-v4.14-at11」にアップデートしたところ、以前のカーネルでは出ていなかった、

flexcan 2094000.flexcan can0: __can_get_echo_skb: BUG! Trying to echo non existing skb: can_priv::echo_skb[0]

という警告(?)が出るようになりました。

添付のcan3.c内の「cansend_stdframe()」関数内で「loopback = 0;」のところを「loopback = 1;」にすれば
上記警告は消えますが、なぜかCAN接続ではない他の電源機器が誤動作し、給電が止まってしまうので解析に難儀しております。

なお、メインプログラムからはsend_can()を呼び出し、send_can()からcansend_stdframe()を呼び出しております。

カーネル「linux-v4.14-at4」と「linux-v4.14-at11」でCAN関連で変更があったのでしょうか。
まずはそのあたりをご教授いただきたく存じます。

よろしくお願い致します。

ファイル ファイルの説明
can3.c
コメント

at_mizo

2019年4月25日 17時13分

溝渕です。

linux-4.14-atは、linux-stableのlinux-4.14.yをベースにしています。
linux-4.14.yをmergeした際に入った以下のcommitが恐らく今回の問題の原因
です。

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…

その後、次のようなcommitが入ります。

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…

上記commitを適用してみてください。次回アップデート時には修正します。

jaksama

2019年4月25日 17時36分

溝渕様

ご教授いただきありがとうございます。
当方commitの適用をするのが初めてなのですが、手順をご教授いただけませんでしょうか。

よろしくお願いたします。

> 溝渕です。
>
> linux-4.14-atは、linux-stableのlinux-4.14.yをベースにしています。
> linux-4.14.yをmergeした際に入った以下のcommitが恐らく今回の問題の原因
> です。
>
> https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…
>
> その後、次のようなcommitが入ります。
>
> https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…
>
> 上記commitを適用してみてください。次回アップデート時には修正します。
>

at_takumi.ando

2019年4月25日 17時44分

安藤です。

patchコマンドでパッチを適用することができます。
Linuxカーネルソースのディレクトリ直下で、以下のコマンドを実行してみてください。

$ wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=8849347d9cdacbd845ff0a5add3203f4eb599433" -O hoge.patch
$ patch -p1 < hoge.patch

適用したパッチを外すには、

$ patch -Rp1 < hoge.patch

jaksama

2019年4月26日 10時10分

安藤様

迅速なご教授ありがとうございます。
トライしてみます。

井上

> 安藤です。
>
> patchコマンドでパッチを適用することができます。
> Linuxカーネルソースのディレクトリ直下で、以下のコマンドを実行してみてください。
>
>

> $ wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=8849347d9cdacbd845ff0a5add3203f4eb599433" -O hoge.patch
> $ patch -p1 < hoge.patch
> 

>
> 適用したパッチを外すには、
>
>

> $ patch -Rp1 < hoge.patch
> 

jaksama

2019年4月26日 13時41分

溝渕様

安藤様にご教授頂いた手順にてcommitの適用を行いましたが解決しませんでした。
ほかに考えられる原因やcommitの適用がうまくいってるかを確認する方法はありませんでしょうか。

また、以前のカーネルにはなかった下記メッセージが出ているのですが関係あるでしょうか。

random: 6 urandom warning(s) missed due to ratelimiting

これはcommitの適用に関係なく出ています。

よろしくお願い致します。

> 溝渕様
>
> ご教授いただきありがとうございます。
> 当方commitの適用をするのが初めてなのですが、手順をご教授いただけませんでしょうか。
>
> よろしくお願いたします。
>
>
>
>
> > 溝渕です。
> >
> > linux-4.14-atは、linux-stableのlinux-4.14.yをベースにしています。
> > linux-4.14.yをmergeした際に入った以下のcommitが恐らく今回の問題の原因
> > です。
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…
> >
> > その後、次のようなcommitが入ります。
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit…
> >
> > 上記commitを適用してみてください。次回アップデート時には修正します。
> >

at_mizo

2019年5月7日 9時41分

溝渕です。

> 安藤様にご教授頂いた手順にてcommitの適用を行いましたが解決しませんでした。
> ほかに考えられる原因やcommitの適用がうまくいってるかを確認する方法はありませんでしょうか。

実行した手順と、そのログを教えていただけるとコメントしやすいです。

ソースについては、展開したばかりのカーネルソース([orig kernel])と、パッ
チ適用済みのカーネルソース([new kernel])の差分が、適用したパッチと同じ
になっていれば正常に適用されていることが確認できます。

[atde]$ diff -up [orig kernel]/drivers/net/can/dev.c [new kernel]/drivers/net/can/dev.c

> また、以前のカーネルにはなかった下記メッセージが出ているのですが関係あるでしょうか。
>
> random: 6 urandom warning(s) missed due to ratelimiting

これは、一時的にrandomのエントロピープールが枯渇した為に出力されていま
す。恐らく今回の現象とは関係が無いと思います。

jaksama

2019年5月8日 11時50分

溝渕様

コメント頂きありがとうございます。
再度手順確認してみました。まず下記コマンドを実行し、

<コマンド>
wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge0.patch

<実行結果>
--2019-05-08 11:08:50-- https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…
git.kernel.org (git.kernel.org) をDNSに問いあわせています... 147.75.46.191
git.kernel.org (git.kernel.org)|147.75.46.191|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/plain]
`hoge0.patch' に保存中

hoge0.patch [ <=> ] 2.34K --.-KB/s in 0s

2019-05-08 11:08:51 (42.1 MB/s) - `hoge0.patch' へ保存終了 [2397]

つぎにパッチを適用いたしました。
<コマンド>
patch -p1 < hoge0.patch

<結果>
Reversed (or previously applied) patch detected! Assume -R? [n]

上記の選択でyにしてしまっており、そのあと、

wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge1.patch

を実行し、パッチを適用していました。

patch -p1 < hoge1.patch

1つめのコミット適用時の「Reversed (or previously applied) patch detected! Assume -R? [n]」の意味が理解できておりませんでした。コミット適用前のファイルよりコミットのほうが古いのでしょうか。

ちなみに2つ目のコミットのtreeをたどってコピーしてきた /drivers/net/can/dev.c を使ってビルドすると、CAN通信時のメッセージが出なくなります。

コメント頂けましたら幸いです。

井上

> 溝渕です。
>
> > 安藤様にご教授頂いた手順にてcommitの適用を行いましたが解決しませんでした。
> > ほかに考えられる原因やcommitの適用がうまくいってるかを確認する方法はありませんでしょうか。
>
> 実行した手順と、そのログを教えていただけるとコメントしやすいです。
>
> ソースについては、展開したばかりのカーネルソース([orig kernel])と、パッ
> チ適用済みのカーネルソース([new kernel])の差分が、適用したパッチと同じ
> になっていれば正常に適用されていることが確認できます。
>
>

> [atde]$ diff -up [orig kernel]/drivers/net/can/dev.c [new kernel]/drivers/net/can/dev.c
> 

>
> > また、以前のカーネルにはなかった下記メッセージが出ているのですが関係あるでしょうか。
> >
> > random: 6 urandom warning(s) missed due to ratelimiting
>
> これは、一時的にrandomのエントロピープールが枯渇した為に出力されていま
> す。恐らく今回の現象とは関係が無いと思います。
>

ファイル ファイルの説明
hoge0.patch
hoge1.patch

at_mizo

2019年5月8日 12時20分

溝渕です。

> <コマンド>
> wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge0.patch

上記は、linux-4.14-atにすでに適用されています。

> <結果>
> Reversed (or previously applied) patch detected! Assume -R? [n]

これは、すでに適用済みである為に表示されています。

> wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge1.patch

上記が問題を解決できるかもしれないパッチです。

> ちなみに2つ目のコミットのtreeをたどってコピーしてきた /drivers/net/can/dev.c を使ってビルドすると、CAN通信時のメッセージが出なくなります。

であれば、パッチが適用できていない可能性があります。

patchコマンド実行時のログを教えてもらえると、何かアドバイスできるかもしれません。

jaksama

2019年5月8日 16時09分

溝渕様

ご指摘ありがとうございます。

「906ed1bdf850851b3433e4f5521b406651643b27」のコミットだけ適用しましたら解決致しました。
適用済みのコミットについてパッチ適用してしまったせいで古いバージョンのファイルに戻ってしまい、
古いファイルに最新のコミットを適用してうまくいってなかったと認識しております。

ご教授ありがとうございました。

井上

> 溝渕です。
>
> > <コマンド>
> > wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge0.patch
>
> 上記は、linux-4.14-atにすでに適用されています。
>
> > <結果>
> > Reversed (or previously applied) patch detected! Assume -R? [n]
>
> これは、すでに適用済みである為に表示されています。
>
> > wget "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/…" -O hoge1.patch
>
> 上記が問題を解決できるかもしれないパッチです。
>
> > ちなみに2つ目のコミットのtreeをたどってコピーしてきた /drivers/net/can/dev.c を使ってビルドすると、CAN通信時のメッセージが出なくなります。
>
> であれば、パッチが適用できていない可能性があります。
>
> patchコマンド実行時のログを教えてもらえると、何かアドバイスできるかもしれません。
>