8395
Comment: Add mlock coding task
|
6841
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from IIO cleanup | = Welcome to IIO tasks page = |
Line 3: | Line 3: |
These tasks are for you to get familiar with the IIO subsystem. You do not need to claim these via the Outreachy tasks page. | This page is dedicated to students applying for GSoC/Outreachy programs. |
Line 5: | Line 5: |
Please post all questions to outreachy-kernel@googlegroups.com. IIO mentors and other applicants will respond on the list and it will serve as a troubleshooting resource for all applicants. | It also aims to help newcomers getting started with the Industrial IO subsystem, offering pointers to documentation and small tasks. |
Line 7: | Line 7: |
You can also join #linux-iio IRC channel (server irc.oftc.net) to ask questions of the IIO community. | For GSoC/Outreachy students: |
Line 9: | Line 9: |
Please email your solutions to amsfield22 at gmail dot com and daniel.baluta at gmail dot com. Your email should have the subject '''Task XX: Short task description''' |
Please use a single email thread for communication. During the application always reply to this thread if you have a question or sending the solution for a task. The email should have the following format: subject: GSoC IIO project: Your Name body: <short description of content: e.g Task 01 / Question about the schedule / etc> <the actual email body> |
Line 16: | Line 23: |
* {{{iio_dummy_evgen.ko}}} - generates ''fake'' events interrupts to be used by the {{{iio_dummy}}} example driver * implementation for this module is in {{{iio_dummy_evgen.c}}} |
|
Line 22: | Line 27: |
* {{{iio_dummy_evgen.ko}}} - generates ''fake'' events interrupts to be used by the {{{iio_dummy}}} example driver * implementation for this module is in {{{iio_dummy_evgen.c}}} |
|
Line 26: | Line 33: |
* {{{CONFIG_IIO_DUMMY_EVGEN}}} - for building {{{iio_dummy_evgen}}} kernel module | * {{{CONFIG_IIO_CONFIGFS}}} - for creating the dummy device under configfs |
Line 29: | Line 36: |
* {{{CONFIG_IIO_CONFIGFS}}} - for creating the dummy device under configfs |
* {{{CONFIG_IIO_DUMMY_EVGEN}}} - for building {{{iio_dummy_evgen}}} kernel module |
Line 45: | Line 51: |
* Show that config options for IIO dummy modules were correctly selected * send the content of the following command grep IIO .config |
|
Line 46: | Line 54: |
Task 02: | |
Line 52: | Line 61: |
Task 02: |
Task 03: |
Line 59: | Line 67: |
Line 70: | Line 77: |
IIO event monitor is an user space example application which reads events from IIO layer and pretty prints the results. Implementation can be found in {{{iio_event_monitor.c}}} under {{{tools/iio/}}}. [[BR]] | IIO event monitor is an user space example application which reads events from IIO layer and pretty prints the results. Implementation can be found in {{{iio_event_monitor.c}}} under {{{tools/iio/}}}. <<BR>> |
Line 72: | Line 79: |
Task 03: | Task 04: |
Line 79: | Line 86: |
Task 04: | Task 05: |
Line 90: | Line 97: |
Task 05: | Task 06: |
Line 93: | Line 100: |
* read Documentation/iio/iio_configfs.txt in order to create a software trigger named t1. | * read Documentation/iio/iio_configfs.txt in order to create an hrtimer software trigger named t1. |
Line 97: | Line 104: |
Task 06: | Task 07: |
Line 104: | Line 111: |
Line 107: | Line 113: |
Note for all IIO Coding Tasks: * Please use the task page to claim the driver you are going to patch. * Please 'CC outreachy-kernel@googlegroups.com on all questions related to this so everyone can benefit. |
== Coding Task 1: (easy) == |
Line 111: | Line 115: |
== Coding Task 1: == | Send 2 cleanup patches to the linux kernel. |
Line 113: | Line 117: |
Clean-up idea: IIO Headers: This was previously posted to the outreachy-kernel@googlegroups.com | Important: |
Line 115: | Line 119: |
See description and follow-ups here: https://groups.google.com/forum/#!topic/outreachy-kernel/LtI90_SwjHE | * patches should be for code in drivers/staging/ * use tools like checkpatch.pl, sparse or coccinelle to find cleanups. |
Line 117: | Line 122: |
I believe this task is completed or close to being completed. If you find a driver which you think applies here, be sure to serach for it in the outreachy group mailing list to see if it has already been done or disregarded. | Useful links: * [[https://kernelnewbies.org/Outreachyfirstpatch | Outreachy First Patch]] * [[https://www.youtube.com/watch?v=LLBrBBImJt4 | Greg KH presentation - Send your first patch]] |
Line 119: | Line 126: |
== Coding Task 2: == Coding Task 2: Replace driver usages of mlock with a private lock |
== Coding Task 2: (hard) == |
Line 122: | Line 128: |
===== Background: ===== | drivers/staging directory is the place where drivers that aren't yet fit to be merged into the main portion of the kernel for various reasons: code quality, non standard interfaces, etc. Grab a driver from drivers/staging/iio and try to move it into drivers/iio. |
Line 124: | Line 130: |
The locking scheme in the IIO subsystem includes a lock in the iio_dev structure called mlock. The usage of iio_dev->mlock is being redefined as protecting operating mode changes - as in changes between BUFFER* and DIRECT modes. |
Important: |
Line 129: | Line 132: |
Notice how the struct iio_dev fields are labelled [INTERN] or [DRIVER]. The mlock will revert to an [INTERN] field once all the non-conforming usages are removed from drivers. The IIO core functions in (drivers/iio/industrialio-*.c) will be the only users of mlock. Drivers will use helper functions to control operating mode changes. |
* read IIO documentation and try to understand why the driver you picked is not yet ready to be merged into drivers/iio. * send an email to linux-iio mailing list with your idea for changes to be done in order to move the driver out of staging |
Line 135: | Line 135: |
That's a bunch of background that you don't need to totally grasp to do this task, but it's nice to see the bigger picture. |
== Coding Task 3 == |
Line 138: | Line 137: |
The piece of the migration this task focuses on is removing the usages of mlock that don't meet the new model. I suspect we'll find that these drivers were using mlock as it was previously defined: "to protect simultaneous device *state* changes." Typically this means they are changing some configuration bits in the hardware. Those changes are important to protect, just do it with a driver private lock, not mlock. |
Each driver that supports both SPI and I2C has the following structure: * common part * I2C part * SPI part |
Line 145: | Line 142: |
===== PATCH Example: ===== | It seems that there is a lot of duplicate/similar code for I2C/SPI parts. Have a look at the following drivers: * drivers/iio/accel/mma7455_{core,spi,i2c}.c * drivers/iio/pressure/st_pressure{core,spi,i2c}.c * drivers/iio/magnetometer/hmc5843{core,spi,i2c}.c |
Line 147: | Line 147: |
Review this recently submitted patch: staging: iio: ad9832: replace mlock with driver private lock https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git/commit/?h=testing&id=388c8f18ff29fe95dbf72cb0a1bd8fbcd6f52f8f |
We want to create a common framework for I2C/SPI parts and reuse it for each driver to avoid code duplication. |
Line 151: | Line 149: |
This is probably the simplest case patch for this task. I want to emphasize simple, because I did pass over a few others on my way to creating an example patch. I saved the more interesting drivers for you ;) |
Important: |
Line 155: | Line 151: |
You may uncover issues with the usage or placement of locks in general. | * before starting writing the code send an email to linux-iio list presenting your idea on how do you want to solve this in order to get some feedback. |
Line 157: | Line 154: |
Your reviewer may notice other things that need tidying up. If they're not immediately required for this patch, save it for a follow up patch. |
= Resources = |
Line 160: | Line 156: |
===== The Directions: ===== | * [[http://vger.kernel.org/vger-lists.html#linux-iio | linux-iio]] mailing list. * [[https://www.kernel.org/doc/html/v4.12/driver-api/iio/index.html | IIO documentation]] * [[https://events.static.linuxfound.org/sites/events/files/slides/lceu15_baluta.pdf | IIO presentation] |
Line 162: | Line 160: |
Your mission is to remove the usage of mlock from the IIO drivers in staging. A simple 'git grep mlock' finds the drivers and I've posted that list on the Outreachy tasks page. Please sign up for one driver at a time, take it all the way through ACK, before selecting another one. Be sure to follow along as these are posted and learn from others patches. ===== PATCHES need to be sent to all of: ===== outreachy-kernel@googlegroups.com, the IIO Maintainer, IIO Reviewers, and IIO Mailing List, Jonathan Cameron <jic23@kernel.org> (maintainer:IIO SUBSYSTEM AND DRIVERS) Hartmut Knaack <knaack.h@gmx.de> (reviewer:IIO SUBSYSTEM AND DRIVERS) Lars-Peter Clausen <lars@metafoo.de> (reviewer:IIO SUBSYSTEM AND DRIVERS) Peter Meerwald <pmeerw@pmeerw.net> (reviewer:IIO SUBSYSTEM AND DRIVERS) linux-iio@vger.kernel.org (open list:IIO SUBSYSTEM AND DRIVERS) and, for good measure, Jonathan likes to make sure the original Author(s) are directly copied on all patches. So, grab the MODULE_AUTHOR found at the tail end of the driver source. Post questions to outreachy-kernel@googlegroups.com or the #linux-iio IRC channel (server irc.oftc.net). |
For questions please send questions in the format mentioned above to daniel.baluta at nxp dot com or the #linux-iio IRC channel (server irc.oftc.net). |
Welcome to IIO tasks page
This page is dedicated to students applying for GSoC/Outreachy programs.
It also aims to help newcomers getting started with the Industrial IO subsystem, offering pointers to documentation and small tasks.
For GSoC/Outreachy students:
Please use a single email thread for communication. During the application always reply to this thread if you have a question or sending the solution for a task. The email should have the following format:
subject: GSoC IIO project: Your Name
body: <short description of content: e.g Task 01 / Question about the schedule / etc> <the actual email body>
Experimenting with IIO subsystem
For this we will use two kernel modules found in drivers/iio/dummy:
iio_dummy.ko - example IIO driver to demonstrate existing functionality
core implementation can be found in iio_simple_dummy.c
buffer functionality is implemented in iio_simple_dummy_buffer.c
events functionality is implemented in iio_simple_dummy_events.c
iio_dummy_evgen.ko - generates fake events interrupts to be used by the iio_dummy example driver
implementation for this module is in iio_dummy_evgen.c
Dummy modules compilation
You need to select the following config options:
CONFIG_IIO_CONFIGFS - for creating the dummy device under configfs
CONFIG_IIO_SIMPLE_DUMMY - for building iio_dummy kernel module
CONFIG_IIO_SIMPLE_DUMMY_EVENTS, CONFIG_IIO_SIMPLE_DUMMY_BUFFER should be selected for events and buffer functionality.
CONFIG_IIO_DUMMY_EVGEN - for building iio_dummy_evgen kernel module
- Mount the configfs filesystem: read Documentation/iio/iio_configfs.txt
Use the following commands for modules compilation:
$ make drivers/iio/dummy/iio_dummy_evgen.ko
$ make drivers/iio/dummy/iio_dummy.ko
Use the following commands for module loading:
$ insmod iio_dummy_evgen.ko
$ insmod iio_dummy.ko
Use the following command to create your dummy device under the configfs filesystem:
$ mkdir /config/iio/devices/dummy/my_dummy_device
Task 01:
- Show that config options for IIO dummy modules were correctly selected
- send the content of the following command grep IIO .config
Task 02:
- Show that the modules were successfully loaded.
- lsmod | grep dummy
- ls -l /config/iio/devices/dummy/
- ls -l /sys/bus/iio/devices/iio:device0/
- ls -l /sys/bus/iio/devices/iio_evgen/
Task 03:
- Add channels for a 3-axis compass to iio_simple_dummy module.
- Show that channels were successfully added
- ls -l /sys/bus/iio/devices/iio:device0/
- ls -l /sys/bus/iio/devices/iio:device0/scan_elements
- create a patch with your changes
Hints:
- channel type for a compass is IIO_MAGN
- users should be able to read raw readings from each axis
- users should be able to read a shared scale
- users should be able to access data via a buffer
- data is unsigned, resolution is 16 bits, storage is 16 bits
- compass doesn't support events
IIO event monitor
IIO event monitor is an user space example application which reads events from IIO layer and pretty prints the results. Implementation can be found in iio_event_monitor.c under tools/iio/.
Task 04:
Compile iio_event_monitor:
compile iio_event_monitor.c to obtain an executable called iio_event_monitor.
- send us the command(s) used to successfully compile iio_event_monitor.c
Task 05:
Read events using iio_event_monitor
- run iio_event_monitor without arguments to figure out how it should be used
- read events from iio_dummy module
Hints
- Events are generated by iio_dummy_evgen via sysfs (look inside /sys/bus/iio/devices/iio_evgen/)
- send us the commands used to read/generate the events
Generic buffer
Task 06:
Create triggers using configfs interface.
- read Documentation/iio/iio_configfs.txt in order to create an hrtimer software trigger named t1.
- where in the sysfs hierarchy does the trigger resides?
- sends us the commands used to create the trigger
Task 07:
Read samples from buffer generated by the iio_dummy module.
- compile iio_generic_buffer.c from tools/iio. This program will be used to read data from buffer.
have a look at ./iio_generic_buffer -h options. You will use the trigger t1 created with the previous tasks and iio_dummy_part_no for IIO device.
- send us the full command history
Coding Tasks
Coding Task 1: (easy)
Send 2 cleanup patches to the linux kernel.
Important:
- patches should be for code in drivers/staging/
- use tools like checkpatch.pl, sparse or coccinelle to find cleanups.
Useful links:
Coding Task 2: (hard)
drivers/staging directory is the place where drivers that aren't yet fit to be merged into the main portion of the kernel for various reasons: code quality, non standard interfaces, etc. Grab a driver from drivers/staging/iio and try to move it into drivers/iio.
Important:
- read IIO documentation and try to understand why the driver you picked is not yet ready to be merged into drivers/iio.
- send an email to linux-iio mailing list with your idea for changes to be done in order to move the driver out of staging
Coding Task 3
Each driver that supports both SPI and I2C has the following structure:
- common part
- I2C part
- SPI part
It seems that there is a lot of duplicate/similar code for I2C/SPI parts. Have a look at the following drivers:
- drivers/iio/accel/mma7455_{core,spi,i2c}.c
- drivers/iio/pressure/st_pressure{core,spi,i2c}.c
- drivers/iio/magnetometer/hmc5843{core,spi,i2c}.c
We want to create a common framework for I2C/SPI parts and reuse it for each driver to avoid code duplication.
Important:
* before starting writing the code send an email to linux-iio list presenting your idea on how do you want to solve this in order to get some feedback.
Resources
linux-iio mailing list.
[[https://events.static.linuxfound.org/sites/events/files/slides/lceu15_baluta.pdf | IIO presentation]
For questions please send questions in the format mentioned above to daniel.baluta at nxp dot com or the #linux-iio IRC channel (server irc.oftc.net).