Linearizability of concurrent data structure implementationsis notoriously hard to prove. Consequently, currentverification techniques can only prove linearizability for certainclasses of data structures. We introduce a generic, sound, andpractical technique to statically check the linearizability of concurrentdata structure implementations. Our technique involvesspecifying the concurrent operations as a list of sub-operationsand passing this specification on to an automated checker thatverifies linearizability using relationships between individual sub-operations. We have proven the soundness of our technique. Ourapproach is expressive: we have successfully verified the linearizabilityof 12 popular concurrent data structure implementationsincluding algorithms that are considered to be challenging toprove linearizable such as elimination back-off stack, lazy linkedlist, and time-stamped stack. Our checker is effective, as it canverify the specifications in less than a second.