Faits: A. Par contrat de bail du 12 décembre 1986, A._ et B._ (locataires) ont pris en location une place de parc pour voiture automobile à l'extérieur d'un immeuble locatif sis à Genève et appartenant à la société immobilière X._ SA (bailleresse); ils ont également loué un appartement dans le même immeuble. Le loyer de la place de parc était à l'origine de 816 fr. par année; il a été porté à 996 fr. dès le 1er janvier 1992. B. Par avis de majoration du 16 septembre 2008, la bailleresse a déclaré porter le loyer annuel de la place de parc à 1'800 fr. dès le 1er janvier 2009 en adaptation aux loyers usuels pratiqués dans le quartier. La bailleresse a également notifié aux locataires un avis de majoration pour le loyer relatif à l'appartement. Les locataires ont contesté les hausses en temps utile devant la Commission de conciliation en matière de baux à loyer. La bailleresse a saisi le Tribunal des baux et loyers d'une requête en validation de la hausse du loyer afférent à la place de parc. La requête a été déclarée irrecevable par jugement du 3 juin 2009. L'appel de la bailleresse a été rejeté. C. Par avis officiel de majoration du 18 juin 2009, la bailleresse a déclaré porter le loyer annuel pour la place de parc à 2'160 fr. dès le 1er janvier 2010. Elle a précisé que le loyer passait de 83 fr. à 180 fr. par mois parce qu'il n'avait pas été augmenté depuis dix-sept ans, que les dernières places de parc louées dans l'immeuble l'avaient été au montant de 180 fr. par mois, et qu'à titre comparatif, une place dans un parking situé à quatre minutes à pied coûtait 330 fr. par mois; elle a ajouté que l'État de Genève proposait des places à 475 fr. par mois au centre de la ville et à 220 fr. par mois en ville. Les locataires ont contesté la hausse devant l'autorité de conciliation sans qu'un arrangement puisse être trouvé. La bailleresse a saisi le Tribunal des baux et loyers en validation de la hausse. A titre reconventionnel, les locataires ont demandé une réduction de loyer de 25% ensuite de la baisse du taux hypothécaire de 6,75% en décembre 1991 à 3,25% en juin 2009. Statuant par jugement du 27 avril 2010 notifié aux parties le 4 mai 2010, le Tribunal a débouté la bailleresse de ses conclusions en validation de la hausse de loyer au motif qu'elle n'avait pas fourni d'exemples comparatifs en nombre suffisant; il a en revanche admis que la baisse du taux hypothécaire justifiait une réduction de loyer de 27,01%, de sorte que les conclusions des locataires demandant une baisse de 25% étaient légitimes. Le Tribunal a dès lors fixé le loyer de la place de parc à 797 fr. par an (soit 66 fr. 40 par mois) dès le 1er janvier 2010. La bailleresse a interjeté appel. Par arrêt du 17 octobre 2011, la Chambre des baux et loyers de la Cour de justice s'est ralliée aux motifs des premiers juges et a rejeté l'appel. D. Devant le Tribunal fédéral, la bailleresse (ci-après: la recourante) interjette un recours en matière civile tendant à faire valider la hausse de loyer à 180 fr. par mois dès le 1er janvier 2010 et à faire annuler la baisse de loyer accordée aux locataires (ci-après: les intimés). Ces derniers concluent au rejet du recours. L'autorité précédente se réfère à son arrêt. Les deux parties ont par la suite déposé des observations supplémentaires. La présidente de la cour de céans a accordé l'effet suspensif par ordonnance du 1er décembre 2011.