|
@@ -18,7 +18,7 @@
|
|
|
|
|
|
<h2 class='titleHead'>The Linux Kernel Module Programming Guide</h2>
|
|
|
<div class='author'><span class='ecrm-1200'>Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang</span></div><br />
|
|
|
-<div class='date'><span class='ecrm-1200'>May 8, 2025</span></div>
|
|
|
+<div class='date'><span class='ecrm-1200'>May 18, 2025</span></div>
|
|
|
|
|
|
|
|
|
|
|
@@ -7285,84 +7285,86 @@ functions.
|
|
|
<a id='x1-67046r23'></a><span class='ecrm-0500'>23</span>
|
|
|
<a id='x1-67048r24'></a><span class='ecrm-0500'>24</span><span class='ectt-0800'> </span><span id='textcolor3895'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
<a id='x1-67050r25'></a><span class='ecrm-0500'>25</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67052r26'></a><span class='ecrm-0500'>26</span><span id='textcolor3896'><span class='ectt-0800'>#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 11, 0)</span></span>
|
|
|
-<a id='x1-67054r27'></a><span class='ecrm-0500'>27</span><span id='textcolor3897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> devicemodel_remove(</span><span id='textcolor3899'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_device *dev)</span>
|
|
|
-<a id='x1-67056r28'></a><span class='ecrm-0500'>28</span><span id='textcolor3900'><span class='ectt-0800'>#else</span></span>
|
|
|
-<a id='x1-67058r29'></a><span class='ecrm-0500'>29</span><span id='textcolor3901'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3902'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_remove(</span><span id='textcolor3903'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_device *dev)</span>
|
|
|
-<a id='x1-67060r30'></a><span class='ecrm-0500'>30</span><span id='textcolor3904'><span class='ectt-0800'>#endif</span></span>
|
|
|
-<a id='x1-67062r31'></a><span class='ecrm-0500'>31</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-67064r32'></a><span class='ecrm-0500'>32</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3905'><span class='ectt-0800'>"devicemodel example removed</span></span><span id='textcolor3906'><span class='ectt-0800'>\n</span></span><span id='textcolor3907'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67066r33'></a><span class='ecrm-0500'>33</span>
|
|
|
-<a id='x1-67068r34'></a><span class='ecrm-0500'>34</span><span class='ectt-0800'> </span><span id='textcolor3908'><span class='ectt-0800'>/* Your device removal code */</span></span>
|
|
|
-<a id='x1-67070r35'></a><span class='ecrm-0500'>35</span><span id='textcolor3909'><span class='ectt-0800'>#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0)</span></span>
|
|
|
-<a id='x1-67072r36'></a><span class='ecrm-0500'>36</span><span class='ectt-0800'> </span><span id='textcolor3910'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
-<a id='x1-67074r37'></a><span class='ecrm-0500'>37</span><span id='textcolor3911'><span class='ectt-0800'>#endif</span></span>
|
|
|
-<a id='x1-67076r38'></a><span class='ecrm-0500'>38</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67078r39'></a><span class='ecrm-0500'>39</span>
|
|
|
-<a id='x1-67080r40'></a><span class='ecrm-0500'>40</span><span id='textcolor3912'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3913'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_suspend(</span><span id='textcolor3914'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> device *dev)</span>
|
|
|
-<a id='x1-67082r41'></a><span class='ecrm-0500'>41</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-67084r42'></a><span class='ecrm-0500'>42</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3915'><span class='ectt-0800'>"devicemodel example suspend</span></span><span id='textcolor3916'><span class='ectt-0800'>\n</span></span><span id='textcolor3917'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67086r43'></a><span class='ecrm-0500'>43</span>
|
|
|
-<a id='x1-67088r44'></a><span class='ecrm-0500'>44</span><span class='ectt-0800'> </span><span id='textcolor3918'><span class='ectt-0800'>/* Your device suspend code */</span></span>
|
|
|
+<a id='x1-67052r26'></a><span class='ecrm-0500'>26</span>
|
|
|
+<a id='x1-67054r27'></a><span class='ecrm-0500'>27</span><span id='textcolor3896'><span class='ectt-0800'>#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 11, 0)</span></span>
|
|
|
+<a id='x1-67056r28'></a><span class='ecrm-0500'>28</span><span id='textcolor3897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> devicemodel_remove(</span><span id='textcolor3899'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_device *dev)</span>
|
|
|
+<a id='x1-67058r29'></a><span class='ecrm-0500'>29</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67060r30'></a><span class='ecrm-0500'>30</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3900'><span class='ectt-0800'>"devicemodel example removed</span></span><span id='textcolor3901'><span class='ectt-0800'>\n</span></span><span id='textcolor3902'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67062r31'></a><span class='ecrm-0500'>31</span><span class='ectt-0800'> </span><span id='textcolor3903'><span class='ectt-0800'>/* Your device removal code */</span></span>
|
|
|
+<a id='x1-67064r32'></a><span class='ecrm-0500'>32</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67066r33'></a><span class='ecrm-0500'>33</span><span id='textcolor3904'><span class='ectt-0800'>#else</span></span>
|
|
|
+<a id='x1-67068r34'></a><span class='ecrm-0500'>34</span><span id='textcolor3905'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3906'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_remove(</span><span id='textcolor3907'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_device *dev)</span>
|
|
|
+<a id='x1-67070r35'></a><span class='ecrm-0500'>35</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67072r36'></a><span class='ecrm-0500'>36</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3908'><span class='ectt-0800'>"devicemodel example removed</span></span><span id='textcolor3909'><span class='ectt-0800'>\n</span></span><span id='textcolor3910'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67074r37'></a><span class='ecrm-0500'>37</span><span class='ectt-0800'> </span><span id='textcolor3911'><span class='ectt-0800'>/* Your device removal code */</span></span>
|
|
|
+<a id='x1-67076r38'></a><span class='ecrm-0500'>38</span><span class='ectt-0800'> </span><span id='textcolor3912'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-67078r39'></a><span class='ecrm-0500'>39</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67080r40'></a><span class='ecrm-0500'>40</span><span id='textcolor3913'><span class='ectt-0800'>#endif</span></span>
|
|
|
+<a id='x1-67082r41'></a><span class='ecrm-0500'>41</span>
|
|
|
+<a id='x1-67084r42'></a><span class='ecrm-0500'>42</span><span id='textcolor3914'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3915'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_suspend(</span><span id='textcolor3916'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> device *dev)</span>
|
|
|
+<a id='x1-67086r43'></a><span class='ecrm-0500'>43</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67088r44'></a><span class='ecrm-0500'>44</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3917'><span class='ectt-0800'>"devicemodel example suspend</span></span><span id='textcolor3918'><span class='ectt-0800'>\n</span></span><span id='textcolor3919'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
<a id='x1-67090r45'></a><span class='ecrm-0500'>45</span>
|
|
|
-<a id='x1-67092r46'></a><span class='ecrm-0500'>46</span><span class='ectt-0800'> </span><span id='textcolor3919'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
-<a id='x1-67094r47'></a><span class='ecrm-0500'>47</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67096r48'></a><span class='ecrm-0500'>48</span>
|
|
|
-<a id='x1-67098r49'></a><span class='ecrm-0500'>49</span><span id='textcolor3920'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3921'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_resume(</span><span id='textcolor3922'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> device *dev)</span>
|
|
|
-<a id='x1-67100r50'></a><span class='ecrm-0500'>50</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-67102r51'></a><span class='ecrm-0500'>51</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3923'><span class='ectt-0800'>"devicemodel example resume</span></span><span id='textcolor3924'><span class='ectt-0800'>\n</span></span><span id='textcolor3925'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67104r52'></a><span class='ecrm-0500'>52</span>
|
|
|
-<a id='x1-67106r53'></a><span class='ecrm-0500'>53</span><span class='ectt-0800'> </span><span id='textcolor3926'><span class='ectt-0800'>/* Your device resume code */</span></span>
|
|
|
+<a id='x1-67092r46'></a><span class='ecrm-0500'>46</span><span class='ectt-0800'> </span><span id='textcolor3920'><span class='ectt-0800'>/* Your device suspend code */</span></span>
|
|
|
+<a id='x1-67094r47'></a><span class='ecrm-0500'>47</span>
|
|
|
+<a id='x1-67096r48'></a><span class='ecrm-0500'>48</span><span class='ectt-0800'> </span><span id='textcolor3921'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-67098r49'></a><span class='ecrm-0500'>49</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67100r50'></a><span class='ecrm-0500'>50</span>
|
|
|
+<a id='x1-67102r51'></a><span class='ecrm-0500'>51</span><span id='textcolor3922'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3923'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> devicemodel_resume(</span><span id='textcolor3924'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> device *dev)</span>
|
|
|
+<a id='x1-67104r52'></a><span class='ecrm-0500'>52</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67106r53'></a><span class='ecrm-0500'>53</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3925'><span class='ectt-0800'>"devicemodel example resume</span></span><span id='textcolor3926'><span class='ectt-0800'>\n</span></span><span id='textcolor3927'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
<a id='x1-67108r54'></a><span class='ecrm-0500'>54</span>
|
|
|
-<a id='x1-67110r55'></a><span class='ecrm-0500'>55</span><span class='ectt-0800'> </span><span id='textcolor3927'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
-<a id='x1-67112r56'></a><span class='ecrm-0500'>56</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67114r57'></a><span class='ecrm-0500'>57</span>
|
|
|
-<a id='x1-67116r58'></a><span class='ecrm-0500'>58</span><span id='textcolor3928'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3929'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor3930'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> dev_pm_ops devicemodel_pm_ops = {</span>
|
|
|
-<a id='x1-67118r59'></a><span class='ecrm-0500'>59</span><span class='ectt-0800'> .suspend = devicemodel_suspend,</span>
|
|
|
-<a id='x1-67120r60'></a><span class='ecrm-0500'>60</span><span class='ectt-0800'> .resume = devicemodel_resume,</span>
|
|
|
-<a id='x1-67122r61'></a><span class='ecrm-0500'>61</span><span class='ectt-0800'> .poweroff = devicemodel_suspend,</span>
|
|
|
-<a id='x1-67124r62'></a><span class='ecrm-0500'>62</span><span class='ectt-0800'> .freeze = devicemodel_suspend,</span>
|
|
|
-<a id='x1-67126r63'></a><span class='ecrm-0500'>63</span><span class='ectt-0800'> .thaw = devicemodel_resume,</span>
|
|
|
-<a id='x1-67128r64'></a><span class='ecrm-0500'>64</span><span class='ectt-0800'> .restore = devicemodel_resume,</span>
|
|
|
-<a id='x1-67130r65'></a><span class='ecrm-0500'>65</span><span class='ectt-0800'>};</span>
|
|
|
-<a id='x1-67132r66'></a><span class='ecrm-0500'>66</span>
|
|
|
-<a id='x1-67134r67'></a><span class='ecrm-0500'>67</span><span id='textcolor3931'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3932'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_driver devicemodel_driver = {</span>
|
|
|
-<a id='x1-67136r68'></a><span class='ecrm-0500'>68</span><span class='ectt-0800'> .driver =</span>
|
|
|
-<a id='x1-67138r69'></a><span class='ecrm-0500'>69</span><span class='ectt-0800'> {</span>
|
|
|
-<a id='x1-67140r70'></a><span class='ecrm-0500'>70</span><span class='ectt-0800'> .name = </span><span id='textcolor3933'><span class='ectt-0800'>"devicemodel_example"</span></span><span class='ectt-0800'>,</span>
|
|
|
-<a id='x1-67142r71'></a><span class='ecrm-0500'>71</span><span class='ectt-0800'> .pm = &devicemodel_pm_ops,</span>
|
|
|
-<a id='x1-67144r72'></a><span class='ecrm-0500'>72</span><span class='ectt-0800'> },</span>
|
|
|
-<a id='x1-67146r73'></a><span class='ecrm-0500'>73</span><span class='ectt-0800'> .probe = devicemodel_probe,</span>
|
|
|
-<a id='x1-67148r74'></a><span class='ecrm-0500'>74</span><span class='ectt-0800'> .remove = devicemodel_remove,</span>
|
|
|
-<a id='x1-67150r75'></a><span class='ecrm-0500'>75</span><span class='ectt-0800'>};</span>
|
|
|
-<a id='x1-67152r76'></a><span class='ecrm-0500'>76</span>
|
|
|
-<a id='x1-67154r77'></a><span class='ecrm-0500'>77</span><span id='textcolor3934'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3935'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> __init devicemodel_init(</span><span id='textcolor3936'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
-<a id='x1-67156r78'></a><span class='ecrm-0500'>78</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-67158r79'></a><span class='ecrm-0500'>79</span><span class='ectt-0800'> </span><span id='textcolor3937'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> ret;</span>
|
|
|
-<a id='x1-67160r80'></a><span class='ecrm-0500'>80</span>
|
|
|
-<a id='x1-67162r81'></a><span class='ecrm-0500'>81</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3938'><span class='ectt-0800'>"devicemodel init</span></span><span id='textcolor3939'><span class='ectt-0800'>\n</span></span><span id='textcolor3940'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67110r55'></a><span class='ecrm-0500'>55</span><span class='ectt-0800'> </span><span id='textcolor3928'><span class='ectt-0800'>/* Your device resume code */</span></span>
|
|
|
+<a id='x1-67112r56'></a><span class='ecrm-0500'>56</span>
|
|
|
+<a id='x1-67114r57'></a><span class='ecrm-0500'>57</span><span class='ectt-0800'> </span><span id='textcolor3929'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-67116r58'></a><span class='ecrm-0500'>58</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67118r59'></a><span class='ecrm-0500'>59</span>
|
|
|
+<a id='x1-67120r60'></a><span class='ecrm-0500'>60</span><span id='textcolor3930'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3931'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor3932'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> dev_pm_ops devicemodel_pm_ops = {</span>
|
|
|
+<a id='x1-67122r61'></a><span class='ecrm-0500'>61</span><span class='ectt-0800'> .suspend = devicemodel_suspend,</span>
|
|
|
+<a id='x1-67124r62'></a><span class='ecrm-0500'>62</span><span class='ectt-0800'> .resume = devicemodel_resume,</span>
|
|
|
+<a id='x1-67126r63'></a><span class='ecrm-0500'>63</span><span class='ectt-0800'> .poweroff = devicemodel_suspend,</span>
|
|
|
+<a id='x1-67128r64'></a><span class='ecrm-0500'>64</span><span class='ectt-0800'> .freeze = devicemodel_suspend,</span>
|
|
|
+<a id='x1-67130r65'></a><span class='ecrm-0500'>65</span><span class='ectt-0800'> .thaw = devicemodel_resume,</span>
|
|
|
+<a id='x1-67132r66'></a><span class='ecrm-0500'>66</span><span class='ectt-0800'> .restore = devicemodel_resume,</span>
|
|
|
+<a id='x1-67134r67'></a><span class='ecrm-0500'>67</span><span class='ectt-0800'>};</span>
|
|
|
+<a id='x1-67136r68'></a><span class='ecrm-0500'>68</span>
|
|
|
+<a id='x1-67138r69'></a><span class='ecrm-0500'>69</span><span id='textcolor3933'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3934'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> platform_driver devicemodel_driver = {</span>
|
|
|
+<a id='x1-67140r70'></a><span class='ecrm-0500'>70</span><span class='ectt-0800'> .driver =</span>
|
|
|
+<a id='x1-67142r71'></a><span class='ecrm-0500'>71</span><span class='ectt-0800'> {</span>
|
|
|
+<a id='x1-67144r72'></a><span class='ecrm-0500'>72</span><span class='ectt-0800'> .name = </span><span id='textcolor3935'><span class='ectt-0800'>"devicemodel_example"</span></span><span class='ectt-0800'>,</span>
|
|
|
+<a id='x1-67146r73'></a><span class='ecrm-0500'>73</span><span class='ectt-0800'> .pm = &devicemodel_pm_ops,</span>
|
|
|
+<a id='x1-67148r74'></a><span class='ecrm-0500'>74</span><span class='ectt-0800'> },</span>
|
|
|
+<a id='x1-67150r75'></a><span class='ecrm-0500'>75</span><span class='ectt-0800'> .probe = devicemodel_probe,</span>
|
|
|
+<a id='x1-67152r76'></a><span class='ecrm-0500'>76</span><span class='ectt-0800'> .remove = devicemodel_remove,</span>
|
|
|
+<a id='x1-67154r77'></a><span class='ecrm-0500'>77</span><span class='ectt-0800'>};</span>
|
|
|
+<a id='x1-67156r78'></a><span class='ecrm-0500'>78</span>
|
|
|
+<a id='x1-67158r79'></a><span class='ecrm-0500'>79</span><span id='textcolor3936'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3937'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> __init devicemodel_init(</span><span id='textcolor3938'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
+<a id='x1-67160r80'></a><span class='ecrm-0500'>80</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67162r81'></a><span class='ecrm-0500'>81</span><span class='ectt-0800'> </span><span id='textcolor3939'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> ret;</span>
|
|
|
<a id='x1-67164r82'></a><span class='ecrm-0500'>82</span>
|
|
|
-<a id='x1-67166r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'> ret = platform_driver_register(&devicemodel_driver);</span>
|
|
|
+<a id='x1-67166r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3940'><span class='ectt-0800'>"devicemodel init</span></span><span id='textcolor3941'><span class='ectt-0800'>\n</span></span><span id='textcolor3942'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
<a id='x1-67168r84'></a><span class='ecrm-0500'>84</span>
|
|
|
-<a id='x1-67170r85'></a><span class='ecrm-0500'>85</span><span class='ectt-0800'> </span><span id='textcolor3941'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span>
|
|
|
-<a id='x1-67172r86'></a><span class='ecrm-0500'>86</span><span class='ectt-0800'> pr_err(</span><span id='textcolor3942'><span class='ectt-0800'>"Unable to register driver</span></span><span id='textcolor3943'><span class='ectt-0800'>\n</span></span><span id='textcolor3944'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67174r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'> </span><span id='textcolor3945'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span>
|
|
|
-<a id='x1-67176r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'> }</span>
|
|
|
-<a id='x1-67178r89'></a><span class='ecrm-0500'>89</span>
|
|
|
-<a id='x1-67180r90'></a><span class='ecrm-0500'>90</span><span class='ectt-0800'> </span><span id='textcolor3946'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
-<a id='x1-67182r91'></a><span class='ecrm-0500'>91</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67184r92'></a><span class='ecrm-0500'>92</span>
|
|
|
-<a id='x1-67186r93'></a><span class='ecrm-0500'>93</span><span id='textcolor3947'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3948'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit devicemodel_exit(</span><span id='textcolor3949'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
-<a id='x1-67188r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-67190r95'></a><span class='ecrm-0500'>95</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3950'><span class='ectt-0800'>"devicemodel exit</span></span><span id='textcolor3951'><span class='ectt-0800'>\n</span></span><span id='textcolor3952'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67192r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'> platform_driver_unregister(&devicemodel_driver);</span>
|
|
|
-<a id='x1-67194r97'></a><span class='ecrm-0500'>97</span><span class='ectt-0800'>}</span>
|
|
|
-<a id='x1-67196r98'></a><span class='ecrm-0500'>98</span>
|
|
|
-<a id='x1-67198r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'>module_init(devicemodel_init);</span>
|
|
|
-<a id='x1-67200r100'></a><span class='ecrm-0500'>100</span><span class='ectt-0800'>module_exit(devicemodel_exit);</span>
|
|
|
-<a id='x1-67202r101'></a><span class='ecrm-0500'>101</span>
|
|
|
-<a id='x1-67204r102'></a><span class='ecrm-0500'>102</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor3953'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-67206r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor3954'><span class='ectt-0800'>"Linux Device Model example"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
+<a id='x1-67170r85'></a><span class='ecrm-0500'>85</span><span class='ectt-0800'> ret = platform_driver_register(&devicemodel_driver);</span>
|
|
|
+<a id='x1-67172r86'></a><span class='ecrm-0500'>86</span>
|
|
|
+<a id='x1-67174r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'> </span><span id='textcolor3943'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span>
|
|
|
+<a id='x1-67176r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'> pr_err(</span><span id='textcolor3944'><span class='ectt-0800'>"Unable to register driver</span></span><span id='textcolor3945'><span class='ectt-0800'>\n</span></span><span id='textcolor3946'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67178r89'></a><span class='ecrm-0500'>89</span><span class='ectt-0800'> </span><span id='textcolor3947'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span>
|
|
|
+<a id='x1-67180r90'></a><span class='ecrm-0500'>90</span><span class='ectt-0800'> }</span>
|
|
|
+<a id='x1-67182r91'></a><span class='ecrm-0500'>91</span>
|
|
|
+<a id='x1-67184r92'></a><span class='ecrm-0500'>92</span><span class='ectt-0800'> </span><span id='textcolor3948'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-67186r93'></a><span class='ecrm-0500'>93</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67188r94'></a><span class='ecrm-0500'>94</span>
|
|
|
+<a id='x1-67190r95'></a><span class='ecrm-0500'>95</span><span id='textcolor3949'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3950'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit devicemodel_exit(</span><span id='textcolor3951'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
+<a id='x1-67192r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'>{</span>
|
|
|
+<a id='x1-67194r97'></a><span class='ecrm-0500'>97</span><span class='ectt-0800'> pr_info(</span><span id='textcolor3952'><span class='ectt-0800'>"devicemodel exit</span></span><span id='textcolor3953'><span class='ectt-0800'>\n</span></span><span id='textcolor3954'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67196r98'></a><span class='ecrm-0500'>98</span><span class='ectt-0800'> platform_driver_unregister(&devicemodel_driver);</span>
|
|
|
+<a id='x1-67198r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'>}</span>
|
|
|
+<a id='x1-67200r100'></a><span class='ecrm-0500'>100</span>
|
|
|
+<a id='x1-67202r101'></a><span class='ecrm-0500'>101</span><span class='ectt-0800'>module_init(devicemodel_init);</span>
|
|
|
+<a id='x1-67204r102'></a><span class='ecrm-0500'>102</span><span class='ectt-0800'>module_exit(devicemodel_exit);</span>
|
|
|
+<a id='x1-67206r103'></a><span class='ecrm-0500'>103</span>
|
|
|
+<a id='x1-67208r104'></a><span class='ecrm-0500'>104</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor3955'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-67210r105'></a><span class='ecrm-0500'>105</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor3956'><span class='ectt-0800'>"Linux Device Model example"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
<!-- l. 2231 --><p class='noindent'>
|
|
|
</p>
|
|
|
<h3 class='sectionHead' id='optimizations'><span class='titlemark'>19 </span> <a id='x1-6800019'></a>Optimizations</h3>
|
|
@@ -7386,10 +7388,10 @@ to succeed.
|
|
|
|
|
|
</p>
|
|
|
<pre class='fancyvrb' id='fancyvrb105'><a id='x1-69012r1'></a><span class='ecrm-0500'>1</span><span class='ectt-0800'>bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx);</span>
|
|
|
-<a id='x1-69014r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3955'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (unlikely(!bvl)) {</span>
|
|
|
+<a id='x1-69014r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3957'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (unlikely(!bvl)) {</span>
|
|
|
<a id='x1-69016r3'></a><span class='ecrm-0500'>3</span><span class='ectt-0800'> mempool_free(bio, bio_pool);</span>
|
|
|
<a id='x1-69018r4'></a><span class='ecrm-0500'>4</span><span class='ectt-0800'> bio = NULL;</span>
|
|
|
-<a id='x1-69020r5'></a><span class='ecrm-0500'>5</span><span class='ectt-0800'> </span><span id='textcolor3956'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> out;</span>
|
|
|
+<a id='x1-69020r5'></a><span class='ecrm-0500'>5</span><span class='ectt-0800'> </span><span id='textcolor3958'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> out;</span>
|
|
|
<a id='x1-69022r6'></a><span class='ecrm-0500'>6</span><span class='ectt-0800'>}</span></pre>
|
|
|
<!-- l. 2249 --><p class='indent'> When the <code> <span class='ectt-1000'>unlikely</span>
|
|
|
</code> macro is used, the compiler alters its machine instruction output, so that it
|
|
@@ -7407,7 +7409,7 @@ prediction. The most typical use case of static keys is for performance-sensitiv
|
|
|
code, such as tracepoints, context switching, networking, etc. These hot paths of the
|
|
|
kernel often contain branches and can be optimized easily using this technique.
|
|
|
Before we can use static keys in the kernel, we need to make sure that gcc supports
|
|
|
-<code> <span id='textcolor3957'><span class='ectt-1000'>asm</span></span><span class='ectt-1000'> </span><span id='textcolor3958'><span class='ectt-1000'>goto</span></span>
|
|
|
+<code> <span id='textcolor3959'><span class='ectt-1000'>asm</span></span><span class='ectt-1000'> </span><span id='textcolor3960'><span class='ectt-1000'>goto</span></span>
|
|
|
</code> inline assembly, and the following kernel configurations are set:
|
|
|
</p><!-- l. 1 --><p class='indent'>
|
|
|
</p>
|
|
@@ -7430,10 +7432,10 @@ no-op instruction will be generated at compile time as the key is initialized to
|
|
|
and the branch is unlikely to be taken.
|
|
|
</p><!-- l. 1 --><p class='indent'>
|
|
|
</p>
|
|
|
- <pre class='fancyvrb' id='fancyvrb108'><a id='x1-70021r1'></a><span class='ecrm-0500'>1</span><span class='ectt-0800'>pr_info(</span><span id='textcolor3959'><span class='ectt-0800'>"fastpath 1</span></span><span id='textcolor3960'><span class='ectt-0800'>\n</span></span><span id='textcolor3961'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-70023r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3962'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (static_branch_unlikely(&fkey))</span>
|
|
|
-<a id='x1-70025r3'></a><span class='ecrm-0500'>3</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor3963'><span class='ectt-0800'>"do unlikely thing</span></span><span id='textcolor3964'><span class='ectt-0800'>\n</span></span><span id='textcolor3965'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-70027r4'></a><span class='ecrm-0500'>4</span><span class='ectt-0800'>pr_info(</span><span id='textcolor3966'><span class='ectt-0800'>"fastpath 2</span></span><span id='textcolor3967'><span class='ectt-0800'>\n</span></span><span id='textcolor3968'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
+ <pre class='fancyvrb' id='fancyvrb108'><a id='x1-70021r1'></a><span class='ecrm-0500'>1</span><span class='ectt-0800'>pr_info(</span><span id='textcolor3961'><span class='ectt-0800'>"fastpath 1</span></span><span id='textcolor3962'><span class='ectt-0800'>\n</span></span><span id='textcolor3963'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70023r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3964'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (static_branch_unlikely(&fkey))</span>
|
|
|
+<a id='x1-70025r3'></a><span class='ecrm-0500'>3</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor3965'><span class='ectt-0800'>"do unlikely thing</span></span><span id='textcolor3966'><span class='ectt-0800'>\n</span></span><span id='textcolor3967'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70027r4'></a><span class='ecrm-0500'>4</span><span class='ectt-0800'>pr_info(</span><span id='textcolor3968'><span class='ectt-0800'>"fastpath 2</span></span><span id='textcolor3969'><span class='ectt-0800'>\n</span></span><span id='textcolor3970'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
|
|
|
|
|
|
|
|
@@ -7446,158 +7448,158 @@ code <code> <span class='ectt-1000'>pr_alert</span>
|
|
|
static key works.
|
|
|
</p><!-- l. 1 --><p class='indent'>
|
|
|
</p>
|
|
|
- <pre class='fancyvrb' id='fancyvrb109'><a id='x1-70031r1'></a><span class='ecrm-0500'>1</span><span id='textcolor3969'><span class='ectt-0800'>/*</span></span>
|
|
|
-<a id='x1-70033r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3970'><span class='ectt-0800'> * static_key.c</span></span>
|
|
|
-<a id='x1-70035r3'></a><span class='ecrm-0500'>3</span><span id='textcolor3971'><span class='ectt-0800'> */</span></span>
|
|
|
+ <pre class='fancyvrb' id='fancyvrb109'><a id='x1-70031r1'></a><span class='ecrm-0500'>1</span><span id='textcolor3971'><span class='ectt-0800'>/*</span></span>
|
|
|
+<a id='x1-70033r2'></a><span class='ecrm-0500'>2</span><span id='textcolor3972'><span class='ectt-0800'> * static_key.c</span></span>
|
|
|
+<a id='x1-70035r3'></a><span class='ecrm-0500'>3</span><span id='textcolor3973'><span class='ectt-0800'> */</span></span>
|
|
|
<a id='x1-70037r4'></a><span class='ecrm-0500'>4</span>
|
|
|
-<a id='x1-70039r5'></a><span class='ecrm-0500'>5</span><span id='textcolor3972'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3973'><span class='ectt-0800'><linux/atomic.h></span></span>
|
|
|
-<a id='x1-70041r6'></a><span class='ecrm-0500'>6</span><span id='textcolor3974'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3975'><span class='ectt-0800'><linux/device.h></span></span>
|
|
|
-<a id='x1-70043r7'></a><span class='ecrm-0500'>7</span><span id='textcolor3976'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3977'><span class='ectt-0800'><linux/fs.h></span></span>
|
|
|
-<a id='x1-70045r8'></a><span class='ecrm-0500'>8</span><span id='textcolor3978'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3979'><span class='ectt-0800'><linux/kernel.h> /* for sprintf() */</span></span>
|
|
|
-<a id='x1-70047r9'></a><span class='ecrm-0500'>9</span><span id='textcolor3980'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3981'><span class='ectt-0800'><linux/module.h></span></span>
|
|
|
-<a id='x1-70049r10'></a><span class='ecrm-0500'>10</span><span id='textcolor3982'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3983'><span class='ectt-0800'><linux/printk.h></span></span>
|
|
|
-<a id='x1-70051r11'></a><span class='ecrm-0500'>11</span><span id='textcolor3984'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3985'><span class='ectt-0800'><linux/types.h></span></span>
|
|
|
-<a id='x1-70053r12'></a><span class='ecrm-0500'>12</span><span id='textcolor3986'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3987'><span class='ectt-0800'><linux/uaccess.h> /* for get_user and put_user */</span></span>
|
|
|
-<a id='x1-70055r13'></a><span class='ecrm-0500'>13</span><span id='textcolor3988'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3989'><span class='ectt-0800'><linux/jump_label.h> /* for static key macros */</span></span>
|
|
|
-<a id='x1-70057r14'></a><span class='ecrm-0500'>14</span><span id='textcolor3990'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3991'><span class='ectt-0800'><linux/version.h></span></span>
|
|
|
+<a id='x1-70039r5'></a><span class='ecrm-0500'>5</span><span id='textcolor3974'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3975'><span class='ectt-0800'><linux/atomic.h></span></span>
|
|
|
+<a id='x1-70041r6'></a><span class='ecrm-0500'>6</span><span id='textcolor3976'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3977'><span class='ectt-0800'><linux/device.h></span></span>
|
|
|
+<a id='x1-70043r7'></a><span class='ecrm-0500'>7</span><span id='textcolor3978'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3979'><span class='ectt-0800'><linux/fs.h></span></span>
|
|
|
+<a id='x1-70045r8'></a><span class='ecrm-0500'>8</span><span id='textcolor3980'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3981'><span class='ectt-0800'><linux/kernel.h> /* for sprintf() */</span></span>
|
|
|
+<a id='x1-70047r9'></a><span class='ecrm-0500'>9</span><span id='textcolor3982'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3983'><span class='ectt-0800'><linux/module.h></span></span>
|
|
|
+<a id='x1-70049r10'></a><span class='ecrm-0500'>10</span><span id='textcolor3984'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3985'><span class='ectt-0800'><linux/printk.h></span></span>
|
|
|
+<a id='x1-70051r11'></a><span class='ecrm-0500'>11</span><span id='textcolor3986'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3987'><span class='ectt-0800'><linux/types.h></span></span>
|
|
|
+<a id='x1-70053r12'></a><span class='ecrm-0500'>12</span><span id='textcolor3988'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3989'><span class='ectt-0800'><linux/uaccess.h> /* for get_user and put_user */</span></span>
|
|
|
+<a id='x1-70055r13'></a><span class='ecrm-0500'>13</span><span id='textcolor3990'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3991'><span class='ectt-0800'><linux/jump_label.h> /* for static key macros */</span></span>
|
|
|
+<a id='x1-70057r14'></a><span class='ecrm-0500'>14</span><span id='textcolor3992'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3993'><span class='ectt-0800'><linux/version.h></span></span>
|
|
|
<a id='x1-70059r15'></a><span class='ecrm-0500'>15</span>
|
|
|
-<a id='x1-70061r16'></a><span class='ecrm-0500'>16</span><span id='textcolor3992'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3993'><span class='ectt-0800'><asm/errno.h></span></span>
|
|
|
+<a id='x1-70061r16'></a><span class='ecrm-0500'>16</span><span id='textcolor3994'><span class='ectt-0800'>#include</span></span><span class='ectt-0800'> </span><span id='textcolor3995'><span class='ectt-0800'><asm/errno.h></span></span>
|
|
|
<a id='x1-70063r17'></a><span class='ecrm-0500'>17</span>
|
|
|
-<a id='x1-70065r18'></a><span class='ecrm-0500'>18</span><span id='textcolor3994'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3995'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_open(</span><span id='textcolor3996'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor3997'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file);</span>
|
|
|
-<a id='x1-70067r19'></a><span class='ecrm-0500'>19</span><span id='textcolor3998'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3999'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_release(</span><span id='textcolor4000'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4001'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file);</span>
|
|
|
-<a id='x1-70069r20'></a><span class='ecrm-0500'>20</span><span id='textcolor4002'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4003'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_read(</span><span id='textcolor4004'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file, </span><span id='textcolor4005'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buf, </span><span id='textcolor4006'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> count,</span>
|
|
|
+<a id='x1-70065r18'></a><span class='ecrm-0500'>18</span><span id='textcolor3996'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor3997'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_open(</span><span id='textcolor3998'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor3999'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file);</span>
|
|
|
+<a id='x1-70067r19'></a><span class='ecrm-0500'>19</span><span id='textcolor4000'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4001'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_release(</span><span id='textcolor4002'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4003'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file);</span>
|
|
|
+<a id='x1-70069r20'></a><span class='ecrm-0500'>20</span><span id='textcolor4004'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4005'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_read(</span><span id='textcolor4006'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file, </span><span id='textcolor4007'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buf, </span><span id='textcolor4008'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> count,</span>
|
|
|
<a id='x1-70071r21'></a><span class='ecrm-0500'>21</span><span class='ectt-0800'> loff_t *ppos);</span>
|
|
|
-<a id='x1-70073r22'></a><span class='ecrm-0500'>22</span><span id='textcolor4007'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4008'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_write(</span><span id='textcolor4009'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file, </span><span id='textcolor4010'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4011'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buf,</span>
|
|
|
-<a id='x1-70075r23'></a><span class='ecrm-0500'>23</span><span class='ectt-0800'> </span><span id='textcolor4012'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> count, loff_t *ppos);</span>
|
|
|
+<a id='x1-70073r22'></a><span class='ecrm-0500'>22</span><span id='textcolor4009'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4010'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_write(</span><span id='textcolor4011'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file, </span><span id='textcolor4012'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4013'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buf,</span>
|
|
|
+<a id='x1-70075r23'></a><span class='ecrm-0500'>23</span><span class='ectt-0800'> </span><span id='textcolor4014'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> count, loff_t *ppos);</span>
|
|
|
<a id='x1-70077r24'></a><span class='ecrm-0500'>24</span>
|
|
|
-<a id='x1-70079r25'></a><span class='ecrm-0500'>25</span><span id='textcolor4013'><span class='ectt-0800'>#define DEVICE_NAME "key_state"</span></span>
|
|
|
-<a id='x1-70081r26'></a><span class='ecrm-0500'>26</span><span id='textcolor4014'><span class='ectt-0800'>#define BUF_LEN 10</span></span>
|
|
|
+<a id='x1-70079r25'></a><span class='ecrm-0500'>25</span><span id='textcolor4015'><span class='ectt-0800'>#define DEVICE_NAME "key_state"</span></span>
|
|
|
+<a id='x1-70081r26'></a><span class='ecrm-0500'>26</span><span id='textcolor4016'><span class='ectt-0800'>#define BUF_LEN 10</span></span>
|
|
|
<a id='x1-70083r27'></a><span class='ecrm-0500'>27</span>
|
|
|
-<a id='x1-70085r28'></a><span class='ecrm-0500'>28</span><span id='textcolor4015'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4016'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> major;</span>
|
|
|
+<a id='x1-70085r28'></a><span class='ecrm-0500'>28</span><span id='textcolor4017'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4018'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> major;</span>
|
|
|
<a id='x1-70087r29'></a><span class='ecrm-0500'>29</span>
|
|
|
-<a id='x1-70089r30'></a><span class='ecrm-0500'>30</span><span id='textcolor4017'><span class='ectt-0800'>enum</span></span><span class='ectt-0800'> {</span>
|
|
|
+<a id='x1-70089r30'></a><span class='ecrm-0500'>30</span><span id='textcolor4019'><span class='ectt-0800'>enum</span></span><span class='ectt-0800'> {</span>
|
|
|
<a id='x1-70091r31'></a><span class='ecrm-0500'>31</span><span class='ectt-0800'> CDEV_NOT_USED,</span>
|
|
|
<a id='x1-70093r32'></a><span class='ecrm-0500'>32</span><span class='ectt-0800'> CDEV_EXCLUSIVE_OPEN,</span>
|
|
|
<a id='x1-70095r33'></a><span class='ecrm-0500'>33</span><span class='ectt-0800'>};</span>
|
|
|
<a id='x1-70097r34'></a><span class='ecrm-0500'>34</span>
|
|
|
-<a id='x1-70099r35'></a><span class='ecrm-0500'>35</span><span id='textcolor4018'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> atomic_t already_open = ATOMIC_INIT(CDEV_NOT_USED);</span>
|
|
|
+<a id='x1-70099r35'></a><span class='ecrm-0500'>35</span><span id='textcolor4020'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> atomic_t already_open = ATOMIC_INIT(CDEV_NOT_USED);</span>
|
|
|
<a id='x1-70101r36'></a><span class='ecrm-0500'>36</span>
|
|
|
-<a id='x1-70103r37'></a><span class='ecrm-0500'>37</span><span id='textcolor4019'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4020'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> msg[BUF_LEN + 1];</span>
|
|
|
+<a id='x1-70103r37'></a><span class='ecrm-0500'>37</span><span id='textcolor4021'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4022'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> msg[BUF_LEN + 1];</span>
|
|
|
<a id='x1-70105r38'></a><span class='ecrm-0500'>38</span>
|
|
|
-<a id='x1-70107r39'></a><span class='ecrm-0500'>39</span><span id='textcolor4021'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4022'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> class *cls;</span>
|
|
|
+<a id='x1-70107r39'></a><span class='ecrm-0500'>39</span><span id='textcolor4023'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4024'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> class *cls;</span>
|
|
|
<a id='x1-70109r40'></a><span class='ecrm-0500'>40</span>
|
|
|
-<a id='x1-70111r41'></a><span class='ecrm-0500'>41</span><span id='textcolor4023'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> DEFINE_STATIC_KEY_FALSE(fkey);</span>
|
|
|
+<a id='x1-70111r41'></a><span class='ecrm-0500'>41</span><span id='textcolor4025'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> DEFINE_STATIC_KEY_FALSE(fkey);</span>
|
|
|
<a id='x1-70113r42'></a><span class='ecrm-0500'>42</span>
|
|
|
-<a id='x1-70115r43'></a><span class='ecrm-0500'>43</span><span id='textcolor4024'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4025'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file_operations chardev_fops = {</span>
|
|
|
-<a id='x1-70117r44'></a><span class='ecrm-0500'>44</span><span id='textcolor4026'><span class='ectt-0800'>#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)</span></span>
|
|
|
+<a id='x1-70115r43'></a><span class='ecrm-0500'>43</span><span id='textcolor4026'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4027'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file_operations chardev_fops = {</span>
|
|
|
+<a id='x1-70117r44'></a><span class='ecrm-0500'>44</span><span id='textcolor4028'><span class='ectt-0800'>#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)</span></span>
|
|
|
<a id='x1-70119r45'></a><span class='ecrm-0500'>45</span><span class='ectt-0800'> .owner = THIS_MODULE,</span>
|
|
|
-<a id='x1-70121r46'></a><span class='ecrm-0500'>46</span><span id='textcolor4027'><span class='ectt-0800'>#endif</span></span>
|
|
|
+<a id='x1-70121r46'></a><span class='ecrm-0500'>46</span><span id='textcolor4029'><span class='ectt-0800'>#endif</span></span>
|
|
|
<a id='x1-70123r47'></a><span class='ecrm-0500'>47</span><span class='ectt-0800'> .open = device_open,</span>
|
|
|
<a id='x1-70125r48'></a><span class='ecrm-0500'>48</span><span class='ectt-0800'> .release = device_release,</span>
|
|
|
<a id='x1-70127r49'></a><span class='ecrm-0500'>49</span><span class='ectt-0800'> .read = device_read,</span>
|
|
|
<a id='x1-70129r50'></a><span class='ecrm-0500'>50</span><span class='ectt-0800'> .write = device_write,</span>
|
|
|
<a id='x1-70131r51'></a><span class='ecrm-0500'>51</span><span class='ectt-0800'>};</span>
|
|
|
<a id='x1-70133r52'></a><span class='ecrm-0500'>52</span>
|
|
|
-<a id='x1-70135r53'></a><span class='ecrm-0500'>53</span><span id='textcolor4028'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4029'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> __init chardev_init(</span><span id='textcolor4030'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
+<a id='x1-70135r53'></a><span class='ecrm-0500'>53</span><span id='textcolor4030'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4031'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> __init chardev_init(</span><span id='textcolor4032'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
<a id='x1-70137r54'></a><span class='ecrm-0500'>54</span><span class='ectt-0800'>{</span>
|
|
|
<a id='x1-70139r55'></a><span class='ecrm-0500'>55</span><span class='ectt-0800'> major = register_chrdev(0, DEVICE_NAME, &chardev_fops);</span>
|
|
|
-<a id='x1-70141r56'></a><span class='ecrm-0500'>56</span><span class='ectt-0800'> </span><span id='textcolor4031'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (major < 0) {</span>
|
|
|
-<a id='x1-70143r57'></a><span class='ecrm-0500'>57</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor4032'><span class='ectt-0800'>"Registering char device failed with %d</span></span><span id='textcolor4033'><span class='ectt-0800'>\n</span></span><span id='textcolor4034'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, major);</span>
|
|
|
-<a id='x1-70145r58'></a><span class='ecrm-0500'>58</span><span class='ectt-0800'> </span><span id='textcolor4035'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> major;</span>
|
|
|
+<a id='x1-70141r56'></a><span class='ecrm-0500'>56</span><span class='ectt-0800'> </span><span id='textcolor4033'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (major < 0) {</span>
|
|
|
+<a id='x1-70143r57'></a><span class='ecrm-0500'>57</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor4034'><span class='ectt-0800'>"Registering char device failed with %d</span></span><span id='textcolor4035'><span class='ectt-0800'>\n</span></span><span id='textcolor4036'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, major);</span>
|
|
|
+<a id='x1-70145r58'></a><span class='ecrm-0500'>58</span><span class='ectt-0800'> </span><span id='textcolor4037'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> major;</span>
|
|
|
<a id='x1-70147r59'></a><span class='ecrm-0500'>59</span><span class='ectt-0800'> }</span>
|
|
|
<a id='x1-70149r60'></a><span class='ecrm-0500'>60</span>
|
|
|
-<a id='x1-70151r61'></a><span class='ecrm-0500'>61</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4036'><span class='ectt-0800'>"I was assigned major number %d</span></span><span id='textcolor4037'><span class='ectt-0800'>\n</span></span><span id='textcolor4038'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, major);</span>
|
|
|
+<a id='x1-70151r61'></a><span class='ecrm-0500'>61</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4038'><span class='ectt-0800'>"I was assigned major number %d</span></span><span id='textcolor4039'><span class='ectt-0800'>\n</span></span><span id='textcolor4040'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, major);</span>
|
|
|
<a id='x1-70153r62'></a><span class='ecrm-0500'>62</span>
|
|
|
-<a id='x1-70155r63'></a><span class='ecrm-0500'>63</span><span id='textcolor4039'><span class='ectt-0800'>#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)</span></span>
|
|
|
+<a id='x1-70155r63'></a><span class='ecrm-0500'>63</span><span id='textcolor4041'><span class='ectt-0800'>#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)</span></span>
|
|
|
<a id='x1-70157r64'></a><span class='ecrm-0500'>64</span><span class='ectt-0800'> cls = class_create(DEVICE_NAME);</span>
|
|
|
-<a id='x1-70159r65'></a><span class='ecrm-0500'>65</span><span id='textcolor4040'><span class='ectt-0800'>#else</span></span>
|
|
|
+<a id='x1-70159r65'></a><span class='ecrm-0500'>65</span><span id='textcolor4042'><span class='ectt-0800'>#else</span></span>
|
|
|
<a id='x1-70161r66'></a><span class='ecrm-0500'>66</span><span class='ectt-0800'> cls = class_create(THIS_MODULE, DEVICE_NAME);</span>
|
|
|
-<a id='x1-70163r67'></a><span class='ecrm-0500'>67</span><span id='textcolor4041'><span class='ectt-0800'>#endif</span></span>
|
|
|
+<a id='x1-70163r67'></a><span class='ecrm-0500'>67</span><span id='textcolor4043'><span class='ectt-0800'>#endif</span></span>
|
|
|
<a id='x1-70165r68'></a><span class='ecrm-0500'>68</span>
|
|
|
<a id='x1-70167r69'></a><span class='ecrm-0500'>69</span><span class='ectt-0800'> device_create(cls, NULL, MKDEV(major, 0), NULL, DEVICE_NAME);</span>
|
|
|
<a id='x1-70169r70'></a><span class='ecrm-0500'>70</span>
|
|
|
-<a id='x1-70171r71'></a><span class='ecrm-0500'>71</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4042'><span class='ectt-0800'>"Device created on /dev/%s</span></span><span id='textcolor4043'><span class='ectt-0800'>\n</span></span><span id='textcolor4044'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, DEVICE_NAME);</span>
|
|
|
+<a id='x1-70171r71'></a><span class='ecrm-0500'>71</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4044'><span class='ectt-0800'>"Device created on /dev/%s</span></span><span id='textcolor4045'><span class='ectt-0800'>\n</span></span><span id='textcolor4046'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, DEVICE_NAME);</span>
|
|
|
<a id='x1-70173r72'></a><span class='ecrm-0500'>72</span>
|
|
|
-<a id='x1-70175r73'></a><span class='ecrm-0500'>73</span><span class='ectt-0800'> </span><span id='textcolor4045'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-70175r73'></a><span class='ecrm-0500'>73</span><span class='ectt-0800'> </span><span id='textcolor4047'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
<a id='x1-70177r74'></a><span class='ecrm-0500'>74</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70179r75'></a><span class='ecrm-0500'>75</span>
|
|
|
-<a id='x1-70181r76'></a><span class='ecrm-0500'>76</span><span id='textcolor4046'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4047'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit chardev_exit(</span><span id='textcolor4048'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
+<a id='x1-70181r76'></a><span class='ecrm-0500'>76</span><span id='textcolor4048'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4049'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit chardev_exit(</span><span id='textcolor4050'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span>
|
|
|
<a id='x1-70183r77'></a><span class='ecrm-0500'>77</span><span class='ectt-0800'>{</span>
|
|
|
<a id='x1-70185r78'></a><span class='ecrm-0500'>78</span><span class='ectt-0800'> device_destroy(cls, MKDEV(major, 0));</span>
|
|
|
<a id='x1-70187r79'></a><span class='ecrm-0500'>79</span><span class='ectt-0800'> class_destroy(cls);</span>
|
|
|
<a id='x1-70189r80'></a><span class='ecrm-0500'>80</span>
|
|
|
-<a id='x1-70191r81'></a><span class='ecrm-0500'>81</span><span class='ectt-0800'> </span><span id='textcolor4049'><span class='ectt-0800'>/* Unregister the device */</span></span>
|
|
|
+<a id='x1-70191r81'></a><span class='ecrm-0500'>81</span><span class='ectt-0800'> </span><span id='textcolor4051'><span class='ectt-0800'>/* Unregister the device */</span></span>
|
|
|
<a id='x1-70193r82'></a><span class='ecrm-0500'>82</span><span class='ectt-0800'> unregister_chrdev(major, DEVICE_NAME);</span>
|
|
|
<a id='x1-70195r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70197r84'></a><span class='ecrm-0500'>84</span>
|
|
|
-<a id='x1-70199r85'></a><span class='ecrm-0500'>85</span><span id='textcolor4050'><span class='ectt-0800'>/* Methods */</span></span>
|
|
|
+<a id='x1-70199r85'></a><span class='ecrm-0500'>85</span><span id='textcolor4052'><span class='ectt-0800'>/* Methods */</span></span>
|
|
|
<a id='x1-70201r86'></a><span class='ecrm-0500'>86</span>
|
|
|
-<a id='x1-70203r87'></a><span class='ecrm-0500'>87</span><span id='textcolor4051'><span class='ectt-0800'>/**</span></span>
|
|
|
-<a id='x1-70205r88'></a><span class='ecrm-0500'>88</span><span id='textcolor4052'><span class='ectt-0800'> * Called when a process tried to open the device file, like</span></span>
|
|
|
-<a id='x1-70207r89'></a><span class='ecrm-0500'>89</span><span id='textcolor4053'><span class='ectt-0800'> * cat /dev/key_state</span></span>
|
|
|
-<a id='x1-70209r90'></a><span class='ecrm-0500'>90</span><span id='textcolor4054'><span class='ectt-0800'> */</span></span>
|
|
|
-<a id='x1-70211r91'></a><span class='ecrm-0500'>91</span><span id='textcolor4055'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4056'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_open(</span><span id='textcolor4057'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4058'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file)</span>
|
|
|
+<a id='x1-70203r87'></a><span class='ecrm-0500'>87</span><span id='textcolor4053'><span class='ectt-0800'>/**</span></span>
|
|
|
+<a id='x1-70205r88'></a><span class='ecrm-0500'>88</span><span id='textcolor4054'><span class='ectt-0800'> * Called when a process tried to open the device file, like</span></span>
|
|
|
+<a id='x1-70207r89'></a><span class='ecrm-0500'>89</span><span id='textcolor4055'><span class='ectt-0800'> * cat /dev/key_state</span></span>
|
|
|
+<a id='x1-70209r90'></a><span class='ecrm-0500'>90</span><span id='textcolor4056'><span class='ectt-0800'> */</span></span>
|
|
|
+<a id='x1-70211r91'></a><span class='ecrm-0500'>91</span><span id='textcolor4057'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4058'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_open(</span><span id='textcolor4059'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4060'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file)</span>
|
|
|
<a id='x1-70213r92'></a><span class='ecrm-0500'>92</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-70215r93'></a><span class='ecrm-0500'>93</span><span class='ectt-0800'> </span><span id='textcolor4059'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (atomic_cmpxchg(&already_open, CDEV_NOT_USED, CDEV_EXCLUSIVE_OPEN))</span>
|
|
|
-<a id='x1-70217r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'> </span><span id='textcolor4060'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EBUSY;</span>
|
|
|
+<a id='x1-70215r93'></a><span class='ecrm-0500'>93</span><span class='ectt-0800'> </span><span id='textcolor4061'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (atomic_cmpxchg(&already_open, CDEV_NOT_USED, CDEV_EXCLUSIVE_OPEN))</span>
|
|
|
+<a id='x1-70217r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'> </span><span id='textcolor4062'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EBUSY;</span>
|
|
|
<a id='x1-70219r95'></a><span class='ecrm-0500'>95</span>
|
|
|
-<a id='x1-70221r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'> sprintf(msg, static_key_enabled(&fkey) ? </span><span id='textcolor4061'><span class='ectt-0800'>"enabled</span></span><span id='textcolor4062'><span class='ectt-0800'>\n</span></span><span id='textcolor4063'><span class='ectt-0800'>"</span></span><span class='ectt-0800'> : </span><span id='textcolor4064'><span class='ectt-0800'>"disabled</span></span><span id='textcolor4065'><span class='ectt-0800'>\n</span></span><span id='textcolor4066'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70221r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'> sprintf(msg, static_key_enabled(&fkey) ? </span><span id='textcolor4063'><span class='ectt-0800'>"enabled</span></span><span id='textcolor4064'><span class='ectt-0800'>\n</span></span><span id='textcolor4065'><span class='ectt-0800'>"</span></span><span class='ectt-0800'> : </span><span id='textcolor4066'><span class='ectt-0800'>"disabled</span></span><span id='textcolor4067'><span class='ectt-0800'>\n</span></span><span id='textcolor4068'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
<a id='x1-70223r97'></a><span class='ecrm-0500'>97</span>
|
|
|
-<a id='x1-70225r98'></a><span class='ecrm-0500'>98</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4067'><span class='ectt-0800'>"fastpath 1</span></span><span id='textcolor4068'><span class='ectt-0800'>\n</span></span><span id='textcolor4069'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-70227r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'> </span><span id='textcolor4070'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (static_branch_unlikely(&fkey))</span>
|
|
|
-<a id='x1-70229r100'></a><span class='ecrm-0500'>100</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor4071'><span class='ectt-0800'>"do unlikely thing</span></span><span id='textcolor4072'><span class='ectt-0800'>\n</span></span><span id='textcolor4073'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-70231r101'></a><span class='ecrm-0500'>101</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4074'><span class='ectt-0800'>"fastpath 2</span></span><span id='textcolor4075'><span class='ectt-0800'>\n</span></span><span id='textcolor4076'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70225r98'></a><span class='ecrm-0500'>98</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4069'><span class='ectt-0800'>"fastpath 1</span></span><span id='textcolor4070'><span class='ectt-0800'>\n</span></span><span id='textcolor4071'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70227r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'> </span><span id='textcolor4072'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (static_branch_unlikely(&fkey))</span>
|
|
|
+<a id='x1-70229r100'></a><span class='ecrm-0500'>100</span><span class='ectt-0800'> pr_alert(</span><span id='textcolor4073'><span class='ectt-0800'>"do unlikely thing</span></span><span id='textcolor4074'><span class='ectt-0800'>\n</span></span><span id='textcolor4075'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70231r101'></a><span class='ecrm-0500'>101</span><span class='ectt-0800'> pr_info(</span><span id='textcolor4076'><span class='ectt-0800'>"fastpath 2</span></span><span id='textcolor4077'><span class='ectt-0800'>\n</span></span><span id='textcolor4078'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
<a id='x1-70233r102'></a><span class='ecrm-0500'>102</span>
|
|
|
<a id='x1-70235r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'> try_module_get(THIS_MODULE);</span>
|
|
|
<a id='x1-70237r104'></a><span class='ecrm-0500'>104</span>
|
|
|
-<a id='x1-70239r105'></a><span class='ecrm-0500'>105</span><span class='ectt-0800'> </span><span id='textcolor4077'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-70239r105'></a><span class='ecrm-0500'>105</span><span class='ectt-0800'> </span><span id='textcolor4079'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
<a id='x1-70241r106'></a><span class='ecrm-0500'>106</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70243r107'></a><span class='ecrm-0500'>107</span>
|
|
|
-<a id='x1-70245r108'></a><span class='ecrm-0500'>108</span><span id='textcolor4078'><span class='ectt-0800'>/**</span></span>
|
|
|
-<a id='x1-70247r109'></a><span class='ecrm-0500'>109</span><span id='textcolor4079'><span class='ectt-0800'> * Called when a process closes the device file</span></span>
|
|
|
-<a id='x1-70249r110'></a><span class='ecrm-0500'>110</span><span id='textcolor4080'><span class='ectt-0800'> */</span></span>
|
|
|
-<a id='x1-70251r111'></a><span class='ecrm-0500'>111</span><span id='textcolor4081'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4082'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_release(</span><span id='textcolor4083'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4084'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file)</span>
|
|
|
+<a id='x1-70245r108'></a><span class='ecrm-0500'>108</span><span id='textcolor4080'><span class='ectt-0800'>/**</span></span>
|
|
|
+<a id='x1-70247r109'></a><span class='ecrm-0500'>109</span><span id='textcolor4081'><span class='ectt-0800'> * Called when a process closes the device file</span></span>
|
|
|
+<a id='x1-70249r110'></a><span class='ecrm-0500'>110</span><span id='textcolor4082'><span class='ectt-0800'> */</span></span>
|
|
|
+<a id='x1-70251r111'></a><span class='ecrm-0500'>111</span><span id='textcolor4083'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4084'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> device_release(</span><span id='textcolor4085'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> inode *inode, </span><span id='textcolor4086'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *file)</span>
|
|
|
<a id='x1-70253r112'></a><span class='ecrm-0500'>112</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-70255r113'></a><span class='ecrm-0500'>113</span><span class='ectt-0800'> </span><span id='textcolor4085'><span class='ectt-0800'>/* We are now ready for our next caller. */</span></span>
|
|
|
+<a id='x1-70255r113'></a><span class='ecrm-0500'>113</span><span class='ectt-0800'> </span><span id='textcolor4087'><span class='ectt-0800'>/* We are now ready for our next caller. */</span></span>
|
|
|
<a id='x1-70257r114'></a><span class='ecrm-0500'>114</span><span class='ectt-0800'> atomic_set(&already_open, CDEV_NOT_USED);</span>
|
|
|
<a id='x1-70259r115'></a><span class='ecrm-0500'>115</span>
|
|
|
-<a id='x1-70261r116'></a><span class='ecrm-0500'>116</span><span class='ectt-0800'> </span><span id='textcolor4086'><span class='ectt-0800'>/**</span></span>
|
|
|
-<a id='x1-70263r117'></a><span class='ecrm-0500'>117</span><span id='textcolor4087'><span class='ectt-0800'> * Decrement the usage count, or else once you opened the file, you will</span></span>
|
|
|
-<a id='x1-70265r118'></a><span class='ecrm-0500'>118</span><span id='textcolor4088'><span class='ectt-0800'> * never get rid of the module.</span></span>
|
|
|
-<a id='x1-70267r119'></a><span class='ecrm-0500'>119</span><span id='textcolor4089'><span class='ectt-0800'> */</span></span>
|
|
|
+<a id='x1-70261r116'></a><span class='ecrm-0500'>116</span><span class='ectt-0800'> </span><span id='textcolor4088'><span class='ectt-0800'>/**</span></span>
|
|
|
+<a id='x1-70263r117'></a><span class='ecrm-0500'>117</span><span id='textcolor4089'><span class='ectt-0800'> * Decrement the usage count, or else once you opened the file, you will</span></span>
|
|
|
+<a id='x1-70265r118'></a><span class='ecrm-0500'>118</span><span id='textcolor4090'><span class='ectt-0800'> * never get rid of the module.</span></span>
|
|
|
+<a id='x1-70267r119'></a><span class='ecrm-0500'>119</span><span id='textcolor4091'><span class='ectt-0800'> */</span></span>
|
|
|
<a id='x1-70269r120'></a><span class='ecrm-0500'>120</span><span class='ectt-0800'> module_put(THIS_MODULE);</span>
|
|
|
<a id='x1-70271r121'></a><span class='ecrm-0500'>121</span>
|
|
|
-<a id='x1-70273r122'></a><span class='ecrm-0500'>122</span><span class='ectt-0800'> </span><span id='textcolor4090'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
+<a id='x1-70273r122'></a><span class='ecrm-0500'>122</span><span class='ectt-0800'> </span><span id='textcolor4092'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span>
|
|
|
<a id='x1-70275r123'></a><span class='ecrm-0500'>123</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70277r124'></a><span class='ecrm-0500'>124</span>
|
|
|
-<a id='x1-70279r125'></a><span class='ecrm-0500'>125</span><span id='textcolor4091'><span class='ectt-0800'>/**</span></span>
|
|
|
-<a id='x1-70281r126'></a><span class='ecrm-0500'>126</span><span id='textcolor4092'><span class='ectt-0800'> * Called when a process, which already opened the dev file, attempts to</span></span>
|
|
|
-<a id='x1-70283r127'></a><span class='ecrm-0500'>127</span><span id='textcolor4093'><span class='ectt-0800'> * read from it.</span></span>
|
|
|
-<a id='x1-70285r128'></a><span class='ecrm-0500'>128</span><span id='textcolor4094'><span class='ectt-0800'> */</span></span>
|
|
|
-<a id='x1-70287r129'></a><span class='ecrm-0500'>129</span><span id='textcolor4095'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4096'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_read(</span><span id='textcolor4097'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *filp, </span><span id='textcolor4098'><span class='ectt-0800'>/* see include/linux/fs.h */</span></span>
|
|
|
-<a id='x1-70289r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'> </span><span id='textcolor4099'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buffer, </span><span id='textcolor4100'><span class='ectt-0800'>/* buffer to fill with data */</span></span>
|
|
|
-<a id='x1-70291r131'></a><span class='ecrm-0500'>131</span><span class='ectt-0800'> </span><span id='textcolor4101'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> length, </span><span id='textcolor4102'><span class='ectt-0800'>/* length of the buffer */</span></span>
|
|
|
+<a id='x1-70279r125'></a><span class='ecrm-0500'>125</span><span id='textcolor4093'><span class='ectt-0800'>/**</span></span>
|
|
|
+<a id='x1-70281r126'></a><span class='ecrm-0500'>126</span><span id='textcolor4094'><span class='ectt-0800'> * Called when a process, which already opened the dev file, attempts to</span></span>
|
|
|
+<a id='x1-70283r127'></a><span class='ecrm-0500'>127</span><span id='textcolor4095'><span class='ectt-0800'> * read from it.</span></span>
|
|
|
+<a id='x1-70285r128'></a><span class='ecrm-0500'>128</span><span id='textcolor4096'><span class='ectt-0800'> */</span></span>
|
|
|
+<a id='x1-70287r129'></a><span class='ecrm-0500'>129</span><span id='textcolor4097'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4098'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_read(</span><span id='textcolor4099'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *filp, </span><span id='textcolor4100'><span class='ectt-0800'>/* see include/linux/fs.h */</span></span>
|
|
|
+<a id='x1-70289r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'> </span><span id='textcolor4101'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buffer, </span><span id='textcolor4102'><span class='ectt-0800'>/* buffer to fill with data */</span></span>
|
|
|
+<a id='x1-70291r131'></a><span class='ecrm-0500'>131</span><span class='ectt-0800'> </span><span id='textcolor4103'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> length, </span><span id='textcolor4104'><span class='ectt-0800'>/* length of the buffer */</span></span>
|
|
|
<a id='x1-70293r132'></a><span class='ecrm-0500'>132</span><span class='ectt-0800'> loff_t *offset)</span>
|
|
|
<a id='x1-70295r133'></a><span class='ecrm-0500'>133</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-70297r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'> </span><span id='textcolor4103'><span class='ectt-0800'>/* Number of the bytes actually written to the buffer */</span></span>
|
|
|
-<a id='x1-70299r135'></a><span class='ecrm-0500'>135</span><span class='ectt-0800'> </span><span id='textcolor4104'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> bytes_read = 0;</span>
|
|
|
-<a id='x1-70301r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'> </span><span id='textcolor4105'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4106'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> *msg_ptr = msg;</span>
|
|
|
+<a id='x1-70297r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'> </span><span id='textcolor4105'><span class='ectt-0800'>/* Number of the bytes actually written to the buffer */</span></span>
|
|
|
+<a id='x1-70299r135'></a><span class='ecrm-0500'>135</span><span class='ectt-0800'> </span><span id='textcolor4106'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> bytes_read = 0;</span>
|
|
|
+<a id='x1-70301r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'> </span><span id='textcolor4107'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4108'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> *msg_ptr = msg;</span>
|
|
|
<a id='x1-70303r137'></a><span class='ecrm-0500'>137</span>
|
|
|
-<a id='x1-70305r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'> </span><span id='textcolor4107'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (!*(msg_ptr + *offset)) { </span><span id='textcolor4108'><span class='ectt-0800'>/* We are at the end of the message */</span></span>
|
|
|
-<a id='x1-70307r139'></a><span class='ecrm-0500'>139</span><span class='ectt-0800'> *offset = 0; </span><span id='textcolor4109'><span class='ectt-0800'>/* reset the offset */</span></span>
|
|
|
-<a id='x1-70309r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'> </span><span id='textcolor4110'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0; </span><span id='textcolor4111'><span class='ectt-0800'>/* signify end of file */</span></span>
|
|
|
+<a id='x1-70305r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'> </span><span id='textcolor4109'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (!*(msg_ptr + *offset)) { </span><span id='textcolor4110'><span class='ectt-0800'>/* We are at the end of the message */</span></span>
|
|
|
+<a id='x1-70307r139'></a><span class='ecrm-0500'>139</span><span class='ectt-0800'> *offset = 0; </span><span id='textcolor4111'><span class='ectt-0800'>/* reset the offset */</span></span>
|
|
|
+<a id='x1-70309r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'> </span><span id='textcolor4112'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0; </span><span id='textcolor4113'><span class='ectt-0800'>/* signify end of file */</span></span>
|
|
|
<a id='x1-70311r141'></a><span class='ecrm-0500'>141</span><span class='ectt-0800'> }</span>
|
|
|
<a id='x1-70313r142'></a><span class='ecrm-0500'>142</span>
|
|
|
<a id='x1-70315r143'></a><span class='ecrm-0500'>143</span><span class='ectt-0800'> msg_ptr += *offset;</span>
|
|
|
<a id='x1-70317r144'></a><span class='ecrm-0500'>144</span>
|
|
|
-<a id='x1-70319r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'> </span><span id='textcolor4112'><span class='ectt-0800'>/* Actually put the data into the buffer */</span></span>
|
|
|
-<a id='x1-70321r146'></a><span class='ecrm-0500'>146</span><span class='ectt-0800'> </span><span id='textcolor4113'><span class='ectt-0800'>while</span></span><span class='ectt-0800'> (length && *msg_ptr) {</span>
|
|
|
-<a id='x1-70323r147'></a><span class='ecrm-0500'>147</span><span class='ectt-0800'> </span><span id='textcolor4114'><span class='ectt-0800'>/**</span></span>
|
|
|
-<a id='x1-70325r148'></a><span class='ecrm-0500'>148</span><span id='textcolor4115'><span class='ectt-0800'> * The buffer is in the user data segment, not the kernel</span></span>
|
|
|
-<a id='x1-70327r149'></a><span class='ecrm-0500'>149</span><span id='textcolor4116'><span class='ectt-0800'> * segment so "*" assignment won</span><span class='tctt-0800'>'</span><span class='ectt-0800'>t work. We have to use</span></span>
|
|
|
-<a id='x1-70329r150'></a><span class='ecrm-0500'>150</span><span id='textcolor4117'><span class='ectt-0800'> * put_user which copies data from the kernel data segment to</span></span>
|
|
|
-<a id='x1-70331r151'></a><span class='ecrm-0500'>151</span><span id='textcolor4118'><span class='ectt-0800'> * the user data segment.</span></span>
|
|
|
-<a id='x1-70333r152'></a><span class='ecrm-0500'>152</span><span id='textcolor4119'><span class='ectt-0800'> */</span></span>
|
|
|
+<a id='x1-70319r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'> </span><span id='textcolor4114'><span class='ectt-0800'>/* Actually put the data into the buffer */</span></span>
|
|
|
+<a id='x1-70321r146'></a><span class='ecrm-0500'>146</span><span class='ectt-0800'> </span><span id='textcolor4115'><span class='ectt-0800'>while</span></span><span class='ectt-0800'> (length && *msg_ptr) {</span>
|
|
|
+<a id='x1-70323r147'></a><span class='ecrm-0500'>147</span><span class='ectt-0800'> </span><span id='textcolor4116'><span class='ectt-0800'>/**</span></span>
|
|
|
+<a id='x1-70325r148'></a><span class='ecrm-0500'>148</span><span id='textcolor4117'><span class='ectt-0800'> * The buffer is in the user data segment, not the kernel</span></span>
|
|
|
+<a id='x1-70327r149'></a><span class='ecrm-0500'>149</span><span id='textcolor4118'><span class='ectt-0800'> * segment so "*" assignment won</span><span class='tctt-0800'>'</span><span class='ectt-0800'>t work. We have to use</span></span>
|
|
|
+<a id='x1-70329r150'></a><span class='ecrm-0500'>150</span><span id='textcolor4119'><span class='ectt-0800'> * put_user which copies data from the kernel data segment to</span></span>
|
|
|
+<a id='x1-70331r151'></a><span class='ecrm-0500'>151</span><span id='textcolor4120'><span class='ectt-0800'> * the user data segment.</span></span>
|
|
|
+<a id='x1-70333r152'></a><span class='ecrm-0500'>152</span><span id='textcolor4121'><span class='ectt-0800'> */</span></span>
|
|
|
<a id='x1-70335r153'></a><span class='ecrm-0500'>153</span><span class='ectt-0800'> put_user(*(msg_ptr++), buffer++);</span>
|
|
|
<a id='x1-70337r154'></a><span class='ecrm-0500'>154</span><span class='ectt-0800'> length--;</span>
|
|
|
<a id='x1-70339r155'></a><span class='ecrm-0500'>155</span><span class='ectt-0800'> bytes_read++;</span>
|
|
@@ -7605,41 +7607,41 @@ static key works.
|
|
|
<a id='x1-70343r157'></a><span class='ecrm-0500'>157</span>
|
|
|
<a id='x1-70345r158'></a><span class='ecrm-0500'>158</span><span class='ectt-0800'> *offset += bytes_read;</span>
|
|
|
<a id='x1-70347r159'></a><span class='ecrm-0500'>159</span>
|
|
|
-<a id='x1-70349r160'></a><span class='ecrm-0500'>160</span><span class='ectt-0800'> </span><span id='textcolor4120'><span class='ectt-0800'>/* Most read functions return the number of bytes put into the buffer. */</span></span>
|
|
|
-<a id='x1-70351r161'></a><span class='ecrm-0500'>161</span><span class='ectt-0800'> </span><span id='textcolor4121'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> bytes_read;</span>
|
|
|
+<a id='x1-70349r160'></a><span class='ecrm-0500'>160</span><span class='ectt-0800'> </span><span id='textcolor4122'><span class='ectt-0800'>/* Most read functions return the number of bytes put into the buffer. */</span></span>
|
|
|
+<a id='x1-70351r161'></a><span class='ecrm-0500'>161</span><span class='ectt-0800'> </span><span id='textcolor4123'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> bytes_read;</span>
|
|
|
<a id='x1-70353r162'></a><span class='ecrm-0500'>162</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70355r163'></a><span class='ecrm-0500'>163</span>
|
|
|
-<a id='x1-70357r164'></a><span class='ecrm-0500'>164</span><span id='textcolor4122'><span class='ectt-0800'>/* Called when a process writes to dev file; echo "enable" > /dev/key_state */</span></span>
|
|
|
-<a id='x1-70359r165'></a><span class='ecrm-0500'>165</span><span id='textcolor4123'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4124'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_write(</span><span id='textcolor4125'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *filp, </span><span id='textcolor4126'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4127'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buffer,</span>
|
|
|
-<a id='x1-70361r166'></a><span class='ecrm-0500'>166</span><span class='ectt-0800'> </span><span id='textcolor4128'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> length, loff_t *offset)</span>
|
|
|
+<a id='x1-70357r164'></a><span class='ecrm-0500'>164</span><span id='textcolor4124'><span class='ectt-0800'>/* Called when a process writes to dev file; echo "enable" > /dev/key_state */</span></span>
|
|
|
+<a id='x1-70359r165'></a><span class='ecrm-0500'>165</span><span id='textcolor4125'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor4126'><span class='ectt-0800'>ssize_t</span></span><span class='ectt-0800'> device_write(</span><span id='textcolor4127'><span class='ectt-0800'>struct</span></span><span class='ectt-0800'> file *filp, </span><span id='textcolor4128'><span class='ectt-0800'>const</span></span><span class='ectt-0800'> </span><span id='textcolor4129'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> __user *buffer,</span>
|
|
|
+<a id='x1-70361r166'></a><span class='ecrm-0500'>166</span><span class='ectt-0800'> </span><span id='textcolor4130'><span class='ectt-0800'>size_t</span></span><span class='ectt-0800'> length, loff_t *offset)</span>
|
|
|
<a id='x1-70363r167'></a><span class='ecrm-0500'>167</span><span class='ectt-0800'>{</span>
|
|
|
-<a id='x1-70365r168'></a><span class='ecrm-0500'>168</span><span class='ectt-0800'> </span><span id='textcolor4129'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> command[10];</span>
|
|
|
+<a id='x1-70365r168'></a><span class='ecrm-0500'>168</span><span class='ectt-0800'> </span><span id='textcolor4131'><span class='ectt-0800'>char</span></span><span class='ectt-0800'> command[10];</span>
|
|
|
<a id='x1-70367r169'></a><span class='ecrm-0500'>169</span>
|
|
|
-<a id='x1-70369r170'></a><span class='ecrm-0500'>170</span><span class='ectt-0800'> </span><span id='textcolor4130'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (length > 10) {</span>
|
|
|
-<a id='x1-70371r171'></a><span class='ecrm-0500'>171</span><span class='ectt-0800'> pr_err(</span><span id='textcolor4131'><span class='ectt-0800'>"command exceeded 10 char</span></span><span id='textcolor4132'><span class='ectt-0800'>\n</span></span><span id='textcolor4133'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
-<a id='x1-70373r172'></a><span class='ecrm-0500'>172</span><span class='ectt-0800'> </span><span id='textcolor4134'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EINVAL;</span>
|
|
|
+<a id='x1-70369r170'></a><span class='ecrm-0500'>170</span><span class='ectt-0800'> </span><span id='textcolor4132'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (length > 10) {</span>
|
|
|
+<a id='x1-70371r171'></a><span class='ecrm-0500'>171</span><span class='ectt-0800'> pr_err(</span><span id='textcolor4133'><span class='ectt-0800'>"command exceeded 10 char</span></span><span id='textcolor4134'><span class='ectt-0800'>\n</span></span><span id='textcolor4135'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>);</span>
|
|
|
+<a id='x1-70373r172'></a><span class='ecrm-0500'>172</span><span class='ectt-0800'> </span><span id='textcolor4136'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EINVAL;</span>
|
|
|
<a id='x1-70375r173'></a><span class='ecrm-0500'>173</span><span class='ectt-0800'> }</span>
|
|
|
<a id='x1-70377r174'></a><span class='ecrm-0500'>174</span>
|
|
|
-<a id='x1-70379r175'></a><span class='ecrm-0500'>175</span><span class='ectt-0800'> </span><span id='textcolor4135'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (copy_from_user(command, buffer, length))</span>
|
|
|
-<a id='x1-70381r176'></a><span class='ecrm-0500'>176</span><span class='ectt-0800'> </span><span id='textcolor4136'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EFAULT;</span>
|
|
|
+<a id='x1-70379r175'></a><span class='ecrm-0500'>175</span><span class='ectt-0800'> </span><span id='textcolor4137'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (copy_from_user(command, buffer, length))</span>
|
|
|
+<a id='x1-70381r176'></a><span class='ecrm-0500'>176</span><span class='ectt-0800'> </span><span id='textcolor4138'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EFAULT;</span>
|
|
|
<a id='x1-70383r177'></a><span class='ecrm-0500'>177</span>
|
|
|
-<a id='x1-70385r178'></a><span class='ecrm-0500'>178</span><span class='ectt-0800'> </span><span id='textcolor4137'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (strncmp(command, </span><span id='textcolor4138'><span class='ectt-0800'>"enable"</span></span><span class='ectt-0800'>, strlen(</span><span id='textcolor4139'><span class='ectt-0800'>"enable"</span></span><span class='ectt-0800'>)) == 0)</span>
|
|
|
+<a id='x1-70385r178'></a><span class='ecrm-0500'>178</span><span class='ectt-0800'> </span><span id='textcolor4139'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (strncmp(command, </span><span id='textcolor4140'><span class='ectt-0800'>"enable"</span></span><span class='ectt-0800'>, strlen(</span><span id='textcolor4141'><span class='ectt-0800'>"enable"</span></span><span class='ectt-0800'>)) == 0)</span>
|
|
|
<a id='x1-70387r179'></a><span class='ecrm-0500'>179</span><span class='ectt-0800'> static_branch_enable(&fkey);</span>
|
|
|
-<a id='x1-70389r180'></a><span class='ecrm-0500'>180</span><span class='ectt-0800'> </span><span id='textcolor4140'><span class='ectt-0800'>else</span></span><span class='ectt-0800'> </span><span id='textcolor4141'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (strncmp(command, </span><span id='textcolor4142'><span class='ectt-0800'>"disable"</span></span><span class='ectt-0800'>, strlen(</span><span id='textcolor4143'><span class='ectt-0800'>"disable"</span></span><span class='ectt-0800'>)) == 0)</span>
|
|
|
+<a id='x1-70389r180'></a><span class='ecrm-0500'>180</span><span class='ectt-0800'> </span><span id='textcolor4142'><span class='ectt-0800'>else</span></span><span class='ectt-0800'> </span><span id='textcolor4143'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (strncmp(command, </span><span id='textcolor4144'><span class='ectt-0800'>"disable"</span></span><span class='ectt-0800'>, strlen(</span><span id='textcolor4145'><span class='ectt-0800'>"disable"</span></span><span class='ectt-0800'>)) == 0)</span>
|
|
|
<a id='x1-70391r181'></a><span class='ecrm-0500'>181</span><span class='ectt-0800'> static_branch_disable(&fkey);</span>
|
|
|
-<a id='x1-70393r182'></a><span class='ecrm-0500'>182</span><span class='ectt-0800'> </span><span id='textcolor4144'><span class='ectt-0800'>else</span></span><span class='ectt-0800'> {</span>
|
|
|
-<a id='x1-70395r183'></a><span class='ecrm-0500'>183</span><span class='ectt-0800'> pr_err(</span><span id='textcolor4145'><span class='ectt-0800'>"Invalid command: %s</span></span><span id='textcolor4146'><span class='ectt-0800'>\n</span></span><span id='textcolor4147'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, command);</span>
|
|
|
-<a id='x1-70397r184'></a><span class='ecrm-0500'>184</span><span class='ectt-0800'> </span><span id='textcolor4148'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EINVAL;</span>
|
|
|
+<a id='x1-70393r182'></a><span class='ecrm-0500'>182</span><span class='ectt-0800'> </span><span id='textcolor4146'><span class='ectt-0800'>else</span></span><span class='ectt-0800'> {</span>
|
|
|
+<a id='x1-70395r183'></a><span class='ecrm-0500'>183</span><span class='ectt-0800'> pr_err(</span><span id='textcolor4147'><span class='ectt-0800'>"Invalid command: %s</span></span><span id='textcolor4148'><span class='ectt-0800'>\n</span></span><span id='textcolor4149'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, command);</span>
|
|
|
+<a id='x1-70397r184'></a><span class='ecrm-0500'>184</span><span class='ectt-0800'> </span><span id='textcolor4150'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> -EINVAL;</span>
|
|
|
<a id='x1-70399r185'></a><span class='ecrm-0500'>185</span><span class='ectt-0800'> }</span>
|
|
|
<a id='x1-70401r186'></a><span class='ecrm-0500'>186</span>
|
|
|
-<a id='x1-70403r187'></a><span class='ecrm-0500'>187</span><span class='ectt-0800'> </span><span id='textcolor4149'><span class='ectt-0800'>/* Again, return the number of input characters used. */</span></span>
|
|
|
-<a id='x1-70405r188'></a><span class='ecrm-0500'>188</span><span class='ectt-0800'> </span><span id='textcolor4150'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> length;</span>
|
|
|
+<a id='x1-70403r187'></a><span class='ecrm-0500'>187</span><span class='ectt-0800'> </span><span id='textcolor4151'><span class='ectt-0800'>/* Again, return the number of input characters used. */</span></span>
|
|
|
+<a id='x1-70405r188'></a><span class='ecrm-0500'>188</span><span class='ectt-0800'> </span><span id='textcolor4152'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> length;</span>
|
|
|
<a id='x1-70407r189'></a><span class='ecrm-0500'>189</span><span class='ectt-0800'>}</span>
|
|
|
<a id='x1-70409r190'></a><span class='ecrm-0500'>190</span>
|
|
|
<a id='x1-70411r191'></a><span class='ecrm-0500'>191</span><span class='ectt-0800'>module_init(chardev_init);</span>
|
|
|
<a id='x1-70413r192'></a><span class='ecrm-0500'>192</span><span class='ectt-0800'>module_exit(chardev_exit);</span>
|
|
|
<a id='x1-70415r193'></a><span class='ecrm-0500'>193</span>
|
|
|
-<a id='x1-70417r194'></a><span class='ecrm-0500'>194</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor4151'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
+<a id='x1-70417r194'></a><span class='ecrm-0500'>194</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor4153'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span></pre>
|
|
|
<!-- l. 2288 --><p class='indent'> To check the state of the static key, we can use the <span class='obeylines-h'><span class='verb'><span class='ectt-1000'>/dev/key_state</span></span></span>
|
|
|
interface.
|
|
|
</p><!-- l. 1 --><p class='indent'>
|