Olsson è nato a Landskrona e ha debuttato nel 2003 con la prima squadra del locale club del Landskrona BoIS, che all'epoca militava in Allsvenskan.
Per due anni e mezzo ha giocato nel massimo campionato svedese, fino all'estate del 2005 quando è stato ceduto agli olandesi del NEC Nijmegen in cambio di 750.000 euro nonostante il parere negativo dell'allenatore del Landskrona, impegnato nella lotta per non retrocedere.[1]
Al primo anno in Olanda è stato schierato in tutte e 40 le partite ufficiali giocate dalla sua squadra tra campionato, coppa nazionale e play-off per accedere all'Intertoto. Al termine della stagione 2006-2007 ha ottenuto il riconoscimento di giocatore dell'anno dai tifosi del NEC.[2] Nel corso del campionato 2007-2008 è stato accostato più volte a squadre inglesi, tanto da essere ceduto a fine stagione: nell'ultima partita disputata davanti al proprio pubblico (NEC-NAC Breda 6-0, play-off per l'Intertoto) Olsson ha segnato la prima doppietta in carriera.[3]
Il 29 agosto 2008 il West Bromwich Albion ha confermato di aver acquistato il difensore svedese per 800.000 sterline, più eventuali 360.000 di bonus. Il 13 settembre 2008 ha debuttato in Premier League partendo titolare contro il West Ham. A fine mese ha realizzato il suo primo gol inglese, che ha permesso di espugnare il campo del Middlesbrough.[4] Nell'ottobre del 2009 ha firmato un rinnovo quadriennale, continuando nel frattempo a giocare titolare al centro della difesa. Tra l'ottobre 2010 e il gennaio 2011 ha dovuto fermarsi a causa di un infortunio al tendine di Achille.[5] Il 6 ottobre 2012 Olsson ha firmato un nuovo contratto di quattro anni con il club reduce dal buon decimo posto dell'anno precedente. Nel novembre 2014 ha dovuto operarsi per un nuovo problema al tendine di Achille, rientrando qualche settimana dopo.[6] Nel marzo 2017 Olsson e il WBA hanno rescisso di comune accordo, chiudendo una parentesi durata quasi 9 anni, durante i quali il giocatore ha collezionato più di 200 presenze. Come ringraziamento, il club inglese si è offerto di pagargli comunque lo stipendio fino a giugno.[7]
Il trentaquattrenne Olsson è tornato così in Svezia per accasarsi al Djurgården, dove ha ritrovato gli esperti ex compagni di nazionale Kim Källström e Andreas Isaksson,[8] poi ritiratosi entrambi a fine stagione. Quell'anno la squadra è tornata a qualificarsi per le coppe europee da cui mancava da 10 anni. In vista della stagione 2018, Olsson è stato nominato nuovo capitano.[9] Ad aprile ha alzato la Coppa di Svezia 2017-2018, ma la restante parte di stagione non si è rivelata particolarmente positiva per il club,[10] al punto che lo stesso Olsson ha deciso di lasciare il Djurgården a fine anno, meditando anche di ritirarsi dal calcio giocato.[11]
Nonostante il pensiero di appendere le scarpe al chiodo, il 1º febbraio 2019 è stato annunciato fino alla successiva estate come nuovo difensore del Wigan, formazione impegnata nella Championship inglese.[12] A fine campionato non ha ottenuto il rinnovo contrattuale.[13]
Il 20 settembre 2019, attraverso un post su Instagram, ha annunciato il proprio ritiro dal calcio giocato.[14]
Nazionale
Ha giocato 19 partite con l'Under-21 svedese e 25 con la Nazionale maggiore, con cui ha anche partecipato agli Europei 2012.