Now that you have learned about so many areas across the gamut, we can zoom out and see how the Linux kernel prioritizes things. The following (conceptual) diagram - a superset of earlier similar diagrams - neatly sums this up:
This diagram is pretty self-explanatory, so please study it carefully.
In this lengthy section, you have learned about interrupt handling via both the top-half and bottom-half mechanisms, the reasons for them in the first place, and how they are organized and to be used by drivers. You now understand that all bottom-half mechanisms are internally implemented via softirqs; the tasklet is the primary bottom-half mechanism that you, as a driver author, have easy access to use. This, of course, does not imply you must use them – if you can get away with simply using a top-half only, or, even...