Holm began playing hockey in Huddinge IK before moving to Djurgårdens IF. He moved to Nacka HK for the 2008–09 season where he played in their under-18 and under-20 teams. Holm also made an appearance in the club's senior team in the Swedish third level league Division 1. He received more games with Nacka's senior team during the following season, while still playing in the under-20 team. Holm returned to Djurgården and their under-20 team for the 2010–11 season. Holm signed a two-year contract with Djurgården in February 2011. He was named as an extra player in the league game against Skellefteå AIK on 3 March 2011, but did not get any time on the ice. He played seven games, scoring one goal, with Djurgården in the 2011 edition of the pre-season tournament European Trophy. Holm received his first time on the ice in an Elitserien game in the league premier against HV71 on 15 September 2011. Holm scored his first Elitserien goal in the away game against Skellefteå AIK on 4 October. After six seasons within the Djurgården organization, Holm left as a free agent in signing a two-year contract with fellow SHL competitors, the Växjö Lakers on 20 April 2016. Holm played one season with the Lakers before he implemented his NHL out clause in agreeing to a one-year, entry-level contract with the Vancouver Canucks on 26 May 2017. To begin the 2017–18 season, Holm was assigned to the Canucks' American Hockey League affiliate, the Utica Comets. On February 13, 2018, Holm was recalled by the Canucks and made his NHL debut, appearing in a solitary game before returning to the Comets. On February 26, 2018, the Canucks dealt Holm at the NHL trade deadline to the Vegas Golden Knights in exchange for Brendan Leipsic. He was immediately assigned by the Golden Knight to affiliate, the Chicago Wolves of the AHL for the remainder of the season. On 17 July 2018, Holm opted to leave North America in agreeing to a one-year contract with Torpedo Nizhny Novgorod of the Kontinental Hockey League. During his lone season with the club, Holm recorded seven goals and 26 points in 61 games. He also skated in the 2019 KHL All-Star Game. On 13 August 2019, Holm made his return to North America, signing a one-year, two-way contract with the Chicago Blackhawks. Unable to secure a roster position with the Blackhawks at training camp, Holm began the 2019–20 season in the AHL with affiliate, the Rockford IceHogs. Holm made 30 appearances with Rockford, registering 4 goals and 15 points, before opting to mutually terminate his contract with the Blackhawks in order to resume his European career. On 7 January 2020, Holm joined Lausanne HC of the National League on a one-year deal through the remainder of the 2019–20 season. He was brought in as a replacement for struggling fellow countryman, Jonas Junland.