16ab42860STejun Heo /** 26ab42860STejun Heo * css_get - obtain a reference on the specified css 36ab42860STejun Heo * @css: target css 46ab42860STejun Heo * 56ab42860STejun Heo * The caller must already have a reference. 66ab42860STejun Heo */ 76ab42860STejun Heo CGROUP_REF_FN_ATTRS css_get(struct cgroup_subsys_state * css)86ab42860STejun Heovoid css_get(struct cgroup_subsys_state *css) 96ab42860STejun Heo { 106ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 116ab42860STejun Heo percpu_ref_get(&css->refcnt); 126ab42860STejun Heo } CGROUP_REF_EXPORT(css_get)13*79a7f41fSTejun HeoCGROUP_REF_EXPORT(css_get) 146ab42860STejun Heo 156ab42860STejun Heo /** 166ab42860STejun Heo * css_get_many - obtain references on the specified css 176ab42860STejun Heo * @css: target css 186ab42860STejun Heo * @n: number of references to get 196ab42860STejun Heo * 206ab42860STejun Heo * The caller must already have a reference. 216ab42860STejun Heo */ 226ab42860STejun Heo CGROUP_REF_FN_ATTRS 236ab42860STejun Heo void css_get_many(struct cgroup_subsys_state *css, unsigned int n) 246ab42860STejun Heo { 256ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 266ab42860STejun Heo percpu_ref_get_many(&css->refcnt, n); 276ab42860STejun Heo } CGROUP_REF_EXPORT(css_get_many)28*79a7f41fSTejun HeoCGROUP_REF_EXPORT(css_get_many) 296ab42860STejun Heo 306ab42860STejun Heo /** 316ab42860STejun Heo * css_tryget - try to obtain a reference on the specified css 326ab42860STejun Heo * @css: target css 336ab42860STejun Heo * 346ab42860STejun Heo * Obtain a reference on @css unless it already has reached zero and is 356ab42860STejun Heo * being released. This function doesn't care whether @css is on or 366ab42860STejun Heo * offline. The caller naturally needs to ensure that @css is accessible 376ab42860STejun Heo * but doesn't have to be holding a reference on it - IOW, RCU protected 386ab42860STejun Heo * access is good enough for this function. Returns %true if a reference 396ab42860STejun Heo * count was successfully obtained; %false otherwise. 406ab42860STejun Heo */ 416ab42860STejun Heo CGROUP_REF_FN_ATTRS 426ab42860STejun Heo bool css_tryget(struct cgroup_subsys_state *css) 436ab42860STejun Heo { 446ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 456ab42860STejun Heo return percpu_ref_tryget(&css->refcnt); 466ab42860STejun Heo return true; 476ab42860STejun Heo } CGROUP_REF_EXPORT(css_tryget)48*79a7f41fSTejun HeoCGROUP_REF_EXPORT(css_tryget) 496ab42860STejun Heo 506ab42860STejun Heo /** 516ab42860STejun Heo * css_tryget_online - try to obtain a reference on the specified css if online 526ab42860STejun Heo * @css: target css 536ab42860STejun Heo * 546ab42860STejun Heo * Obtain a reference on @css if it's online. The caller naturally needs 556ab42860STejun Heo * to ensure that @css is accessible but doesn't have to be holding a 566ab42860STejun Heo * reference on it - IOW, RCU protected access is good enough for this 576ab42860STejun Heo * function. Returns %true if a reference count was successfully obtained; 586ab42860STejun Heo * %false otherwise. 596ab42860STejun Heo */ 606ab42860STejun Heo CGROUP_REF_FN_ATTRS 616ab42860STejun Heo bool css_tryget_online(struct cgroup_subsys_state *css) 626ab42860STejun Heo { 636ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 646ab42860STejun Heo return percpu_ref_tryget_live(&css->refcnt); 656ab42860STejun Heo return true; 666ab42860STejun Heo } CGROUP_REF_EXPORT(css_tryget_online)67*79a7f41fSTejun HeoCGROUP_REF_EXPORT(css_tryget_online) 686ab42860STejun Heo 696ab42860STejun Heo /** 706ab42860STejun Heo * css_put - put a css reference 716ab42860STejun Heo * @css: target css 726ab42860STejun Heo * 736ab42860STejun Heo * Put a reference obtained via css_get() and css_tryget_online(). 746ab42860STejun Heo */ 756ab42860STejun Heo CGROUP_REF_FN_ATTRS 766ab42860STejun Heo void css_put(struct cgroup_subsys_state *css) 776ab42860STejun Heo { 786ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 796ab42860STejun Heo percpu_ref_put(&css->refcnt); 806ab42860STejun Heo } CGROUP_REF_EXPORT(css_put)81*79a7f41fSTejun HeoCGROUP_REF_EXPORT(css_put) 826ab42860STejun Heo 836ab42860STejun Heo /** 846ab42860STejun Heo * css_put_many - put css references 856ab42860STejun Heo * @css: target css 866ab42860STejun Heo * @n: number of references to put 876ab42860STejun Heo * 886ab42860STejun Heo * Put references obtained via css_get() and css_tryget_online(). 896ab42860STejun Heo */ 906ab42860STejun Heo CGROUP_REF_FN_ATTRS 916ab42860STejun Heo void css_put_many(struct cgroup_subsys_state *css, unsigned int n) 926ab42860STejun Heo { 936ab42860STejun Heo if (!(css->flags & CSS_NO_REF)) 946ab42860STejun Heo percpu_ref_put_many(&css->refcnt, n); 956ab42860STejun Heo } 96*79a7f41fSTejun Heo CGROUP_REF_EXPORT(css_put_many) 97