This is an old revision of the document!
This is a list of tasks for beginners that should take few evening to complete.
Looking for the same type of page - but for ports? Look at WantedPorts
What about other ideas? Look at IdeasPage
General kernel work hints
- boot stuff in a vm. virtualbox and bhyve are nice options.
- always build the kernel with debugging options enabled. head kernels have most important options enabled by default, you can read more here.
- make sure your patches adhere to style(9). Of course you can violate it when it makes sense, but it most likely does not, so you typically don't want to do that.
How to submit patches
Mail technical contact and inline the patch (don't attach, have it as a part of the mail). It may be your e-mail client or something along the way will mess with the patch, so consider providing an url as a backup. The patch should be against head and in unified format (diff -u, git diff, svn diff etc.).
Kernel projects
Free old file descriptor tables
Technical Contact: MateuszGuzik
Difficulty
Easy
Description
File descriptor tables can be shared between multiple processes (see fdshare).
The kernel performs lockless file descriptor lookup, but file descriptor table can be reallocated by fdgrowtable at any time. To deal with this problem old tables are kept around until all processes possibly using them exit.
However, we can safely free the old table if given process has only one thread and the table is not shared.
Implement freeing such tables and submit a test program showing that it works.
Requirements
- C language programming skills.
Rework functions allocating credentials
Technical Contact: MateuszGuzik
Difficulty
Easy
Description
Credentials are copy-on-write, i.e. once assigned to a process are never modified. Allocation of new credentials involved allocating one buffer for struct ucred and second one for groups. Then, if old creds have more groups than the default, we have to reallocate group buffer. crget and the like can be extended to accept old credentials as an argument and derive expected number of groups from that.
Groups in credentials are always stored sorted. But the function used to store groups always sorts them. even though we can tell they have to be sorted already.
Rework the code to be more efficient and not do unnecessary work.
Requirements
- C language programming skills.
Various kernel man pages needed
Technical Contact: JohnMarkGurney
Difficulty
Easy
Description
Add missing man pages for parts of the FreeBSD kernel. Currently known missing:
- PCPU stuff: DPCPU_* dpcpu_* PCPU_*
- sched_*
- if_*, like if_setdrvflagbits and many other in if_var.h
- cold (the variable that denotes pre/post interrupts) and maybe other items in sys/systm.h
- cn* (sys/cons.h), such as cnputs
- ppsratecheck
- sys/param.h/cdefs.h helper functions like: powerof2, nitems, setbit, member2struct, <underbar><underbar>offsetof,
- drivers: cesa, glxsb, sec, cryptocteon, nlmsec, rmisec
- device pager: cdev_pager_allocate, mmap_single, vm_pager_allocate
- FEATURE (macro that adds kern.features)
- tty_makedev and friends
- m_ether_tcpip_hash*
- sbuf_uionew
- cdevsw structure
- calculate_crc32c, crc32
- DIOCG* ioctls from sys/disk.h
- Document which standard libc functions are available in the kernel
In addition, please refer to the wiki article on missing manpages.
Requirements
- minimal C language programming skills.
- Ability to read/write mdoc(7), though jmg@ is willing to help w/ mark up.
pf: TOS matching/setting for IPv6
Technical Contact: KristofProvost
Difficulty
Easy
Description
pf can filter on and set TOS bits for IPv4. This should be extended, using the same keywords, to also work on IPv6. The code can be ported from OpenBSD.
Requirements
- minimal C language programming skills.
- A basic understanding of IPv4/IPv6
User space projects
Improve Test Coverage
Technical Contact: JohnMarkGurney
Difficulty
Easy
Description
Implement additional tests. Currently known missing:
- implement missing sbuf tests, sbuf_core_test.c has a few tests that are if 0'd out at the end of the file
You can look at the atf-c(3) manpage for info on writing tests.
Requirements
- basic C language programming skills.
Tidy up some ELF toolchain loose ends
Technical Contact: EdMaste
Difficulty
Medium
Description
We've migrated to using the ELF toolchain version of tools like size, strip, nm, etc. Some of the ELF toolchain tools are derivatives of tools that first appeared in the FreeBSD tree, and others are new. There are a few remaining tasks in the ELF toolchain project.
- Identify differences between the ELF toolchain and FreeBSD versions of ar/ranlib and elfdump. Either incorporate ELF toolchain changes into FreeBSD, or incorporate the FreeBSD changes into ELF toolchain, and switch to using the ELF toolchain source from contrib/
- Identify missing functionality relative to contemporary GNU Binutils and implement equivalent functionality in ELF toolchain.
Requirements
- Knowledge of C
- Knowledge of the ELF format
Various man page improvements
Technical Contact: JohnMarkGurney
Difficulty
Easy
Description
Add or improve man pages:
- intro(3) is missing MANY libraries that are now common
- libc(3) is missing, include reference and places for notable additions, and standards compliance
- timespec, sbintime_t and various sys/time.h are not documented.
In addition, please refer to the wiki article on missing manpages.
Requirements
- minimal C language programming skills.
- Ability to read/write mdoc(7), though jmg@ is willing to help w/ mark up.
Build projects
Past projects
Validate coredump format string
Technical Contact: MateuszGuzik Valid patch received.
Difficulty
Easy
Description
The pattern can be set with the kern.corefile sysctl. No validation is performed.
However, errors are detected during traversal.
Modify the code so that it validates the pattern prior to accepting it.
Convert mountlist_mtx to rwlock
Technical Contact: MateuszGuzik Valid patch received.
Difficulty
Easy
Description
Self-explanatory.
Rename it to mountlist_lock.
Note that mountlist is rarely modified and even shared locking with rwlocks introduces overhead. Interested person can upgrade this task to non-junior by coming up with a solution exploiting rare need to modify the list. Example approaches include designing a locking primitive with cheap shared locking (think: per-cpu) at the expense of exclusive locking.
Requirements
- C language programming skills.
Fix corefilename race
Technical Contact: MateuszGuzik
Committed as r280312.
Difficulty
Easy
Description
The kernel keeps core file pattern in corefilename array. It can be modified at any time, including when it is being accessed to generate core names.
Fix the problem.
sysctl reporting current working directory
Technical Contact: MateuszGuzik
Committed as r274167.
Difficulty
Medium
Description
Right now current working directory of a differnent process can be obtained with kern.proc.filedesc sysctl. But it also returns the list of open file descriptors which adds a lot of overhead if the list is long (e.g. 10k entries). One frequent user of this sysctl is tmux which wants current working directory of various processes, but has to obtain the whole list.
Add a sysctl which returns only current working directory or all special entries (see procstat -f output for the list), but no files.
Provide an example patch for tmux utilizing this new functionality.
Requirements
- C language programming skills.
Embedd group table into struct ucred
Technical Contact: MateuszGuzik
Committed as r274122.
Difficulty
Easy
Description
Each instance of strut ucred has a pointer to a table with groups. Current size of struct ucred is 160 bytes, while it occupies space in 256-byte slab (i.e. we waste almost 100 bytes). On the other hand default group limit is 16 which gives 64 byte allocated from 64-byte slab.
Extend struct ucred with gid_t table of XU_NGROUPS elements and use it unless a bigger size is requested, in which case allocate memory just like current code does.
Temporary buffer in setgroups
Technical Contact: MateuszGuzik
Committed as r273684.
Difficulty
Easy
Description
Currently setgroups always allocates a temporary buffer. But most callers will provide small number of groups and for such cases a buffer on the stack will work just fine. Provide a temporary buffer capable of holding XU_NGROUPS groups and update the code to use it when appropriate. See sys_poll implementation in kern/sys_generic.c for an example of this approach.
A harder solution would be to pass it down to kern_getgroups which allocates memory anyway and copyin directly to new cred buffer.
Requirements
- C language programming skills.
Replace loginclass mutex with rwlock
Technical Contact: MateuszGuzik
Committed as r273763.
Difficulty
Medium
Description
kern/kern_loginclass.c uses a mutex, even though rwlocks seem to be more suitable. While here update loginclass_find to lookup first and only allocated when needed, but beware of typical races. See uifind in kern/kern_resource.c for an idea how it should look like.
Requirements
- C language programming skills.