xref: /openbmc/linux/include/linux/cgroup_refcnt.h (revision 79a7f41f)
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 Heo void 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 Heo CGROUP_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 Heo CGROUP_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 Heo CGROUP_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 Heo CGROUP_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 Heo CGROUP_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