Scheduling jobs with precedence constraints on a set of identical machines to minimize the total processing time (makespan) is a fundamental problem in combinatorial optimization. In practical settings such as cloud computing, jobs are often malleable, i.e., can be processed on multiple machines simultaneously. The instantaneous processing rate of a job is a non-decreasing function of the number of machines assigned to it (we call it the processing function). Previous research has focused on practically relevant concave processing functions, which obey the law of diminishing utility and generalize the classical (non-malleable) problem. Our main result is a (2 + ε)-approximation algorithm for concave processing functions (for any ε > 0), which is the best possible under complexity theoretic assumptions. The approximation ratio improves to (1 + ε) for the interesting and practically relevant special case of power functions, i.e., pj (z) = cj·z γ.